{"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"}