Alternative web application for the pdsadmin command
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 39 lines 977 B view raw
1import { atom, useAtomValue, useSetAtom } from "jotai"; 2import { useMemo } from "react"; 3 4type Toast = { 5 id: string; 6 message: string; 7 level: "success" | "error"; 8 removing?: boolean; 9}; 10 11const baseAtom = atom<Toast[]>([]); 12 13const MAX_TOAST_COUNT = 3; 14const REMOVE_DELAY = 3000; 15 16const pushToastAtom = atom( 17 null, 18 (_, set, message: string, level: Toast["level"]) => { 19 const newToast = { message, level, id: `${Date.now()}` }; 20 set(baseAtom, (prev) => [...prev, newToast].slice(-MAX_TOAST_COUNT)); 21 22 setTimeout(() => { 23 set(baseAtom, (prev) => prev.filter((item) => item.id !== newToast.id)); 24 }, REMOVE_DELAY); 25 }, 26); 27 28export const useToasts = () => useAtomValue(baseAtom); 29 30export const useToast = () => { 31 const pushToast = useSetAtom(pushToastAtom); 32 return useMemo( 33 () => ({ 34 success: (message: string) => pushToast(message, "success"), 35 error: (message: string) => pushToast(message, "error"), 36 }), 37 [pushToast], 38 ); 39};