ivt
Version:
Ivt Components Library
1 lines • 8.17 kB
Source Map (JSON)
{"version":3,"file":"use-toast-CLJJgfL0.mjs","sources":["../../src/hooks/use-toast.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport type { ToastActionElement, ToastProps } from \"@/components/ui/toast\";\n\nconst TOAST_LIMIT = 1;\nconst TOAST_REMOVE_DELAY = 1000000;\n\ntype ToasterToast = ToastProps & {\n\tid: string;\n\ttitle?: React.ReactNode;\n\tdescription?: React.ReactNode;\n\taction?: ToastActionElement;\n};\n\nconst actionTypes = {\n\tADD_TOAST: \"ADD_TOAST\",\n\tUPDATE_TOAST: \"UPDATE_TOAST\",\n\tDISMISS_TOAST: \"DISMISS_TOAST\",\n\tREMOVE_TOAST: \"REMOVE_TOAST\",\n} as const;\n\nlet count = 0;\n\nfunction genId() {\n\tcount = (count + 1) % Number.MAX_SAFE_INTEGER;\n\treturn count.toString();\n}\n\ntype ActionType = typeof actionTypes;\n\ntype Action =\n\t| {\n\t\t\ttype: ActionType[\"ADD_TOAST\"];\n\t\t\ttoast: ToasterToast;\n\t }\n\t| {\n\t\t\ttype: ActionType[\"UPDATE_TOAST\"];\n\t\t\ttoast: Partial<ToasterToast>;\n\t }\n\t| {\n\t\t\ttype: ActionType[\"DISMISS_TOAST\"];\n\t\t\ttoastId?: ToasterToast[\"id\"];\n\t }\n\t| {\n\t\t\ttype: ActionType[\"REMOVE_TOAST\"];\n\t\t\ttoastId?: ToasterToast[\"id\"];\n\t };\n\ninterface State {\n\ttoasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst addToRemoveQueue = (toastId: string) => {\n\tif (toastTimeouts.has(toastId)) {\n\t\treturn;\n\t}\n\n\tconst timeout = setTimeout(() => {\n\t\ttoastTimeouts.delete(toastId);\n\t\tdispatch({\n\t\t\ttype: \"REMOVE_TOAST\",\n\t\t\ttoastId: toastId,\n\t\t});\n\t}, TOAST_REMOVE_DELAY);\n\n\ttoastTimeouts.set(toastId, timeout);\n};\n\nexport const reducer = (state: State, action: Action): State => {\n\tswitch (action.type) {\n\t\tcase \"ADD_TOAST\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n\t\t\t};\n\n\t\tcase \"UPDATE_TOAST\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)),\n\t\t\t};\n\n\t\tcase \"DISMISS_TOAST\": {\n\t\t\tconst { toastId } = action;\n\n\t\t\t// ! Side effects ! - This could be extracted into a dismissToast() action,\n\t\t\t// but I'll keep it here for simplicity\n\t\t\tif (toastId) {\n\t\t\t\taddToRemoveQueue(toastId);\n\t\t\t} else {\n\t\t\t\tfor (const toast of state.toasts) {\n\t\t\t\t\taddToRemoveQueue(toast.id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoasts: state.toasts.map((t) =>\n\t\t\t\t\tt.id === toastId || toastId === undefined\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...t,\n\t\t\t\t\t\t\t\topen: false,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: t,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\tcase \"REMOVE_TOAST\":\n\t\t\tif (action.toastId === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\ttoasts: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoasts: state.toasts.filter((t) => t.id !== action.toastId),\n\t\t\t};\n\t}\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [] };\n\nfunction dispatch(action: Action) {\n\tmemoryState = reducer(memoryState, action);\n\tfor (const listener of listeners) {\n\t\tlistener(memoryState);\n\t}\n}\n\ntype Toast = Omit<ToasterToast, \"id\">;\n\nfunction toast({ ...props }: Toast) {\n\tconst id = genId();\n\n\tconst update = (props: ToasterToast) =>\n\t\tdispatch({\n\t\t\ttype: \"UPDATE_TOAST\",\n\t\t\ttoast: { ...props, id },\n\t\t});\n\tconst dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id });\n\n\tdispatch({\n\t\ttype: \"ADD_TOAST\",\n\t\ttoast: {\n\t\t\t...props,\n\t\t\tid,\n\t\t\topen: true,\n\t\t\tonOpenChange: (open) => {\n\t\t\t\tif (!open) dismiss();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn {\n\t\tid: id,\n\t\tdismiss,\n\t\tupdate,\n\t};\n}\n\nfunction useToast() {\n\tconst [state, setState] = React.useState<State>(memoryState);\n\n\tReact.useEffect(() => {\n\t\tlisteners.push(setState);\n\t\treturn () => {\n\t\t\tconst index = listeners.indexOf(setState);\n\t\t\tif (index > -1) {\n\t\t\t\tlisteners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn {\n\t\t...state,\n\t\ttoast,\n\t\tdismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n\t};\n}\n\nexport { useToast, toast };\n"],"names":["TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","Number","MAX_SAFE_INTEGER","toString","toastTimeouts","Map","addToRemoveQueue","toastId","has","timeout","setTimeout","delete","dispatch","type","set","reducer","state","action","toasts","toast","slice","map","t","id","undefined","open","filter","listeners","memoryState","listener","props","update","dismiss","onOpenChange","useToast","setState","React","useState","useEffect","push","index","indexOf","splice"],"mappings":"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"}