{"version":3,"file":"static/chunks/6842.ebafbf1332268e78.js","mappings":"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","sources":["webpack://_N_E/./src/components/molecules/Toast/Toast.tsx","webpack://_N_E/./src/components/organisms/ToastHandler/ToastHandler.tsx","webpack://_N_E/./src/lib/hooks/toasts/Toast.tsx","webpack://_N_E/./src/lib/hooks/toasts/ToastStorage.ts","webpack://_N_E/<anon>"],"sourcesContent":["import { ColorShade } from '@/components/atoms/Colors/Colors';\nimport Icon, { IconType } from '@/components/atoms/Icon/Icon';\nimport Paragraph from '@/components/atoms/Paragraph/Paragraph';\nimport { ToastType } from '@/lib/hooks/toasts/Toast';\nimport { ReactNode } from 'react';\n\n/**\n * Styling Map Holds all the classes for the particular types of Toast Messages\n *\n * @constant\n */\nconst stylingMap = {\n success: 'bg-success-200 text-neutral-100',\n error: 'bg-error-200 text-neutral-100',\n warning: 'bg-warning-200 text-neutral-100',\n info: 'bg-info-200 text-neutral-100',\n};\n\n/**\n * Icon Map Hold all of the mappings for particular icons and statuses\n *\n * @constant\n */\nconst iconMap: {\n [key: string]: {\n /** The Icon to use */\n icon: IconType;\n /** The Color Shade to use with the Icon */\n colorShade: ColorShade;\n };\n} = {\n success: {\n icon: 'checkCircle',\n colorShade: 100,\n },\n error: {\n icon: 'exclamationCircle',\n colorShade: 100,\n },\n info: {\n icon: 'infoOutline',\n colorShade: 100,\n },\n warning: {\n icon: 'exclamationTriangle',\n colorShade: 100,\n },\n};\n\n/** Screen Sizing Holds all the specific Styles for each of the screen sizes */\nconst mobileSizing = 'right-6 top-16 left-6 max-w-[328px]';\nconst tabletSizing = 'sm:right-8 sm:top-20 sm:left-8 sm:max-w-[680px]';\nconst desktopSizing = 'md:right-8 md:top-24 md:left-8 md:max-w-[896px]';\n\n/**\n * IToast Toast Interface\n *\n * @interface IToast\n */\nexport interface IToast {\n /**\n * Type of Toast to Display\n *\n * @memberof IToast\n * @member {ToastType} type\n */\n type: ToastType;\n /**\n * Should we show the Icon or Not?\n *\n * @memberof IToast\n * @member {boolean} [showIcon]\n */\n showIcon?: boolean;\n /**\n * Close Click Handler\n *\n * @memberof IToast\n * @member {() => void} closeClick\n */\n closeClick: () => void;\n /**\n * Children to be displayed in the Toast\n *\n * @memberof IToast\n * @member {ReactNode} children\n */\n children: ReactNode;\n}\n\n/**\n * Toast Toast Component\n *\n * @param {IToast} props - The props for the Toast component\n * @returns {React.FC<IToast>} Toast Component\n */\nconst Toast: React.FC<IToast> = ({\n type,\n children,\n closeClick,\n showIcon,\n}: IToast) => {\n const baseToastClasses = `fixed inline-flex items-center m-auto py-3 inset-x-0 rounded min-h-[48px] z-30 ${mobileSizing} ${tabletSizing} ${desktopSizing}`;\n const toastClasses = `${baseToastClasses} ${stylingMap[type]}`;\n return (\n <div data-testid=\"toast\" className={toastClasses}>\n <div className=\"inline-flex w-full h-full justify-center items-center\">\n {showIcon ? (\n <div className=\"ml-[18px]\" data-testid=\"toast-icon\">\n <Icon\n icon={iconMap[type].icon}\n size={20}\n colorShade={iconMap[type].colorShade}\n colorType=\"neutral\"\n />\n </div>\n ) : null}\n <div className=\"ml-[18px]\">\n <Paragraph className=\"text-neutral-100\" size=\"body4\" styling=\"bold\">\n {children}\n </Paragraph>\n </div>\n <div className=\"mx-4 ml-auto flex items-center\">\n <button data-testid=\"toast-delete\" onClick={() => closeClick()}>\n <span className=\"sr-only\">Dismiss</span>\n <Icon\n icon=\"close\"\n size={25}\n colorShade={iconMap[type].colorShade}\n colorType=\"neutral\"\n />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Toast;\n","import Toast from '@/components/molecules/Toast/Toast';\nimport { IToastAction, useToastContext } from '@/lib/hooks/toasts/Toast';\nimport { useCheckAndDispatchToastFromStorage } from '@/lib/hooks/toasts/ToastStorage';\nimport { useEffect } from 'react';\n\n/**\n * IToastHandler\n *\n * @interface IToastHandler\n */\nexport interface IToastHandler {\n /**\n * An Initial Toast to Show when rendering\n *\n * @memberof IToastHandler\n * @member {IToastAction} [initialToast]\n */\n initialToast?: IToastAction;\n /**\n * How long to show a non persistent toast.\n *\n * @memberof IToastHandler\n * @default 2000\n * @member {number} [timeToShow]\n */\n timeToShow?: number;\n}\n\n/**\n * Toast Handler Handles Displaying Toast Messages\n *\n * @param {IToastHandler} props - The props for the Toast Handler component\n * @returns {React.FC<IToastHandler>} Toast Handler Component\n */\nconst ToastHandler: React.FC<IToastHandler> = ({\n initialToast,\n timeToShow = 3000,\n}: IToastHandler) => {\n const toastContext = useToastContext();\n const toastDispatch = toastContext.dispatch;\n const toastState = toastContext.state;\n\n /** If Initial Toast Action Create an Initial Toast */\n useEffect(() => {\n if (initialToast) {\n toastDispatch(initialToast);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useCheckAndDispatchToastFromStorage();\n\n /** Close Toast Dispatches a Delete Toast action when we close the Toast */\n const closeToast = () => {\n const currentToast = toastState.toasts[0];\n toastDispatch({\n type: 'DELETE_TOAST',\n toast: {\n type: currentToast.type,\n message: currentToast.message,\n id: currentToast.id,\n persistent: currentToast.persistent,\n },\n });\n };\n\n if (toastState.toasts.length > 0) {\n if (!toastState.toasts[0].persistent) {\n setTimeout(() => {\n closeToast();\n }, timeToShow);\n }\n }\n\n return (\n <div data-testid=\"toast-handler\">\n {toastState.toasts.length > 0 ? (\n <Toast {...toastState.toasts[0]} closeClick={closeToast}>\n {toastState.toasts[0].message}\n </Toast>\n ) : null}\n </div>\n );\n};\n\nexport default ToastHandler;\n","import { createContext, ReactNode, useContext, useReducer } from 'react';\n\n/**\n * Toast Type Types of Toasts Allowed\n *\n * @typedef {ToastType}\n */\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\n/** Toast Action Types Actions Allowed for Toast */\nexport type ToastActionType = 'ADD_TOAST' | 'DELETE_TOAST';\n\n/**\n * Toast Toast Type\n *\n * @typedef {Toast}\n */\nexport type Toast = {\n /** Id of Toast */\n id: string;\n /** Message to Display */\n message?: string;\n /** If the Toast is Persistent */\n persistent?: boolean;\n /** If the Toast should show an Icon */\n showIcon?: boolean;\n /** Type of Toast */\n type: ToastType;\n};\n\n/**\n * Toast State State of the Toasts\n *\n * @interface\n */\ninterface IToastState {\n /** Array of Toasts */\n toasts: Toast[];\n}\n\n/**\n * Toast Initial State Value\n *\n * @constant\n */\nexport const toastInitialValue: IToastState = {\n toasts: [],\n};\n\n/**\n * Toast Init Config\n *\n * @param {IToastState} state - The State to Init the Config with\n * @returns {object} - The Initial Config\n */\nexport const initConfig = (state: IToastState) => ({\n ...toastInitialValue,\n ...state,\n});\n\n/**\n * IToastAction Interface for Toast Actions\n *\n * @interface\n */\nexport interface IToastAction {\n /** Type of Action */\n type: ToastActionType;\n /** Toast to Add or Delete */\n toast: Toast;\n}\n\n/**\n * Toast Context Used for creating the Context Object for the useToastContext\n * Function\n *\n * @constant\n */\nexport const ToastContext = createContext<{\n /** The State of the Toasts */\n state: IToastState;\n /** The Dispatch Function for the Toasts */\n dispatch: React.Dispatch<IToastAction>;\n}>({\n state: toastInitialValue,\n /** @returns {null} - Null */\n dispatch: () => null,\n});\n\n/**\n * Toast Reducer Reducer for adding and removing Toasts\n *\n * @param {IToastState} state - The State of the Toasts\n * @param {IToastAction} action - The Action to Perform on the Toasts\n * @returns {object} - The Updated State\n */\nexport function ToastReducer(state: IToastState, action: IToastAction) {\n switch (action.type) {\n case 'ADD_TOAST': {\n return {\n ...state,\n toasts: [...state.toasts, action.toast],\n };\n }\n case 'DELETE_TOAST': {\n const updatedToasts = state.toasts.filter((e) => e.id != action.toast.id);\n return {\n ...state,\n toasts: updatedToasts,\n };\n }\n }\n}\n\n/**\n * IToast Provider The Interface for what the Toast Provider will be expecting\n *\n * @interface\n */\nexport interface IToastProvider {\n /** The Children to Provide Context to */\n children: ReactNode;\n}\n\n/**\n * Toast Provider Used to provide the ability to use Toasts to any children of\n * the provider.\n *\n * @param {IToastProvider} children - The children this will be providing\n * Context to.\n * @returns {Element} ToastContext\n */\nexport function ToastProvider({ children }: IToastProvider): JSX.Element {\n const [state, dispatch] = useReducer(ToastReducer, toastInitialValue);\n\n return (\n <ToastContext.Provider value={{ state, dispatch }}>\n {children}\n </ToastContext.Provider>\n );\n}\n\n/**\n * Use Toast Context Used to allow components to interact with the Toast Context\n *\n * @returns {ToastContext} ToastContext\n */\nexport const useToastContext = () => useContext(ToastContext);\n","import { tomorrow } from '@/lib/utils/helpers/dateHelpers/dates';\nimport LocalStorage from '@/lib/utils/storage/local-storage';\nimport { useEffect } from 'react';\nimport { Toast, ToastType, useToastContext } from './Toast';\n\n/** Props for the buildToastPayload fn */\ntype BuildToastPayloadProps = {\n /** Toast id */\n id?: string;\n /** Toast type */\n type: ToastType;\n /** Toast message */\n message: string;\n};\n\n/**\n * Generates a toast payload for the local storage\n *\n * @param {object} param - Function params\n * @param {string} [param.id] - The toast id\n * @param {ToastType} param.type - The toast type\n * @param {string} param.message - The toast message\n * @returns {object} - The built toast payload\n */\nconst buildToastPayload = ({\n id = '1',\n type,\n message,\n}: BuildToastPayloadProps) => {\n return {\n id,\n type: type,\n message: message,\n persistent: false,\n showIcon: true,\n };\n};\n\nconst STORAGE_TOAST_KEY = 'toast';\n\n/**\n * Saves the toast payload to local storage\n *\n * @returns {Function} A function to save toast info into the local storage\n */\nexport const useSaveToastToStorage = () => {\n const storage = new LocalStorage();\n\n return (type: ToastType, message: string, id?: string) =>\n storage.set(STORAGE_TOAST_KEY, buildToastPayload({ id, type, message }), {\n expires: tomorrow,\n });\n};\n\n/**\n * Looks for the STORAGE_TOAST_KEY in local storage and dispatches a new toast\n * if that's the case.\n */\nexport const useCheckAndDispatchToastFromStorage = () => {\n const storage = new LocalStorage();\n const toast = storage.get(STORAGE_TOAST_KEY) as Toast | null;\n\n const { dispatch } = useToastContext();\n\n useEffect(() => {\n if (toast) {\n dispatch({\n type: 'ADD_TOAST',\n toast,\n });\n\n storage.delete('toast');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(toast)]);\n};\n"],"names":["stylingMap","success","error","warning","info","iconMap","icon","colorShade","Toast_Toast","type","children","closeClick","showIcon","param","baseToastClasses","tabletSizing","desktopSizing","concat","toastClasses","jsx_runtime","jsx","div","className","jsxs","Icon","size","colorType","Paragraph","styling","button","onClick","span","ToastHandler_ToastHandler","initialToast","timeToShow","toastContext","useToastContext","toastDispatch","dispatch","toastState","state","useEffect","useCheckAndDispatchToastFromStorage","closeToast","currentToast","toasts","toast","message","id","persistent","length","setTimeout","Toast","toastInitialValue","ToastContext","createContext","ToastReducer","action","updatedToasts","filter","e","ToastProvider","useReducer","react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__","Provider","value","useContext","buildToastPayload","STORAGE_TOAST_KEY","useSaveToastToStorage","storage","LocalStorage","set","expires","tomorrow","get","delete","JSON","stringify"],"sourceRoot":""}