koval-ui
Version:
React components collection with minimalistic design. Supports theming, layout, and input validation.
1 lines • 6.08 kB
Source Map (JSON)
{"version":3,"file":"useNotificationState.cjs","sources":["../../../../src/lib/Notification/useNotificationState.tsx"],"sourcesContent":["import {useCallback, useEffect, useState} from 'react';\n\nimport {useNotificationContext} from './NotificationContext.ts';\nimport type {NotificationProps, NotificationState} from './NotificationReducer.ts';\nimport {Actions} from './NotificationReducer.ts';\nimport {useNotificationProps} from './useNotificationProps.ts';\nimport {useNotificationInstance} from './useNotificationInstance.ts';\n\nconst useSelector = <TResult,>(callback: (arg0: NotificationState) => TResult) => {\n const {state} = useNotificationContext();\n return callback(state);\n};\n\nconst createNotification = (props: NotificationProps) => {\n return new window.Notification(props.title, {\n icon: props.icon,\n body: props.body,\n requireInteraction: props.requireInteraction,\n });\n};\n\nexport const useNotificationState = (id: string) => {\n const {dispatch} = useNotificationContext();\n const instance = useNotificationInstance(id);\n const notificationProps = useNotificationProps(id);\n const isOpen = useSelector((state: NotificationState) =>\n state.open.some(notificationId => notificationId === id)\n );\n const [permission, setPermission] = useState<NotificationPermission>();\n\n const handleSelfClose = useCallback(() => {\n dispatch({\n type: Actions.NOTIFICATION_CLOSE,\n id,\n });\n }, [dispatch, id]);\n\n useEffect(() => {\n instance?.addEventListener('close', handleSelfClose);\n return () => {\n instance?.removeEventListener('close', handleSelfClose);\n };\n }, [handleSelfClose, instance]);\n\n const openNotification = useCallback(() => {\n const currentPermission = window?.Notification?.permission;\n\n /* Partially supported in Firefox. The new notification will not re-appear */\n if (isOpen) {\n instance?.close();\n }\n if (currentPermission === 'granted') {\n dispatch({\n type: Actions.NOTIFICATION_OPEN,\n id,\n instance: createNotification(notificationProps),\n });\n setPermission(currentPermission);\n } else if (currentPermission !== 'denied') {\n window?.Notification?.requestPermission().then(nextPermission => {\n setPermission(nextPermission);\n if (nextPermission === 'granted') {\n dispatch({\n type: Actions.NOTIFICATION_OPEN,\n id,\n instance: createNotification(notificationProps),\n });\n }\n });\n } else if (currentPermission === 'denied') {\n setPermission(currentPermission);\n }\n }, [dispatch, id, instance, isOpen, notificationProps]);\n\n const closeNotification = useCallback(() => {\n instance?.close();\n dispatch({type: Actions.NOTIFICATION_CLOSE, id});\n }, [dispatch, id, instance]);\n\n return {\n /**\n * Show notification to the user.\n * Warning! Will not work from component scope. Needs to be run as an effect\n * @example\n * const {openNotificaton} = useNotificationState(id);\n * const handleClick = useCallback(() => {\n * openNotification();\n * }, [openNotification]);\n */\n openNotification,\n /**\n * Hide notification.\n * Warning! Will not work from component scope. Needs to be run as an effect\n * @example\n * const {openNotificaton} = useNotificationState(id);\n * const handleClick = useCallback(() => {\n * openNotification();\n * }, [openNotification]);\n */\n closeNotification,\n /** Current visibility of notification */\n isOpen,\n /**\n * Indicates the current permission granted by the user for the current origin to display web notifications\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Notification/permission_static\n */\n permission,\n };\n};\n"],"names":["useSelector","callback","state","useNotificationContext","createNotification","props","useNotificationState","id","dispatch","instance","useNotificationInstance","notificationProps","useNotificationProps","isOpen","notificationId","permission","setPermission","useState","handleSelfClose","useCallback","Actions","useEffect","openNotification","currentPermission","_a","_b","nextPermission","closeNotification"],"mappings":"uRAQMA,EAAyBC,GAAmD,CACxE,KAAA,CAAC,MAAAC,CAAK,EAAIC,yBAAuB,EACvC,OAAOF,EAASC,CAAK,CACzB,EAEME,EAAsBC,GACjB,IAAI,OAAO,aAAaA,EAAM,MAAO,CACxC,KAAMA,EAAM,KACZ,KAAMA,EAAM,KACZ,mBAAoBA,EAAM,kBAAA,CAC7B,EAGQC,EAAwBC,GAAe,CAC1C,KAAA,CAAC,SAAAC,CAAQ,EAAIL,yBAAuB,EACpCM,EAAWC,0BAAwBH,CAAE,EACrCI,EAAoBC,uBAAqBL,CAAE,EAC3CM,EAASb,EAAaE,GACxBA,EAAM,KAAK,KAAKY,GAAkBA,IAAmBP,CAAE,CAC3D,EACM,CAACQ,EAAYC,CAAa,EAAIC,WAAiC,EAE/DC,EAAkBC,EAAAA,YAAY,IAAM,CAC7BX,EAAA,CACL,KAAMY,EAAQ,QAAA,mBACd,GAAAb,CAAA,CACH,CAAA,EACF,CAACC,EAAUD,CAAE,CAAC,EAEjBc,EAAAA,UAAU,KACIZ,GAAA,MAAAA,EAAA,iBAAiB,QAASS,GAC7B,IAAM,CACCT,GAAA,MAAAA,EAAA,oBAAoB,QAASS,EAC3C,GACD,CAACA,EAAiBT,CAAQ,CAAC,EAExB,MAAAa,EAAmBH,EAAAA,YAAY,IAAM,SACjC,MAAAI,GAAoBC,EAAA,2BAAQ,eAAR,YAAAA,EAAsB,WAG5CX,IACAJ,GAAA,MAAAA,EAAU,SAEVc,IAAsB,WACbf,EAAA,CACL,KAAMY,EAAQ,QAAA,kBACd,GAAAb,EACA,SAAUH,EAAmBO,CAAiB,CAAA,CACjD,EACDK,EAAcO,CAAiB,GACxBA,IAAsB,UAC7BE,EAAA,2BAAQ,eAAR,MAAAA,EAAsB,oBAAoB,KAAuBC,GAAA,CAC7DV,EAAcU,CAAc,EACxBA,IAAmB,WACVlB,EAAA,CACL,KAAMY,EAAQ,QAAA,kBACd,GAAAb,EACA,SAAUH,EAAmBO,CAAiB,CAAA,CACjD,CACL,GAEGY,IAAsB,UAC7BP,EAAcO,CAAiB,CACnC,EACD,CAACf,EAAUD,EAAIE,EAAUI,EAAQF,CAAiB,CAAC,EAEhDgB,EAAoBR,EAAAA,YAAY,IAAM,CACxCV,GAAA,MAAAA,EAAU,QACVD,EAAS,CAAC,KAAMY,EAAQ,QAAA,mBAAoB,GAAAb,EAAG,CAChD,EAAA,CAACC,EAAUD,EAAIE,CAAQ,CAAC,EAEpB,MAAA,CAUH,iBAAAa,EAUA,kBAAAK,EAEA,OAAAd,EAKA,WAAAE,CACJ,CACJ"}