UNPKG

@fliklab/react-push-notification

Version:

Simple and easy-to-use web push notification library for React

1 lines 4.5 kB
{"version":3,"file":"index.mjs","sources":["../src/utils/notification.ts","../src/hooks/usePushNotification.ts"],"sourcesContent":["export const registerServiceWorker = async (): Promise<void> => {\n if ('serviceWorker' in navigator) {\n try {\n const registration = await navigator.serviceWorker.register('/service-worker.ts', {\n scope: '/'\n });\n console.log('Service Worker registered:', registration);\n } catch (error) {\n console.error('Service Worker registration failed:', error);\n }\n }\n};\n\nexport const requestNotificationPermission = async (): Promise<boolean> => {\n if (!(\"Notification\" in window)) {\n console.error(\"This browser does not support notifications\");\n return false;\n }\n\n try {\n const permission = await Notification.requestPermission();\n if (permission === \"granted\") {\n await registerServiceWorker();\n }\n return permission === \"granted\";\n } catch (error) {\n console.error(\"Error requesting notification permission:\", error);\n return false;\n }\n};\n\nexport const sendNotification = (\n title: string,\n options?: NotificationOptions\n): void => {\n if (!(\"Notification\" in window)) {\n console.error(\"This browser does not support notifications\");\n return;\n }\n\n if (Notification.permission === \"granted\") {\n try {\n new Notification(title, options);\n } catch (error) {\n console.error(\"Error sending notification:\", error);\n }\n }\n};\n\nexport const scheduleNotification = (\n title: string,\n scheduledTime: Date,\n options?: NotificationOptions\n): number => {\n const now = new Date().getTime();\n const scheduleTime = scheduledTime.getTime();\n const delay = Math.max(0, scheduleTime - now);\n\n return window.setTimeout(() => {\n sendNotification(title, options);\n }, delay);\n};\n\nexport const cancelScheduledNotification = (timeoutId: number): void => {\n window.clearTimeout(timeoutId);\n};\n","import { useState, useCallback, useEffect } from \"react\";\nimport { requestNotificationPermission } from \"../utils/notification\";\n\ninterface UsePushNotificationReturn {\n isSubscribed: boolean;\n error: string | null;\n subscribe: () => Promise<void>;\n unsubscribe: () => void;\n}\n\nexport const usePushNotification = (): UsePushNotificationReturn => {\n const [isSubscribed, setIsSubscribed] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n // 초기 구독 상태 확인\n setIsSubscribed(Notification.permission === \"granted\");\n }, []);\n\n const subscribe = useCallback(async () => {\n try {\n setError(null);\n const granted = await requestNotificationPermission();\n setIsSubscribed(granted);\n if (!granted) {\n setError(\"알림 권한이 거부되었습니다.\");\n }\n } catch (err) {\n setError(\"알림 구독 중 오류가 발생했습니다.\");\n console.error(\"Subscription error:\", err);\n }\n }, []);\n\n const unsubscribe = useCallback(() => {\n // 현재 Web Notification API는 권한을 취소하는 방법을 제공하지 않습니다.\n // 대신 브라우저 설정에서 수동으로 변경해야 합니다.\n setError(\"브라우저 설정에서 알림 권한을 수동으로 취소해주세요.\");\n }, []);\n\n return {\n isSubscribed,\n error,\n subscribe,\n unsubscribe,\n };\n};\n"],"names":["requestNotificationPermission","async","window","console","error","permission","Notification","requestPermission","navigator","registration","serviceWorker","register","scope","log","registerServiceWorker","usePushNotification","isSubscribed","setIsSubscribed","useState","setError","useEffect","subscribe","useCallback","granted","err","unsubscribe"],"mappings":"iEAAO,MAaMA,EAAgCC,UAC3C,KAAM,iBAAkBC,QAEtB,OADAC,QAAQC,MAAM,gDACP,EAGT,IACE,MAAMC,QAAmBC,aAAaC,oBAItC,MAHmB,YAAfF,QArB6BJ,WACnC,GAAI,kBAAmBO,UACrB,IACE,MAAMC,QAAqBD,UAAUE,cAAcC,SAAS,qBAAsB,CAChFC,MAAO,MAETT,QAAQU,IAAI,6BAA8BJ,GAC1C,MAAOL,GACPD,QAAQC,MAAM,sCAAuCA,KAc/CU,GAEc,YAAfT,EACP,MAAOD,GAEP,OADAD,QAAQC,MAAM,4CAA6CA,IACpD,ICjBEW,EAAsB,KACjC,MAAOC,EAAcC,GAAmBC,GAAkB,IACnDd,EAAOe,GAAYD,EAAwB,MAElDE,GAAU,KAERH,EAA4C,YAA5BX,aAAaD,cAC5B,IAsBH,MAAO,CACLW,eACAZ,QACAiB,UAvBgBC,GAAYrB,UAC5B,IACEkB,EAAS,MACT,MAAMI,QAAgBvB,IACtBiB,EAAgBM,GACXA,GACHJ,EAAS,mBAEX,MAAOK,GACPL,EAAS,uBACThB,QAAQC,MAAM,sBAAuBoB,MAEtC,IAYDC,YAVkBH,GAAY,KAG9BH,EAAS,mCACR"}