notistack#SnackbarKey TypeScript Examples
The following examples show how to use
notistack#SnackbarKey.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Actions.ts From Teyvat.moe with GNU General Public License v3.0 | 5 votes |
dismissNotification = createAction<SnackbarKey>(
`${REDUX_SLICE_NOTIFY}/dismissNotification`
)
Example #2
Source File: Actions.ts From Teyvat.moe with GNU General Public License v3.0 | 5 votes |
removeNotification = createAction<SnackbarKey>(
`${REDUX_SLICE_NOTIFY}/removeNotification`
)
Example #3
Source File: Dispatch.ts From Teyvat.moe with GNU General Public License v3.0 | 5 votes |
dispatchDismissNotification = (snackbarKey: SnackbarKey): void => {
dispatchAction(dismissNotification(snackbarKey));
}
Example #4
Source File: Dispatch.ts From Teyvat.moe with GNU General Public License v3.0 | 5 votes |
dispatchRemoveNotification = (snackbarKey: SnackbarKey): void => {
dispatchAction(removeNotification(snackbarKey));
}
Example #5
Source File: NotificationProvider.tsx From Teyvat.moe with GNU General Public License v3.0 | 5 votes |
NotificationHandler: FunctionComponent = () => {
const notifications = useSelector(selectNotifications);
const dispatch = useDispatch();
/**
* The functions which link with the NotificationProvider
* to enqueue and dequeue the notifications.
*/
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
/**
* The keys of the notifications which have already been enqueued for display.
*/
const [currentlyDisplayed, setCurrentlyDisplayed] = useState<SnackbarKey[]>([]);
useEffect(() => {
const addDisplayed = (key: SnackbarKey) => {
setCurrentlyDisplayed((previous) => [...previous, key]);
};
const removeDisplayed = (key: SnackbarKey) => {
setCurrentlyDisplayed((previous) =>
_.filter(previous, (value: SnackbarKey) => value !== key)
);
};
_.forEach(notifications, (notification) => {
// If this snackbar has been flagged for dismissal, close it.
if (notification.dismissed) {
closeSnackbar(notification.options.key);
return;
}
// This notification is invalid.
if (notification.options.key == null) return;
// Skip if we've already displayed this snackbar.
if (_.includes(currentlyDisplayed, notification.options.key)) return;
const notificationOptions: OptionsObject = {
...notification.options,
onClose: (event, reason, myKey) => {
if (notification.options.onClose) {
notification.options.onClose(event, reason, myKey);
}
},
onExited: () => {
// The notification has left. We can now remove it from the store.
if (notification.options.key != null) {
dispatch(removeNotification(notification.options.key));
removeDisplayed(notification.options.key);
}
},
};
// Else, we need to enqueue this snackbar.
enqueueSnackbar(notification.message, notificationOptions);
addDisplayed(notification.options.key);
});
}, [
notifications,
currentlyDisplayed,
setCurrentlyDisplayed,
enqueueSnackbar,
closeSnackbar,
removeNotification,
]);
// Has no actual render presence.
return null;
}
Example #6
Source File: index.tsx From multi-downloader-nx with MIT License | 5 votes |
onClickDismiss = (key: SnackbarKey | undefined) => () => {
if (notistackRef.current)
notistackRef.current.closeSnackbar(key);
}
Example #7
Source File: SubscriptionStatusNotifier.tsx From clearflask with Apache License 2.0 | 5 votes |
lastKey: SnackbarKey
Example #8
Source File: useNotifier.tsx From shadowsocks-electron with GNU General Public License v3.0 | 5 votes |
displayed: SnackbarKey[] = []
Example #9
Source File: useNotifier.tsx From shadowsocks-electron with GNU General Public License v3.0 | 5 votes |
useNotifier = () => {
const dispatch = useDispatch();
const notifications = useTypedSelector(store => store.notifications);
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
const storeDisplayed = (id: SnackbarKey) => {
displayed = [...displayed, id];
};
const removeDisplayed = (id: SnackbarKey) => {
displayed = [...displayed.filter(key => id !== key)];
};
React.useEffect(() => {
notifications.forEach(({ key, message, dismissed = false, ...options }) => {
if (dismissed) {
// dismiss snackbar using notistack
closeSnackbar(key);
return;
}
// do nothing if snackbar is already displayed
if (displayed.includes(key)) return;
// display snackbar using notistack
enqueueSnackbar(message, {
key,
...options,
onClose: (event, reason, myKey) => {
if ((options as any).onClose) {
(options as any).onClose(event, reason, myKey);
}
},
onExited: (event, myKey) => {
// remove this snackbar from redux store
dispatch(removeSnackbar(myKey));
removeDisplayed(myKey);
},
});
// keep track of snackbars that we've displayed
storeDisplayed(key);
});
}, [notifications, closeSnackbar, enqueueSnackbar, dispatch]);
}
Example #10
Source File: notifications.ts From shadowsocks-electron with GNU General Public License v3.0 | 5 votes |
closeSnackbar = (key: SnackbarKey) => ({
type: CLOSE_SNACKBAR,
dismissAll: !key, // dismiss all if no key has been defined
key,
})
Example #11
Source File: notifications.ts From shadowsocks-electron with GNU General Public License v3.0 | 5 votes |
removeSnackbar = (key: SnackbarKey) => ({
type: REMOVE_SNACKBAR,
key,
})
Example #12
Source File: Notifier.tsx From react-pwa with MIT License | 5 votes |
// NOTE: this is a workaround for a missing feature in notistack
// This will be removed once the new version of notistack is released
// But it works great for now :)
function Notifier() {
const [notifications, actions] = useNotifications();
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
const displayed = useRef<SnackbarKey[]>([]);
function storeDisplayed(key: SnackbarKey) {
displayed.current = [...displayed.current, key];
}
function removeDisplayed(key: SnackbarKey) {
displayed.current = [...displayed.current.filter((_key) => key !== _key)];
}
useEffect(() => {
notifications.forEach(({ message, options, dismissed }) => {
if (dismissed) {
// dismiss snackbar using notistack
closeSnackbar(options.key);
return;
}
// do nothing if snackbar is already displayed
if (options.key && displayed.current.includes(options.key)) return;
// display snackbar using notistack
enqueueSnackbar(message, {
...options,
onExited(event, key) {
// removen this snackbar from the store
actions.remove(key);
removeDisplayed(key);
},
});
// keep track of snackbars that we've displayed
options.key && storeDisplayed(options.key);
});
});
return null;
}
Example #13
Source File: SW.tsx From react-pwa with MIT License | 5 votes |
// TODO (Suren): this should be a custom hook :)
function SW() {
const [, notificationsActions] = useNotifications();
const notificationKey = useRef<SnackbarKey | null>(null);
const {
offlineReady: [offlineReady, setOfflineReady],
needRefresh: [needRefresh, setNeedRefresh],
updateServiceWorker,
} = useRegisterSW();
const close = useCallback(() => {
setOfflineReady(false);
setNeedRefresh(false);
if (notificationKey.current) {
notificationsActions.close(notificationKey.current);
}
}, [setOfflineReady, setNeedRefresh, notificationsActions]);
useEffect(() => {
if (offlineReady) {
notificationsActions.push({
options: {
autoHideDuration: 4500,
content: <Alert severity="success">App is ready to work offline.</Alert>,
},
});
} else if (needRefresh) {
notificationKey.current = notificationsActions.push({
message: 'New content is available, click on reload button to update.',
options: {
variant: 'warning',
persist: true,
action: (
<>
<Button onClick={() => updateServiceWorker(true)}>Reload</Button>
<Button onClick={close}>Close</Button>
</>
),
},
});
}
}, [close, needRefresh, offlineReady, notificationsActions, updateServiceWorker]);
return null;
}
Example #14
Source File: index.ts From react-pwa with MIT License | 5 votes |
function useNotifications(): [Notification[], Actions] {
const [notifications, setNotifications] = useRecoilState(notificationsState);
const push = useCallback(
(notification: Partial<Notification>) => {
// TODO (Suren): use uuid
const id = Math.random().toString();
setNotifications((notifications): Notification[] => [
// TODO (Suren): use immer
...notifications,
{
...notification,
message: notification.message,
dismissed: false,
options: {
...notificationsDefaults.options,
...notification.options,
key: id,
},
},
]);
return id;
},
[setNotifications],
);
const close = useCallback(
(key: SnackbarKey, dismissAll = !key) => {
setNotifications((notifications) =>
notifications.map((notification) =>
dismissAll || notification.options.key === key
? { ...notification, dismissed: true }
: { ...notification },
),
);
},
[setNotifications],
);
const remove = useCallback(
(key: SnackbarKey) => {
setNotifications((notifications) =>
notifications.filter((notification) => notification.options.key !== key),
);
},
[setNotifications],
);
const actions = useMemo(() => ({ push, close, remove }), [push, close, remove]);
return [notifications, actions];
}