@zydon/common 2.9.48 → 2.9.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{chunk-HU6OBYMK.js → chunk-2OEMLP7V.js} +2 -2
- package/dist/{chunk-3YDQT7HF.js → chunk-3BSKZJN4.js} +3 -3
- package/dist/{chunk-GR5GSCOD.js → chunk-4EYXFXTZ.js} +2 -2
- package/dist/{chunk-YO4G7OZA.js → chunk-5SNFZFVB.js} +2 -2
- package/dist/{chunk-BTVG4NW3.js → chunk-5WSSHKHN.js} +2 -2
- package/dist/{chunk-RTXMZGBW.js → chunk-6HYTMWR5.js} +2 -2
- package/dist/{chunk-G6HGDG22.js → chunk-6QWWSQ4I.js} +2 -2
- package/dist/{chunk-TAA5KCEG.js → chunk-BPBZFCMO.js} +2 -2
- package/dist/{chunk-4XN57SLB.js → chunk-BZR6EWD7.js} +2 -2
- package/dist/{chunk-L57JO525.js → chunk-CYQSUCUE.js} +3 -3
- package/dist/{chunk-JWX3OMRI.js → chunk-DL36AHKX.js} +2 -2
- package/dist/{chunk-FMFS42U2.js → chunk-FLYS7MPO.js} +1 -1
- package/dist/{chunk-NZRNEP5G.js → chunk-GP6WGPEA.js} +5 -5
- package/dist/{chunk-NDX5YJV7.js → chunk-HUNZ6PKW.js} +2 -2
- package/dist/{chunk-LTXQ3A3C.js → chunk-II32T2A5.js} +2 -2
- package/dist/{chunk-JUXUEEZW.js → chunk-JAABZFIG.js} +3 -3
- package/dist/{chunk-CFCRZKL5.js → chunk-KHSQ6GF5.js} +2 -2
- package/dist/{chunk-5NLFXSCK.js → chunk-LEWBVYXY.js} +2 -2
- package/dist/{chunk-6AORBPFU.js → chunk-LXJVJF6H.js} +2 -2
- package/dist/{chunk-MHURBJRD.js → chunk-OH5XAMTV.js} +5 -5
- package/dist/{chunk-QBTZKP6X.js → chunk-OLRJVYBM.js} +2 -2
- package/dist/{chunk-MWKWO5P2.js → chunk-PO3TUP7Q.js} +2 -2
- package/dist/{chunk-33SY23DN.js → chunk-PPRKPC3X.js} +2 -2
- package/dist/{chunk-ZHY3VDHD.js → chunk-ULFUYNP2.js} +2 -2
- package/dist/{chunk-DYZC2NKL.js → chunk-UM7HVOZD.js} +2 -2
- package/dist/{chunk-UMLZEYD5.js → chunk-XEP35Z6H.js} +2 -2
- package/dist/{chunk-C2T2YAFC.js → chunk-YLSD5KM6.js} +2 -2
- package/dist/components/Accordion/index.js +2 -2
- package/dist/components/ActionButton/index.js +2 -2
- package/dist/components/Analytics/Carts/index.js +13 -13
- package/dist/components/Analytics/OrderProjection/index.js +8 -8
- package/dist/components/Analytics/OverviewAnalytics/index.js +10 -10
- package/dist/components/Analytics/PartnerAnalysis/index.js +9 -9
- package/dist/components/Analytics/index.js +6 -6
- package/dist/components/Autocomplete/index.js +2 -2
- package/dist/components/AvatarButton/index.js +4 -4
- package/dist/components/BuilderLayout/index.js +2 -2
- package/dist/components/BuilderSidebar/index.js +1 -1
- package/dist/components/BulkEditModal/index.js +4 -4
- package/dist/components/CardBrand/index.js +1 -1
- package/dist/components/ColorPickerInput/index.js +2 -2
- package/dist/components/Common/index.js +3 -3
- package/dist/components/CopyButton/index.js +2 -2
- package/dist/components/DataView/index.js +6 -6
- package/dist/components/DragButton/index.js +2 -2
- package/dist/components/Drawer/index.js +3 -3
- package/dist/components/DynamicDataView/index.js +9 -9
- package/dist/components/EasyCropModal/index.js +3 -3
- package/dist/components/Error/index.js +1 -1
- package/dist/components/ExpandableGroup/index.js +1 -1
- package/dist/components/FileUpload/index.js +7 -7
- package/dist/components/Filters/index.js +4 -4
- package/dist/components/FrameSkeleton/index.js +2 -2
- package/dist/components/HelpButton/index.js +2 -2
- package/dist/components/Icon/index.js +1 -1
- package/dist/components/IconButton/index.js +2 -2
- package/dist/components/ImageCropModal/index.js +2 -2
- package/dist/components/Incrementer/index.js +2 -2
- package/dist/components/InfoCircle/index.js +2 -2
- package/dist/components/ListBundles/index.js +2 -2
- package/dist/components/MenuItem/index.js +2 -2
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/MoreMenu/index.js +2 -2
- package/dist/components/NotFound/index.js +1 -1
- package/dist/components/PasswordRules/index.js +1 -1
- package/dist/components/PopoverSelect/index.js +1 -1
- package/dist/components/PortalBrandImage/index.js +1 -1
- package/dist/components/SearchInput/index.js +2 -2
- package/dist/components/SelectList/index.js +4 -4
- package/dist/components/SelectableCards/index.js +4 -4
- package/dist/components/SeoPreview/index.js +1 -1
- package/dist/components/StateDisplay/index.js +2 -2
- package/dist/components/StepNavigator/index.js +2 -2
- package/dist/components/StepUpDialog/index.js +2 -2
- package/dist/components/Steps/index.js +1 -1
- package/dist/components/StyledTab/index.js +1 -1
- package/dist/components/SwapList/index.js +3 -3
- package/dist/components/ToggleTheme/index.js +2 -2
- package/dist/components/WebhookCard/index.js +1 -1
- package/dist/components/carousel/index.js +2 -2
- package/dist/components/form/Address/index.js +3 -3
- package/dist/components/form/Autocomplete/index.js +3 -3
- package/dist/components/form/ColorPicker/index.js +2 -2
- package/dist/components/form/FileUpload/index.js +7 -7
- package/dist/components/form/Incrementer/index.js +2 -2
- package/dist/components/form/Password/index.js +1 -1
- package/dist/components/form/SelectList/index.js +4 -4
- package/dist/components/form/SelectableCards/index.js +4 -4
- package/dist/components/form/Webhook/index.js +4 -4
- package/dist/components/lightbox/index.js +1 -1
- package/dist/components/table/index.js +2 -2
- package/dist/contexts/PushNotificationsV2/index.d.ts +1 -1
- package/dist/contexts/PushNotificationsV2/index.js +4 -4
- package/dist/contexts/PushNotificationsV2/index.js.map +1 -1
- package/dist/hooks/useThemeToggle.js +2 -2
- package/dist/index.js +2 -2
- package/dist/theme/theme-provider.js +2 -2
- package/dist/utils/consoleLog.js +4 -1
- package/dist/utils/consoleLog.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-GPFANUMT.js +0 -4
- package/dist/chunk-GPFANUMT.js.map +0 -1
- package/dist/chunk-RP7PNTLJ.js +0 -4
- package/dist/chunk-RP7PNTLJ.js.map +0 -1
- package/dist/chunk-WMHH24KM.js +0 -4
- package/dist/chunk-WMHH24KM.js.map +0 -1
- package/dist/contexts/Messages/index.d.ts +0 -8
- package/dist/contexts/Messages/index.js +0 -8
- package/dist/contexts/Messages/index.js.map +0 -1
- package/dist/contexts/PushNotifications/index.d.ts +0 -8
- package/dist/contexts/PushNotifications/index.js +0 -11
- package/dist/contexts/PushNotifications/index.js.map +0 -1
- package/dist/types/messages.d.ts +0 -16
- package/dist/types/messages.js +0 -2
- package/dist/types/messages.js.map +0 -1
- package/dist/types/pushNotifications.d.ts +0 -77
- package/dist/types/pushNotifications.js +0 -2
- package/dist/types/pushNotifications.js.map +0 -1
- package/dist/utils/urlBase64ToUint8Array.d.ts +0 -3
- package/dist/utils/urlBase64ToUint8Array.js +0 -2
- package/dist/utils/urlBase64ToUint8Array.js.map +0 -1
- /package/dist/{chunk-HU6OBYMK.js.map → chunk-2OEMLP7V.js.map} +0 -0
- /package/dist/{chunk-3YDQT7HF.js.map → chunk-3BSKZJN4.js.map} +0 -0
- /package/dist/{chunk-GR5GSCOD.js.map → chunk-4EYXFXTZ.js.map} +0 -0
- /package/dist/{chunk-YO4G7OZA.js.map → chunk-5SNFZFVB.js.map} +0 -0
- /package/dist/{chunk-BTVG4NW3.js.map → chunk-5WSSHKHN.js.map} +0 -0
- /package/dist/{chunk-RTXMZGBW.js.map → chunk-6HYTMWR5.js.map} +0 -0
- /package/dist/{chunk-G6HGDG22.js.map → chunk-6QWWSQ4I.js.map} +0 -0
- /package/dist/{chunk-TAA5KCEG.js.map → chunk-BPBZFCMO.js.map} +0 -0
- /package/dist/{chunk-4XN57SLB.js.map → chunk-BZR6EWD7.js.map} +0 -0
- /package/dist/{chunk-L57JO525.js.map → chunk-CYQSUCUE.js.map} +0 -0
- /package/dist/{chunk-JWX3OMRI.js.map → chunk-DL36AHKX.js.map} +0 -0
- /package/dist/{chunk-FMFS42U2.js.map → chunk-FLYS7MPO.js.map} +0 -0
- /package/dist/{chunk-NZRNEP5G.js.map → chunk-GP6WGPEA.js.map} +0 -0
- /package/dist/{chunk-NDX5YJV7.js.map → chunk-HUNZ6PKW.js.map} +0 -0
- /package/dist/{chunk-LTXQ3A3C.js.map → chunk-II32T2A5.js.map} +0 -0
- /package/dist/{chunk-JUXUEEZW.js.map → chunk-JAABZFIG.js.map} +0 -0
- /package/dist/{chunk-CFCRZKL5.js.map → chunk-KHSQ6GF5.js.map} +0 -0
- /package/dist/{chunk-5NLFXSCK.js.map → chunk-LEWBVYXY.js.map} +0 -0
- /package/dist/{chunk-6AORBPFU.js.map → chunk-LXJVJF6H.js.map} +0 -0
- /package/dist/{chunk-MHURBJRD.js.map → chunk-OH5XAMTV.js.map} +0 -0
- /package/dist/{chunk-QBTZKP6X.js.map → chunk-OLRJVYBM.js.map} +0 -0
- /package/dist/{chunk-MWKWO5P2.js.map → chunk-PO3TUP7Q.js.map} +0 -0
- /package/dist/{chunk-33SY23DN.js.map → chunk-PPRKPC3X.js.map} +0 -0
- /package/dist/{chunk-ZHY3VDHD.js.map → chunk-ULFUYNP2.js.map} +0 -0
- /package/dist/{chunk-DYZC2NKL.js.map → chunk-UM7HVOZD.js.map} +0 -0
- /package/dist/{chunk-UMLZEYD5.js.map → chunk-XEP35Z6H.js.map} +0 -0
- /package/dist/{chunk-C2T2YAFC.js.map → chunk-YLSD5KM6.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/contexts/PushNotificationsV2/index.tsx","../../../src/contexts/PushNotificationsV2/urlBase64ToUint8Array.ts","../../../src/contexts/PushNotificationsV2/resolveWebPushSubscription.ts","../../../src/contexts/PushNotificationsV2/types.ts"],"names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","urlBase64ToUint8Array","base64String","padding","base64","rawData","outputArray","i","resolveWebPushSubscription","vapidKey","serviceWorkerPath","serviceWorkerFile","registration","MessageStatusV2","PushChannel","jsx","MAX_PROCESSED_IDS","PushNotificationV2Context","PushNotificationV2Provider","children","originId","originType","apiAdapters","onError","contextKey","clientId","setClientId","channel","setChannel","isRegistering","setIsRegistering","isRegisterError","setIsRegisterError","newMessageCount","setNewMessageCount","clientIdRef","processedIdsRef","topicHandlersRef","hasRegisteredRef","registeredKeyRef","subscribedTopicsRef","deliver","message","processedIds","oldest","prev","handler","error","performRegistration","previousClientId","subscription","keys","payload","id","registerClient","subscribedTopicsOf","forgetSubscribedTopics","topics","topic","subscribeTopicsBatch","subscribedTopics","pendingTopics","unsubscribeTopicsBatch","subscribeToTopic","unsubscribeFromTopic","on","handlers","currentHandlers","resetMessageCount","performRegistrationRef","event","data","unsubscribe","isLoading","value","usePushNotificationsV2","context","usePushTopic","handlerRef"],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { resolveWebPushSubscription } from './resolveWebPushSubscription';\nimport {\n ClientRegistrationPayloadV2,\n MessageStatusV2,\n PushChannel,\n PushMessageHandler,\n PushMessageV2,\n PushNotificationV2ContextData,\n PushNotificationV2ProviderProps,\n} from './types';\n\nconst MAX_PROCESSED_IDS = 500;\n\nconst PushNotificationV2Context = createContext<\n PushNotificationV2ContextData | undefined\n>(undefined);\n\nexport const PushNotificationV2Provider = ({\n children,\n originId,\n originType,\n vapidKey,\n serviceWorkerPath = '/',\n serviceWorkerFile = 'service-worker.js',\n apiAdapters,\n onError,\n contextKey,\n}: PushNotificationV2ProviderProps) => {\n const [clientId, setClientId] = useState<string | null>(null);\n const [channel, setChannel] = useState<PushChannel | null>(null);\n const [isRegistering, setIsRegistering] = useState<boolean>(false);\n const [isRegisterError, setIsRegisterError] = useState<boolean>(false);\n const [newMessageCount, setNewMessageCount] = useState<number>(0);\n\n const clientIdRef = useRef<string | null>(null);\n const processedIdsRef = useRef<Set<string>>(new Set());\n const topicHandlersRef = useRef<Map<string, Set<PushMessageHandler>>>(\n new Map(),\n );\n const hasRegisteredRef = useRef<boolean>(false);\n const registeredKeyRef = useRef<string | undefined>(undefined);\n const subscribedTopicsRef = useRef<{\n clientId: string | null;\n topics: Set<string>;\n }>({ clientId: null, topics: new Set() });\n\n const deliver = useCallback(\n (message: PushMessageV2) => {\n if (!message?.id || processedIdsRef.current.has(message.id)) {\n return;\n }\n\n const processedIds = processedIdsRef.current;\n\n if (processedIds.size >= MAX_PROCESSED_IDS) {\n const oldest = processedIds.values().next().value;\n\n if (oldest !== undefined) {\n processedIds.delete(oldest);\n }\n }\n\n processedIds.add(message.id);\n\n setNewMessageCount(prev => prev + 1);\n\n const handlers = topicHandlersRef.current.get(message.topic);\n handlers?.forEach(handler => handler(message));\n\n apiAdapters\n .updateMessageStatus(message.id, { status: MessageStatusV2.DELIVERED })\n .catch(error => onError?.(error as Error));\n },\n [apiAdapters, onError],\n );\n\n const performRegistration = useCallback(async (): Promise<string | null> => {\n setIsRegistering(true);\n\n const previousClientId = clientIdRef.current;\n\n try {\n const subscription = await resolveWebPushSubscription({\n vapidKey,\n serviceWorkerPath,\n serviceWorkerFile,\n });\n const keys = subscription?.toJSON().keys;\n\n const payload: ClientRegistrationPayloadV2 = {\n origin_type: originType,\n origin_id: originId,\n ...(subscription\n ? {\n endpoint: subscription.endpoint,\n auth: keys?.auth,\n p256dh: keys?.p256dh,\n }\n : {}),\n };\n\n const { id } = await apiAdapters.registerClient(payload);\n\n setClientId(id);\n clientIdRef.current = id;\n setIsRegisterError(false);\n setChannel(subscription ? PushChannel.WEBPUSH : PushChannel.STREAM);\n\n if (previousClientId && previousClientId !== id) {\n void apiAdapters\n .removeClient?.(previousClientId)\n .catch(error => onError?.(error as Error));\n }\n\n return id;\n } catch (error) {\n setIsRegisterError(true);\n onError?.(error as Error);\n\n return null;\n } finally {\n setIsRegistering(false);\n }\n }, [\n apiAdapters,\n onError,\n originId,\n originType,\n serviceWorkerFile,\n serviceWorkerPath,\n vapidKey,\n ]);\n\n const registerClient = useCallback(\n () => performRegistration(),\n [performRegistration],\n );\n\n const subscribedTopicsOf = useCallback((id: string) => {\n if (subscribedTopicsRef.current.clientId !== id) {\n subscribedTopicsRef.current = { clientId: id, topics: new Set() };\n }\n\n return subscribedTopicsRef.current.topics;\n }, []);\n\n const forgetSubscribedTopics = useCallback((id: string, topics: string[]) => {\n if (subscribedTopicsRef.current.clientId !== id) {\n return;\n }\n\n topics.forEach(topic => subscribedTopicsRef.current.topics.delete(topic));\n }, []);\n\n const subscribeTopicsBatch = useCallback(\n async (topics: string[]) => {\n if (!clientId || topics.length === 0) {\n return;\n }\n\n const subscribedTopics = subscribedTopicsOf(clientId);\n const pendingTopics = topics.filter(\n topic => !subscribedTopics.has(topic),\n );\n\n if (pendingTopics.length === 0) {\n return;\n }\n\n pendingTopics.forEach(topic => subscribedTopics.add(topic));\n\n try {\n await apiAdapters.subscribeTopicsBatch(clientId, pendingTopics);\n } catch (error) {\n forgetSubscribedTopics(clientId, pendingTopics);\n onError?.(error as Error);\n }\n },\n [\n apiAdapters,\n clientId,\n forgetSubscribedTopics,\n onError,\n subscribedTopicsOf,\n ],\n );\n\n const unsubscribeTopicsBatch = useCallback(\n async (topics: string[]) => {\n if (!clientId || topics.length === 0) {\n return;\n }\n\n forgetSubscribedTopics(clientId, topics);\n\n try {\n await apiAdapters.unsubscribeTopicsBatch(clientId, topics);\n } catch (error) {\n onError?.(error as Error);\n }\n },\n [apiAdapters, clientId, forgetSubscribedTopics, onError],\n );\n\n const subscribeToTopic = useCallback(\n (topic: string) => subscribeTopicsBatch([topic]),\n [subscribeTopicsBatch],\n );\n\n const unsubscribeFromTopic = useCallback(\n (topic: string) => unsubscribeTopicsBatch([topic]),\n [unsubscribeTopicsBatch],\n );\n\n const on = useCallback((topic: string, handler: PushMessageHandler) => {\n const handlers =\n topicHandlersRef.current.get(topic) ?? new Set<PushMessageHandler>();\n handlers.add(handler);\n topicHandlersRef.current.set(topic, handlers);\n\n return () => {\n const currentHandlers = topicHandlersRef.current.get(topic);\n\n if (!currentHandlers) {\n return;\n }\n\n currentHandlers.delete(handler);\n\n if (currentHandlers.size === 0) {\n topicHandlersRef.current.delete(topic);\n }\n };\n }, []);\n\n const resetMessageCount = useCallback(() => {\n setNewMessageCount(0);\n }, []);\n\n const performRegistrationRef = useRef(performRegistration);\n performRegistrationRef.current = performRegistration;\n\n useEffect(() => {\n if (hasRegisteredRef.current && registeredKeyRef.current === contextKey) {\n return;\n }\n\n hasRegisteredRef.current = true;\n registeredKeyRef.current = contextKey;\n\n void performRegistrationRef.current();\n }, [contextKey]);\n\n useEffect(() => {\n if (channel !== PushChannel.WEBPUSH || !('serviceWorker' in navigator)) {\n return;\n }\n\n const handler = (event: MessageEvent) => {\n const data = event.data as\n | { id?: string; topic?: string; payload?: unknown }\n | undefined;\n\n if (!data?.id || data.payload === undefined) {\n return;\n }\n\n deliver({ id: data.id, topic: data.topic ?? '', payload: data.payload });\n };\n\n navigator.serviceWorker.addEventListener('message', handler);\n\n return () => {\n navigator.serviceWorker.removeEventListener('message', handler);\n };\n }, [channel, deliver]);\n\n useEffect(() => {\n if (channel !== PushChannel.STREAM || !clientId) {\n return;\n }\n\n const unsubscribe = apiAdapters.subscribeToStream(clientId, deliver);\n\n return () => {\n unsubscribe();\n };\n }, [apiAdapters, channel, clientId, deliver]);\n\n const isLoading = useMemo(\n () => !clientId || isRegistering,\n [clientId, isRegistering],\n );\n\n const value: PushNotificationV2ContextData = useMemo(\n () => ({\n clientId,\n channel,\n isLoading,\n isRegisterError,\n newMessageCount,\n resetMessageCount,\n registerClient,\n subscribeToTopic,\n unsubscribeFromTopic,\n subscribeTopicsBatch,\n unsubscribeTopicsBatch,\n on,\n }),\n [\n channel,\n clientId,\n isLoading,\n isRegisterError,\n newMessageCount,\n on,\n registerClient,\n resetMessageCount,\n subscribeToTopic,\n subscribeTopicsBatch,\n unsubscribeFromTopic,\n unsubscribeTopicsBatch,\n ],\n );\n\n return (\n <PushNotificationV2Context.Provider value={value}>\n {children}\n </PushNotificationV2Context.Provider>\n );\n};\n\nexport function usePushNotificationsV2(): PushNotificationV2ContextData {\n const context = useContext(PushNotificationV2Context);\n\n if (!context) {\n throw new Error(\n 'usePushNotificationsV2 precisa estar dentro de PushNotificationV2Provider',\n );\n }\n\n return context;\n}\n\nexport function usePushTopic<TPayload = unknown>(\n topic: string | null,\n handler: (message: PushMessageV2<TPayload>) => void,\n): void {\n const { on } = usePushNotificationsV2();\n const handlerRef = useRef(handler);\n\n handlerRef.current = handler;\n\n useEffect(() => {\n if (!topic) return undefined;\n\n return on(topic, message =>\n handlerRef.current(message as PushMessageV2<TPayload>),\n );\n }, [on, topic]);\n}\n\nexport type {\n ClientRegistrationPayloadV2,\n ClientRegistrationResultV2,\n MessageStatusPayloadV2,\n PushMessageHandler,\n PushMessageV2,\n PushNotificationApiAdaptersV2,\n PushNotificationV2ContextData,\n PushNotificationV2ProviderProps,\n} from './types';\nexport { MessageStatusV2, PushChannel } from './types';\n","export function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n","import { urlBase64ToUint8Array } from './urlBase64ToUint8Array';\n\ninterface ResolveWebPushSubscriptionParams {\n vapidKey: string;\n serviceWorkerPath: string;\n serviceWorkerFile: string;\n}\n\nexport async function resolveWebPushSubscription({\n vapidKey,\n serviceWorkerPath,\n serviceWorkerFile,\n}: ResolveWebPushSubscriptionParams): Promise<PushSubscription | null> {\n if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n return null;\n }\n\n try {\n const permission = await Notification.requestPermission();\n\n if (permission !== 'granted') {\n return null;\n }\n\n const registration = await navigator.serviceWorker.register(\n `${serviceWorkerPath}${serviceWorkerFile}`,\n );\n await navigator.serviceWorker.ready;\n\n return await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey) as BufferSource,\n });\n } catch {\n return null;\n }\n}\n","import { ReactNode } from 'react';\n\nexport interface PushMessageV2<TPayload = unknown> {\n id: string;\n topic: string;\n payload: TPayload;\n}\n\nexport enum MessageStatusV2 {\n DELIVERED = 'DELIVERED',\n}\n\nexport interface MessageStatusPayloadV2 {\n status: MessageStatusV2;\n}\n\nexport interface ClientRegistrationPayloadV2 {\n origin_type: string;\n origin_id: string;\n endpoint?: string;\n auth?: string;\n p256dh?: string;\n}\n\nexport interface ClientRegistrationResultV2 {\n id: string;\n}\n\nexport enum PushChannel {\n WEBPUSH = 'WEBPUSH',\n STREAM = 'STREAM',\n}\n\nexport type PushMessageHandler = (message: PushMessageV2) => void;\n\nexport interface PushNotificationApiAdaptersV2 {\n registerClient: (\n payload: ClientRegistrationPayloadV2,\n ) => Promise<ClientRegistrationResultV2>;\n\n removeClient?: (clientId: string) => Promise<void>;\n\n subscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;\n\n unsubscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;\n\n updateMessageStatus: (\n messageId: string,\n status: MessageStatusPayloadV2,\n ) => Promise<void>;\n\n subscribeToStream: (\n clientId: string,\n onMessage: PushMessageHandler,\n ) => () => void;\n}\n\nexport interface PushNotificationV2ProviderProps {\n children: ReactNode;\n originId: string;\n originType: string;\n vapidKey: string;\n serviceWorkerPath?: string;\n serviceWorkerFile?: string;\n apiAdapters: PushNotificationApiAdaptersV2;\n onError?: (error: Error) => void;\n contextKey?: string;\n}\n\nexport interface PushNotificationV2ContextData {\n clientId: string | null;\n channel: PushChannel | null;\n isLoading: boolean;\n isRegisterError: boolean;\n newMessageCount: number;\n resetMessageCount: () => void;\n registerClient: () => Promise<string | null>;\n subscribeToTopic: (topic: string) => Promise<void>;\n unsubscribeFromTopic: (topic: string) => Promise<void>;\n subscribeTopicsBatch: (topics: string[]) => Promise<void>;\n unsubscribeTopicsBatch: (topics: string[]) => Promise<void>;\n on: (topic: string, handler: PushMessageHandler) => () => void;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/contexts/PushNotificationsV2/index.tsx","../../../src/contexts/PushNotificationsV2/urlBase64ToUint8Array.ts","../../../src/contexts/PushNotificationsV2/resolveWebPushSubscription.ts","../../../src/contexts/PushNotificationsV2/types.ts"],"names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","urlBase64ToUint8Array","base64String","padding","base64","rawData","outputArray","i","resolveWebPushSubscription","vapidKey","serviceWorkerPath","serviceWorkerFile","registration","MessageStatusV2","PushChannel","Fragment","jsx","MAX_PROCESSED_IDS","PushNotificationV2Context","PushNotificationV2Root","children","originId","originType","apiAdapters","onError","contextKey","clientId","setClientId","channel","setChannel","isRegistering","setIsRegistering","isRegisterError","setIsRegisterError","newMessageCount","setNewMessageCount","clientIdRef","processedIdsRef","topicHandlersRef","hasRegisteredRef","registeredKeyRef","subscribedTopicsRef","deliver","message","processedIds","oldest","prev","handler","error","performRegistration","previousClientId","subscription","keys","payload","id","registerClient","subscribedTopicsOf","forgetSubscribedTopics","topics","topic","subscribeTopicsBatch","subscribedTopics","pendingTopics","unsubscribeTopicsBatch","subscribeToTopic","unsubscribeFromTopic","on","handlers","currentHandlers","resetMessageCount","performRegistrationRef","event","data","unsubscribe","isLoading","value","PushNotificationV2Provider","props","usePushNotificationsV2","context","usePushTopic","handlerRef"],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { resolveWebPushSubscription } from './resolveWebPushSubscription';\nimport {\n ClientRegistrationPayloadV2,\n MessageStatusV2,\n PushChannel,\n PushMessageHandler,\n PushMessageV2,\n PushNotificationV2ContextData,\n PushNotificationV2ProviderProps,\n} from './types';\n\nconst MAX_PROCESSED_IDS = 500;\n\nconst PushNotificationV2Context = createContext<\n PushNotificationV2ContextData | undefined\n>(undefined);\n\nconst PushNotificationV2Root = ({\n children,\n originId,\n originType,\n vapidKey,\n serviceWorkerPath = '/',\n serviceWorkerFile = 'service-worker.js',\n apiAdapters,\n onError,\n contextKey,\n}: PushNotificationV2ProviderProps) => {\n const [clientId, setClientId] = useState<string | null>(null);\n const [channel, setChannel] = useState<PushChannel | null>(null);\n const [isRegistering, setIsRegistering] = useState<boolean>(false);\n const [isRegisterError, setIsRegisterError] = useState<boolean>(false);\n const [newMessageCount, setNewMessageCount] = useState<number>(0);\n\n const clientIdRef = useRef<string | null>(null);\n const processedIdsRef = useRef<Set<string>>(new Set());\n const topicHandlersRef = useRef<Map<string, Set<PushMessageHandler>>>(\n new Map(),\n );\n const hasRegisteredRef = useRef<boolean>(false);\n const registeredKeyRef = useRef<string | undefined>(undefined);\n const subscribedTopicsRef = useRef<{\n clientId: string | null;\n topics: Set<string>;\n }>({ clientId: null, topics: new Set() });\n\n const deliver = useCallback(\n (message: PushMessageV2) => {\n if (!message?.id || processedIdsRef.current.has(message.id)) {\n return;\n }\n\n const processedIds = processedIdsRef.current;\n\n if (processedIds.size >= MAX_PROCESSED_IDS) {\n const oldest = processedIds.values().next().value;\n\n if (oldest !== undefined) {\n processedIds.delete(oldest);\n }\n }\n\n processedIds.add(message.id);\n\n setNewMessageCount(prev => prev + 1);\n\n const handlers = topicHandlersRef.current.get(message.topic);\n handlers?.forEach(handler => handler(message));\n\n apiAdapters\n .updateMessageStatus(message.id, { status: MessageStatusV2.DELIVERED })\n .catch(error => onError?.(error as Error));\n },\n [apiAdapters, onError],\n );\n\n const performRegistration = useCallback(async (): Promise<string | null> => {\n setIsRegistering(true);\n\n const previousClientId = clientIdRef.current;\n\n try {\n const subscription = await resolveWebPushSubscription({\n vapidKey,\n serviceWorkerPath,\n serviceWorkerFile,\n });\n const keys = subscription?.toJSON().keys;\n\n const payload: ClientRegistrationPayloadV2 = {\n origin_type: originType,\n origin_id: originId,\n ...(subscription\n ? {\n endpoint: subscription.endpoint,\n auth: keys?.auth,\n p256dh: keys?.p256dh,\n }\n : {}),\n };\n\n const { id } = await apiAdapters.registerClient(payload);\n\n setClientId(id);\n clientIdRef.current = id;\n setIsRegisterError(false);\n setChannel(subscription ? PushChannel.WEBPUSH : PushChannel.STREAM);\n\n if (previousClientId && previousClientId !== id) {\n void apiAdapters\n .removeClient?.(previousClientId)\n .catch(error => onError?.(error as Error));\n }\n\n return id;\n } catch (error) {\n setIsRegisterError(true);\n onError?.(error as Error);\n\n return null;\n } finally {\n setIsRegistering(false);\n }\n }, [\n apiAdapters,\n onError,\n originId,\n originType,\n serviceWorkerFile,\n serviceWorkerPath,\n vapidKey,\n ]);\n\n const registerClient = useCallback(\n () => performRegistration(),\n [performRegistration],\n );\n\n const subscribedTopicsOf = useCallback((id: string) => {\n if (subscribedTopicsRef.current.clientId !== id) {\n subscribedTopicsRef.current = { clientId: id, topics: new Set() };\n }\n\n return subscribedTopicsRef.current.topics;\n }, []);\n\n const forgetSubscribedTopics = useCallback((id: string, topics: string[]) => {\n if (subscribedTopicsRef.current.clientId !== id) {\n return;\n }\n\n topics.forEach(topic => subscribedTopicsRef.current.topics.delete(topic));\n }, []);\n\n const subscribeTopicsBatch = useCallback(\n async (topics: string[]) => {\n if (!clientId || topics.length === 0) {\n return;\n }\n\n const subscribedTopics = subscribedTopicsOf(clientId);\n const pendingTopics = topics.filter(\n topic => !subscribedTopics.has(topic),\n );\n\n if (pendingTopics.length === 0) {\n return;\n }\n\n pendingTopics.forEach(topic => subscribedTopics.add(topic));\n\n try {\n await apiAdapters.subscribeTopicsBatch(clientId, pendingTopics);\n } catch (error) {\n forgetSubscribedTopics(clientId, pendingTopics);\n onError?.(error as Error);\n }\n },\n [\n apiAdapters,\n clientId,\n forgetSubscribedTopics,\n onError,\n subscribedTopicsOf,\n ],\n );\n\n const unsubscribeTopicsBatch = useCallback(\n async (topics: string[]) => {\n if (!clientId || topics.length === 0) {\n return;\n }\n\n forgetSubscribedTopics(clientId, topics);\n\n try {\n await apiAdapters.unsubscribeTopicsBatch(clientId, topics);\n } catch (error) {\n onError?.(error as Error);\n }\n },\n [apiAdapters, clientId, forgetSubscribedTopics, onError],\n );\n\n const subscribeToTopic = useCallback(\n (topic: string) => subscribeTopicsBatch([topic]),\n [subscribeTopicsBatch],\n );\n\n const unsubscribeFromTopic = useCallback(\n (topic: string) => unsubscribeTopicsBatch([topic]),\n [unsubscribeTopicsBatch],\n );\n\n const on = useCallback((topic: string, handler: PushMessageHandler) => {\n const handlers =\n topicHandlersRef.current.get(topic) ?? new Set<PushMessageHandler>();\n handlers.add(handler);\n topicHandlersRef.current.set(topic, handlers);\n\n return () => {\n const currentHandlers = topicHandlersRef.current.get(topic);\n\n if (!currentHandlers) {\n return;\n }\n\n currentHandlers.delete(handler);\n\n if (currentHandlers.size === 0) {\n topicHandlersRef.current.delete(topic);\n }\n };\n }, []);\n\n const resetMessageCount = useCallback(() => {\n setNewMessageCount(0);\n }, []);\n\n const performRegistrationRef = useRef(performRegistration);\n performRegistrationRef.current = performRegistration;\n\n useEffect(() => {\n if (hasRegisteredRef.current && registeredKeyRef.current === contextKey) {\n return;\n }\n\n hasRegisteredRef.current = true;\n registeredKeyRef.current = contextKey;\n\n void performRegistrationRef.current();\n }, [contextKey]);\n\n useEffect(() => {\n if (channel !== PushChannel.WEBPUSH || !('serviceWorker' in navigator)) {\n return;\n }\n\n const handler = (event: MessageEvent) => {\n const data = event.data as\n | { id?: string; topic?: string; payload?: unknown }\n | undefined;\n\n if (!data?.id || data.payload === undefined) {\n return;\n }\n\n deliver({ id: data.id, topic: data.topic ?? '', payload: data.payload });\n };\n\n navigator.serviceWorker.addEventListener('message', handler);\n\n return () => {\n navigator.serviceWorker.removeEventListener('message', handler);\n };\n }, [channel, deliver]);\n\n useEffect(() => {\n if (channel !== PushChannel.STREAM || !clientId) {\n return;\n }\n\n const unsubscribe = apiAdapters.subscribeToStream(clientId, deliver);\n\n return () => {\n unsubscribe();\n };\n }, [apiAdapters, channel, clientId, deliver]);\n\n const isLoading = useMemo(\n () => !clientId || isRegistering,\n [clientId, isRegistering],\n );\n\n const value: PushNotificationV2ContextData = useMemo(\n () => ({\n clientId,\n channel,\n isLoading,\n isRegisterError,\n newMessageCount,\n resetMessageCount,\n registerClient,\n subscribeToTopic,\n unsubscribeFromTopic,\n subscribeTopicsBatch,\n unsubscribeTopicsBatch,\n on,\n }),\n [\n channel,\n clientId,\n isLoading,\n isRegisterError,\n newMessageCount,\n on,\n registerClient,\n resetMessageCount,\n subscribeToTopic,\n subscribeTopicsBatch,\n unsubscribeFromTopic,\n unsubscribeTopicsBatch,\n ],\n );\n\n return (\n <PushNotificationV2Context.Provider value={value}>\n {children}\n </PushNotificationV2Context.Provider>\n );\n};\n\nexport const PushNotificationV2Provider = (\n props: PushNotificationV2ProviderProps,\n) => {\n const enclosingProvider = useContext(PushNotificationV2Context);\n\n if (enclosingProvider) {\n return <>{props.children}</>;\n }\n\n return <PushNotificationV2Root {...props} />;\n};\n\nexport function usePushNotificationsV2(): PushNotificationV2ContextData {\n const context = useContext(PushNotificationV2Context);\n\n if (!context) {\n throw new Error(\n 'usePushNotificationsV2 precisa estar dentro de PushNotificationV2Provider',\n );\n }\n\n return context;\n}\n\nexport function usePushTopic<TPayload = unknown>(\n topic: string | null,\n handler: (message: PushMessageV2<TPayload>) => void,\n): void {\n const { on } = usePushNotificationsV2();\n const handlerRef = useRef(handler);\n\n handlerRef.current = handler;\n\n useEffect(() => {\n if (!topic) return undefined;\n\n return on(topic, message =>\n handlerRef.current(message as PushMessageV2<TPayload>),\n );\n }, [on, topic]);\n}\n\nexport type {\n ClientRegistrationPayloadV2,\n ClientRegistrationResultV2,\n MessageStatusPayloadV2,\n PushMessageHandler,\n PushMessageV2,\n PushNotificationApiAdaptersV2,\n PushNotificationV2ContextData,\n PushNotificationV2ProviderProps,\n} from './types';\nexport { MessageStatusV2, PushChannel } from './types';\n","export function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n","import { urlBase64ToUint8Array } from './urlBase64ToUint8Array';\n\ninterface ResolveWebPushSubscriptionParams {\n vapidKey: string;\n serviceWorkerPath: string;\n serviceWorkerFile: string;\n}\n\nexport async function resolveWebPushSubscription({\n vapidKey,\n serviceWorkerPath,\n serviceWorkerFile,\n}: ResolveWebPushSubscriptionParams): Promise<PushSubscription | null> {\n if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n return null;\n }\n\n try {\n const permission = await Notification.requestPermission();\n\n if (permission !== 'granted') {\n return null;\n }\n\n const registration = await navigator.serviceWorker.register(\n `${serviceWorkerPath}${serviceWorkerFile}`,\n );\n await navigator.serviceWorker.ready;\n\n return await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey) as BufferSource,\n });\n } catch {\n return null;\n }\n}\n","import { ReactNode } from 'react';\n\nexport interface PushMessageV2<TPayload = unknown> {\n id: string;\n topic: string;\n payload: TPayload;\n}\n\nexport enum MessageStatusV2 {\n DELIVERED = 'DELIVERED',\n}\n\nexport interface MessageStatusPayloadV2 {\n status: MessageStatusV2;\n}\n\nexport interface ClientRegistrationPayloadV2 {\n origin_type: string;\n origin_id: string;\n endpoint?: string;\n auth?: string;\n p256dh?: string;\n}\n\nexport interface ClientRegistrationResultV2 {\n id: string;\n}\n\nexport enum PushChannel {\n WEBPUSH = 'WEBPUSH',\n STREAM = 'STREAM',\n}\n\nexport type PushMessageHandler = (message: PushMessageV2) => void;\n\nexport interface PushNotificationApiAdaptersV2 {\n registerClient: (\n payload: ClientRegistrationPayloadV2,\n ) => Promise<ClientRegistrationResultV2>;\n\n removeClient?: (clientId: string) => Promise<void>;\n\n subscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;\n\n unsubscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;\n\n updateMessageStatus: (\n messageId: string,\n status: MessageStatusPayloadV2,\n ) => Promise<void>;\n\n subscribeToStream: (\n clientId: string,\n onMessage: PushMessageHandler,\n ) => () => void;\n}\n\nexport interface PushNotificationV2ProviderProps {\n children: ReactNode;\n originId: string;\n originType: string;\n vapidKey: string;\n serviceWorkerPath?: string;\n serviceWorkerFile?: string;\n apiAdapters: PushNotificationApiAdaptersV2;\n onError?: (error: Error) => void;\n contextKey?: string;\n}\n\nexport interface PushNotificationV2ContextData {\n clientId: string | null;\n channel: PushChannel | null;\n isLoading: boolean;\n isRegisterError: boolean;\n newMessageCount: number;\n resetMessageCount: () => void;\n registerClient: () => Promise<string | null>;\n subscribeToTopic: (topic: string) => Promise<void>;\n unsubscribeFromTopic: (topic: string) => Promise<void>;\n subscribeTopicsBatch: (topics: string[]) => Promise<void>;\n unsubscribeTopicsBatch: (topics: string[]) => Promise<void>;\n on: (topic: string, handler: PushMessageHandler) => () => void;\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export { a as useThemeToggle } from '../chunk-5KEVIB7P.js';
|
|
2
|
-
import '../chunk-
|
|
2
|
+
import '../chunk-BPBZFCMO.js';
|
|
3
3
|
import '../chunk-373WGZZL.js';
|
|
4
|
-
import '../chunk-WUFEPE2G.js';
|
|
5
4
|
import '../chunk-BX2DSNRV.js';
|
|
6
5
|
import '../chunk-BKL525ZD.js';
|
|
7
6
|
import '../chunk-7GJMLPJV.js';
|
|
8
7
|
import '../chunk-LNESYSHP.js';
|
|
9
8
|
import '../chunk-4734QSYC.js';
|
|
10
9
|
import '../chunk-HBOBTNB5.js';
|
|
10
|
+
import '../chunk-WUFEPE2G.js';
|
|
11
11
|
import '../chunk-Y66XXBB3.js';
|
|
12
12
|
//# sourceMappingURL=useThemeToggle.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export { a as useThemeToggle } from './chunk-5KEVIB7P.js';
|
|
2
|
-
export { b as ThemeProvider, a as createTheme } from './chunk-
|
|
2
|
+
export { b as ThemeProvider, a as createTheme } from './chunk-BPBZFCMO.js';
|
|
3
3
|
import './chunk-373WGZZL.js';
|
|
4
|
-
import './chunk-WUFEPE2G.js';
|
|
5
4
|
export { c as SettingsProvider, b as useSettingsContext } from './chunk-BX2DSNRV.js';
|
|
6
5
|
export { b as defaultFont, c as primaryFont, d as secondaryFont, a as shadows, e as typography } from './chunk-BKL525ZD.js';
|
|
7
6
|
import './chunk-7GJMLPJV.js';
|
|
8
7
|
import './chunk-LNESYSHP.js';
|
|
9
8
|
export { l as action, k as background, m as basePalette, p as colorSchemes, i as common, a as components, q as createShadowColor, r as customShadows, o as darkPalette, h as error, b as grey, e as info, n as lightPalette, c as primary, d as secondary, f as success, j as text, g as warning } from './chunk-4734QSYC.js';
|
|
10
9
|
import './chunk-HBOBTNB5.js';
|
|
10
|
+
import './chunk-WUFEPE2G.js';
|
|
11
11
|
export { a as THEME_CONFIG, q as bgBlur, p as bgGradient, o as borderGradient, j as createPaletteChannel, h as hexToRgbChannel, i as hexToRgbaChannel, l as hideScrollX, m as hideScrollY, r as maxLine, c as mediaQueries, t as menuItem, s as paper, f as pxToRem, e as remToPx, g as responsiveFontSizes, d as setFont, b as stylesMode, n as textGradient, k as varAlpha, u as whenAutoFilled } from './chunk-Y66XXBB3.js';
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export { b as default } from '../chunk-
|
|
1
|
+
export { b as default } from '../chunk-BPBZFCMO.js';
|
|
2
2
|
import '../chunk-373WGZZL.js';
|
|
3
|
-
import '../chunk-WUFEPE2G.js';
|
|
4
3
|
export { b as useSettingsContext } from '../chunk-BX2DSNRV.js';
|
|
5
4
|
import '../chunk-BKL525ZD.js';
|
|
6
5
|
import '../chunk-7GJMLPJV.js';
|
|
7
6
|
import '../chunk-LNESYSHP.js';
|
|
8
7
|
import '../chunk-4734QSYC.js';
|
|
9
8
|
import '../chunk-HBOBTNB5.js';
|
|
9
|
+
import '../chunk-WUFEPE2G.js';
|
|
10
10
|
export { a as THEME_CONFIG } from '../chunk-Y66XXBB3.js';
|
|
11
11
|
//# sourceMappingURL=theme-provider.js.map
|
package/dist/utils/consoleLog.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
export { a as consoleLog } from '../chunk-GPFANUMT.js';
|
|
2
1
|
import '../chunk-TVKBRJHF.js';
|
|
2
|
+
|
|
3
|
+
var E=({type:l,environment:o,message:n,data:r,args:e})=>{let c=process.env.NODE_ENV||"development";if(!(Array.isArray(o)?o:[o]).includes(c))return;let s={["LOG"]:console.log,["WARN"]:console.warn,["ERROR"]:console.error}[l];e!==void 0&&e.length>0?s(n,...e):r!==void 0?s(n,r):s(n);};
|
|
4
|
+
|
|
5
|
+
export { E as consoleLog };
|
|
3
6
|
//# sourceMappingURL=consoleLog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/consoleLog.ts"],"names":["consoleLog","type","environment","message","data","args","currentEnv","consoleMethod"],"mappings":"6BAGO,IAAMA,EAAa,CAAC,CACzB,KAAAC,EACA,YAAAC,EACA,QAAAC,EACA,KAAAC,EACA,KAAAC,CACF,IAA6B,CAC3B,IAAMC,EACH,QAAQ,IAAI,wBAIf,GAAI,EAHiB,MAAM,QAAQJ,CAAW,EAAIA,EAAc,CAACA,CAAW,GAC7C,SAASI,CAAU,EAGhD,OAGF,IAAMC,EAAgB,CACpB,MAAgB,EAAG,QAAQ,IAC3B,OAAiB,EAAG,QAAQ,KAC5B,QAAkB,EAAG,QAAQ,KAC/B,EAAEN,CAAI,EAEFI,IAAS,QAAaA,EAAK,OAAS,EACtCE,EAAcJ,EAAS,GAAGE,CAAI,EACrBD,IAAS,OAClBG,EAAcJ,EAASC,CAAI,EAE3BG,EAAcJ,CAAO,CAEzB","sourcesContent":["/* eslint-disable no-console */\nimport { ConsoleLogProps, ConsoleType, Environment } from 'types/consoleLog';\n\nexport const consoleLog = ({\n type,\n environment,\n message,\n data,\n args,\n}: ConsoleLogProps): void => {\n const currentEnv =\n (process.env.NODE_ENV as Environment) || Environment.DEVELOPMENT;\n const environments = Array.isArray(environment) ? environment : [environment];\n const shouldLog = environments.includes(currentEnv);\n\n if (!shouldLog) {\n return;\n }\n\n const consoleMethod = {\n [ConsoleType.LOG]: console.log,\n [ConsoleType.WARN]: console.warn,\n [ConsoleType.ERROR]: console.error,\n }[type];\n\n if (args !== undefined && args.length > 0) {\n consoleMethod(message, ...args);\n } else if (data !== undefined) {\n consoleMethod(message, data);\n } else {\n consoleMethod(message);\n }\n};\n"]}
|
package/package.json
CHANGED
package/dist/chunk-GPFANUMT.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
var E=({type:l,environment:o,message:n,data:r,args:e})=>{let c=process.env.NODE_ENV||"development";if(!(Array.isArray(o)?o:[o]).includes(c))return;let s={["LOG"]:console.log,["WARN"]:console.warn,["ERROR"]:console.error}[l];e!==void 0&&e.length>0?s(n,...e):r!==void 0?s(n,r):s(n);};
|
|
2
|
-
|
|
3
|
-
export { E as a };
|
|
4
|
-
//# sourceMappingURL=chunk-GPFANUMT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/consoleLog.ts"],"names":["consoleLog","type","environment","message","data","args","currentEnv","consoleMethod"],"mappings":"AAGO,IAAMA,EAAa,CAAC,CACzB,KAAAC,EACA,YAAAC,EACA,QAAAC,EACA,KAAAC,EACA,KAAAC,CACF,IAA6B,CAC3B,IAAMC,EACH,QAAQ,IAAI,wBAIf,GAAI,EAHiB,MAAM,QAAQJ,CAAW,EAAIA,EAAc,CAACA,CAAW,GAC7C,SAASI,CAAU,EAGhD,OAGF,IAAMC,EAAgB,CACpB,MAAgB,EAAG,QAAQ,IAC3B,OAAiB,EAAG,QAAQ,KAC5B,QAAkB,EAAG,QAAQ,KAC/B,EAAEN,CAAI,EAEFI,IAAS,QAAaA,EAAK,OAAS,EACtCE,EAAcJ,EAAS,GAAGE,CAAI,EACrBD,IAAS,OAClBG,EAAcJ,EAASC,CAAI,EAE3BG,EAAcJ,CAAO,CAEzB","sourcesContent":["/* eslint-disable no-console */\nimport { ConsoleLogProps, ConsoleType, Environment } from 'types/consoleLog';\n\nexport const consoleLog = ({\n type,\n environment,\n message,\n data,\n args,\n}: ConsoleLogProps): void => {\n const currentEnv =\n (process.env.NODE_ENV as Environment) || Environment.DEVELOPMENT;\n const environments = Array.isArray(environment) ? environment : [environment];\n const shouldLog = environments.includes(currentEnv);\n\n if (!shouldLog) {\n return;\n }\n\n const consoleMethod = {\n [ConsoleType.LOG]: console.log,\n [ConsoleType.WARN]: console.warn,\n [ConsoleType.ERROR]: console.error,\n }[type];\n\n if (args !== undefined && args.length > 0) {\n consoleMethod(message, ...args);\n } else if (data !== undefined) {\n consoleMethod(message, data);\n } else {\n consoleMethod(message);\n }\n};\n"]}
|
package/dist/chunk-RP7PNTLJ.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/urlBase64ToUint8Array.ts"],"names":["urlBase64ToUint8Array","base64String","padding","base64","rawData","outputArray","i"],"mappings":"AAAO,SAASA,EAAsBC,EAAkC,CACtE,IAAMC,EAAU,IAAI,QAAQ,EAAKD,EAAa,OAAS,GAAM,CAAC,EACxDE,GAAUF,EAAeC,GAAS,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EAEtEE,EAAU,OAAO,KAAKD,CAAM,EAC5BE,EAAc,IAAI,WAAWD,EAAQ,MAAM,EACjD,QAASE,EAAI,EAAGA,EAAIF,EAAQ,OAAQ,EAAEE,EACpCD,EAAYC,CAAC,EAAIF,EAAQ,WAAWE,CAAC,EAEvC,OAAOD,CACT","sourcesContent":["export function urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n"]}
|
package/dist/chunk-WMHH24KM.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/pushNotifications.ts"],"names":["MessageStatus"],"mappings":"AA+BO,IAAKA,OACVA,EAAA,KAAO,OACPA,EAAA,UAAY,YACZA,EAAA,KAAO,OAHGA,OAAA","sourcesContent":["import { ReactNode } from 'react';\n\nexport interface PushMessage<TPayload = unknown> {\n message: string;\n topic: string;\n updatedAt: string;\n createdAt: string;\n payload: TPayload;\n id: string;\n}\n\nexport interface SubscriptionItem {\n topic: string;\n}\n\nexport interface SubscriptionsData {\n subscriptions: SubscriptionItem[];\n}\n\nexport interface ClientRegistrationPayload {\n origin_type: string;\n origin_id: string;\n endpoint?: string;\n auth?: string;\n p256dh?: string;\n}\n\nexport interface ClientRegistrationResult {\n id: string;\n}\n\nexport enum MessageStatus {\n SENT = 'SENT',\n DELIVERED = 'DELIVERED',\n READ = 'READ',\n}\n\nexport interface MessageStatusPayload {\n status: MessageStatus;\n}\n\nexport interface PushNotificationApiAdapters<TMessage = unknown> {\n // Registra um cliente no serviço de push\n registerClient: (\n payload: ClientRegistrationPayload,\n ) => Promise<ClientRegistrationResult>;\n\n // Inscreve o cliente em um tópico\n subscribeTopic: (clientId: string, topic: string) => Promise<void>;\n\n // Remove inscrição de um tópico\n unsubscribeTopic: (clientId: string, topic: string) => Promise<void>;\n\n // Inscreve o cliente em múltiplos tópicos\n subscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;\n\n // Remove inscrição de múltiplos tópicos\n unsubscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;\n\n // Lista as inscrições do cliente\n listSubscriptions: (clientId: string) => Promise<SubscriptionsData>;\n\n // Busca mensagens pendentes (usado para polling fallback)\n fetchMessages?: (\n clientId: string,\n ) => Promise<{ messages: PushMessage<TMessage>[] }>;\n\n // Atualiza o status de uma mensagem\n updateMessageStatus: (\n messageId: string,\n status: MessageStatusPayload,\n ) => Promise<void>;\n}\n\nexport interface PushNotificationProviderProps<TMessage = unknown> {\n children: ReactNode;\n\n // Token de autenticação para validar o usuário\n bearerToken: string;\n\n // ID único da origem (ex: userId, sessionId)\n originId: string;\n\n // Tipo da origem (ex: 'ADMIN', 'CLIENT', 'MOBILE')\n originType: string;\n\n // Chave pública VAPID para Push API\n vapidKey: string;\n\n // Caminho base do service worker (padrão: '/')\n serviceWorkerPath?: string;\n\n // Nome do arquivo do service worker (padrão: 'service-worker.js')\n serviceWorkerFile?: string;\n\n // Intervalo de polling em ms para clientes ativos (padrão: 1000)\n pollingInterval?: number;\n\n // Adapters para chamadas de API (implementados pelo MFE)\n apiAdapters: PushNotificationApiAdapters<TMessage>;\n\n // Callback chamado quando uma mensagem é recebida\n onMessageReceived?: (message: TMessage, topic?: string) => void;\n\n // Callback chamado quando ocorre um erro\n onError?: (error: Error) => void;\n}\n\nexport interface TopicSubscriptionOptions {\n stopPollingOnFirstMessage?: boolean;\n}\n\nexport interface PushNotificationContextData {\n clientId: string | null;\n subscribedTopics: SubscriptionsData;\n isLoading: boolean;\n newMessageCount: number;\n isRegisterError: boolean;\n subscribeToTopic: (\n topic: string,\n options?: TopicSubscriptionOptions,\n ) => Promise<void>;\n unsubscribeFromTopic: (topic: string) => Promise<void>;\n subscribeTopicsBatch: (topics: string[]) => Promise<void>;\n unsubscribeTopicsBatch: (topics: string[]) => Promise<void>;\n resetMessageCount: () => void;\n registerClient: () => Promise<string | null>;\n}\n"]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { PropsWithChildren } from 'react';
|
|
3
|
-
import { MessagesContextData } from '../../types/messages.js';
|
|
4
|
-
|
|
5
|
-
declare const MessagesProvider: ({ children }: PropsWithChildren) => react_jsx_runtime.JSX.Element;
|
|
6
|
-
declare const useMessages: () => MessagesContextData;
|
|
7
|
-
|
|
8
|
-
export { MessagesProvider, useMessages };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { a } from '../../chunk-F6H765KA.js';
|
|
2
|
-
import { createContext, useState, useCallback, useMemo, useContext } from 'react';
|
|
3
|
-
import { jsx } from 'react/jsx-runtime';
|
|
4
|
-
|
|
5
|
-
var l=createContext(void 0),w=({children:o})=>{let[s,a$1]=useState([]),g=useCallback(e=>{let n={id:a(),payload:e,receivedAt:Date.now(),processed:!1};a$1(t=>[...t,n]);},[]),d=useCallback(e=>{a$1(n=>n.map(t=>t.id===e?{...t,processed:!0}:t));},[]),i=useCallback(()=>{a$1([]);},[]),c=useCallback(e=>s.filter(e),[s]),M=useMemo(()=>s.filter(e=>!e.processed),[s]),m=useMemo(()=>({messages:s,unprocessedMessages:M,addMessage:g,markAsProcessed:d,clearMessages:i,getMessagesByType:c}),[s,M,g,d,i,c]);return jsx(l.Provider,{value:m,children:o})},y=()=>{let o=useContext(l);if(!o)throw new Error("useMessages must be used within MessagesProvider");return o};
|
|
6
|
-
|
|
7
|
-
export { w as MessagesProvider, y as useMessages };
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/contexts/Messages/index.tsx"],"names":["createContext","useCallback","useContext","useMemo","useState","jsx","MessagesContext","MessagesProvider","children","messages","setMessages","addMessage","payload","message","uuidv4","prev","markAsProcessed","id","msg","clearMessages","getMessagesByType","filter","unprocessedMessages","value","useMessages","context"],"mappings":"4CAAA,OACE,iBAAAA,EAEA,eAAAC,EACA,cAAAC,EACA,WAAAC,EACA,YAAAC,MACK,QAiEH,cAAAC,MAAA,oBA5DJ,IAAMC,EAAkBN,EACtB,MACF,EAEaO,EAAmB,CAAC,CAAE,SAAAC,CAAS,IAAyB,CACnE,GAAM,CAACC,EAAUC,CAAW,EAAIN,EAAoB,CAAC,CAAC,EAEhDO,EAAaV,EAAaW,GAAqB,CACnD,IAAMC,EAAmB,CACvB,GAAIC,EAAO,EACX,QAAAF,EACA,WAAY,KAAK,IAAI,EACrB,UAAW,EACb,EAEAF,EAAYK,GAAQ,CAAC,GAAGA,EAAMF,CAAO,CAAC,CACxC,EAAG,CAAC,CAAC,EAECG,EAAkBf,EAAagB,GAAe,CAClDP,EAAYK,GACVA,EAAK,IAAIG,GAAQA,EAAI,KAAOD,EAAK,CAAE,GAAGC,EAAK,UAAW,EAAK,EAAIA,CAAI,CACrE,CACF,EAAG,CAAC,CAAC,EAECC,EAAgBlB,EAAY,IAAM,CACtCS,EAAY,CAAC,CAAC,CAChB,EAAG,CAAC,CAAC,EAECU,EAAoBnB,EACnBoB,GACIZ,EAAS,OAAOY,CAAM,EAE/B,CAACZ,CAAQ,CACX,EAEMa,EAAsBnB,EAC1B,IAAMM,EAAS,OAAOS,GAAO,CAACA,EAAI,SAAS,EAC3C,CAACT,CAAQ,CACX,EAEMc,EAAQpB,EACZ,KAAO,CACL,SAAAM,EACA,oBAAAa,EACA,WAAAX,EACA,gBAAAK,EACA,cAAAG,EACA,kBAAAC,CACF,GACA,CACEX,EACAa,EACAX,EACAK,EACAG,EACAC,CACF,CACF,EAEA,OACEf,EAACC,EAAgB,SAAhB,CAAyB,MAAOiB,EAC9B,SAAAf,EACH,CAEJ,EAEagB,EAAc,IAAM,CAC/B,IAAMC,EAAUvB,EAAWI,CAAe,EAE1C,GAAI,CAACmB,EACH,MAAM,IAAI,MAAM,kDAAkD,EAGpE,OAAOA,CACT","sourcesContent":["import {\n createContext,\n type PropsWithChildren,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from 'react';\n\nimport type { Message, MessagesContextData } from 'types/messages';\nimport uuidv4 from 'utils/uuidv4';\n\nconst MessagesContext = createContext<MessagesContextData | undefined>(\n undefined,\n);\n\nexport const MessagesProvider = ({ children }: PropsWithChildren) => {\n const [messages, setMessages] = useState<Message[]>([]);\n\n const addMessage = useCallback((payload: unknown) => {\n const message: Message = {\n id: uuidv4(),\n payload,\n receivedAt: Date.now(),\n processed: false,\n };\n\n setMessages(prev => [...prev, message]);\n }, []);\n\n const markAsProcessed = useCallback((id: string) => {\n setMessages(prev =>\n prev.map(msg => (msg.id === id ? { ...msg, processed: true } : msg)),\n );\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n }, []);\n\n const getMessagesByType = useCallback(\n <T,>(filter: (msg: Message) => boolean): Message<T>[] => {\n return messages.filter(filter) as Message<T>[];\n },\n [messages],\n );\n\n const unprocessedMessages = useMemo(\n () => messages.filter(msg => !msg.processed),\n [messages],\n );\n\n const value = useMemo(\n () => ({\n messages,\n unprocessedMessages,\n addMessage,\n markAsProcessed,\n clearMessages,\n getMessagesByType,\n }),\n [\n messages,\n unprocessedMessages,\n addMessage,\n markAsProcessed,\n clearMessages,\n getMessagesByType,\n ],\n );\n\n return (\n <MessagesContext.Provider value={value}>\n {children}\n </MessagesContext.Provider>\n );\n};\n\nexport const useMessages = () => {\n const context = useContext(MessagesContext);\n\n if (!context) {\n throw new Error('useMessages must be used within MessagesProvider');\n }\n\n return context;\n};\n"]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { PushNotificationProviderProps, PushNotificationContextData } from '../../types/pushNotifications.js';
|
|
3
|
-
import 'react';
|
|
4
|
-
|
|
5
|
-
declare const PushNotificationProvider: <TMessage = unknown>({ children, originId, originType, bearerToken, vapidKey, serviceWorkerPath, serviceWorkerFile, pollingInterval, apiAdapters, onMessageReceived, onError, }: PushNotificationProviderProps<TMessage>) => react_jsx_runtime.JSX.Element;
|
|
6
|
-
declare function usePushNotifications(): PushNotificationContextData;
|
|
7
|
-
|
|
8
|
-
export { PushNotificationProvider, usePushNotifications };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { a as a$1 } from '../../chunk-RP7PNTLJ.js';
|
|
2
|
-
import { a } from '../../chunk-GPFANUMT.js';
|
|
3
|
-
import '../../chunk-WMHH24KM.js';
|
|
4
|
-
import '../../chunk-TVKBRJHF.js';
|
|
5
|
-
import { createContext, useState, useRef, useMemo, useEffect, useCallback, useContext } from 'react';
|
|
6
|
-
import { jsx } from 'react/jsx-runtime';
|
|
7
|
-
|
|
8
|
-
var te=createContext(void 0),ge=({children:v,originId:A,originType:x,bearerToken:se,vapidKey:h,serviceWorkerPath:b="/",serviceWorkerFile:N="service-worker.js",pollingInterval:W=1e3,apiAdapters:n,onMessageReceived:P,onError:o})=>{let[s,M]=useState(null),[B,g]=useState(!1),[$,I]=useState(!1),[T,ie]=useState(!1),[q,S]=useState(0),[C]=useState(new Set),[y,re]=useState({subscriptions:[]}),[z,_]=useState(!1),[R,V]=useState(!1),[L,E]=useState(!1),d=useRef(new Map),j=useMemo(()=>!s||z||B,[s,z,B]);useEffect(()=>{if(!R||!L||!s||!n.fetchMessages||y.subscriptions.length===0)return;let e=setInterval(async()=>{try{let a$1=((await n.fetchMessages(s))?.messages??[]).filter(i=>!(!i?.payload||C.has(i.id)));if(a$1.length===0)return;a$1.forEach(i=>{C.add(i.id),P?.(i.payload,i.topic);}),S(i=>i+a$1.length);try{(await Promise.allSettled(a$1.map(u=>n.updateMessageStatus(u.id,{status:"DELIVERED"})))).forEach(u=>{u.status==="rejected"&&a({type:"ERROR",environment:["development","homologation"],message:"Erro ao marcar mensagem como entregue:",data:u.reason});});}finally{new Set(a$1.map(m=>m.topic).filter(Boolean)).forEach(m=>{d.current.get(m)?.stopPollingOnFirstMessage&&d.current.delete(m);}),y.subscriptions.length>0||(V(!1),E(!1));}}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao buscar mensagens:",data:t});}},W);return ()=>clearInterval(e)},[n,s,P,R,W,C,L,y.subscriptions.length]);let p=useCallback(async(e,t)=>{g(!0);try{let c=e?.toJSON().keys,a={origin_type:x,origin_id:A,...t&&e?{endpoint:e.endpoint,auth:c?.auth,p256dh:c?.p256dh}:{}},i=await n.registerClient(a);return M(i.id),I(!1),ie(t),t||E(!0),i.id}catch(c){return a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente:",data:c}),I(!0),o?.(c),null}finally{g(!1);}},[n,o,A,x]);useEffect(()=>{let e=!0,t=null;async function c(){if(g(!0),!("serviceWorker"in navigator)||!("PushManager"in window)){a({type:"WARN",environment:["development","homologation"],message:"Push notifications n\xE3o suportadas, criando cliente ativo com polling"});try{let a=await p(null,!1);e&&a&&(M(a),E(!0));}catch(a$1){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente ativo:",data:a$1}),o?.(a$1);}finally{g(!1);}return}try{let a$2=await Notification.requestPermission(),i=null,u=!1;if(a$2==="granted")try{let w=await navigator.serviceWorker.register(`${b}${N}`);if(!e||(await navigator.serviceWorker.ready,!e))return;i=await w.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a$1(h)}),t=async G=>{let Z=G.data?.payload,K=G.data?.id;if(Z&&(S(D=>D+1),P?.(Z,G.data?.topic)),K)try{await n.updateMessageStatus(K,{status:"DELIVERED"});}catch(D){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao atualizar status da mensagem:",data:D}),I(!0),o?.(D);}},navigator.serviceWorker.addEventListener("message",t),u=!0,a({type:"LOG",environment:["development","homologation"],message:"Permiss\xE3o concedida, criando cliente passivo (aguarda webpush)"});}catch(w){a({type:"WARN",environment:["development","homologation"],message:"Falha ao configurar push subscription, criando cliente ativo:",data:w}),u=!1;}else a({type:"WARN",environment:["development","homologation"],message:"Permiss\xE3o de notifica\xE7\xE3o negada, criando cliente ativo com polling"}),u=!1;let m=await p(i,u);e&&m&&(M(m),u||E(!0));}catch(a$1){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inicializar notifica\xE7\xF5es:",data:a$1}),o?.(a$1);try{let i=await p(null,!1);e&&i&&(M(i),E(!0));}catch(i){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao criar cliente ativo como fallback:",data:i});}}finally{g(!1);}}return se&&a({type:"WARN",environment:["development","homologation"],message:"O par\xE2metro bearerToken est\xE1 deprecated e n\xE3o \xE9 mais necess\xE1rio. Ele ser\xE1 removido em vers\xF5es futuras."}),c(),()=>{e=!1,t&&"serviceWorker"in navigator&&navigator.serviceWorker.removeEventListener("message",t);}},[n,o,P,p,N,b,h]);let O=useCallback(async()=>{if(s){_(!0);try{let e=await n.listSubscriptions(s);re(e);}catch(e){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao listar inscri\xE7\xF5es:",data:e}),o?.(e);}finally{_(!1);}}},[n,s,o]);useEffect(()=>{s&&O();},[s]);let J=useCallback(async(e,t)=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{t&&d.current.set(e,t),await n.subscribeTopic(s,e),await O(),!T&&(!R||!L)&&(V(!0),E(!0));}catch(c){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever no t\xF3pico:",data:c}),o?.(c);}},[n,s,T,o,R,O,L]),U=useCallback(async e=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{d.current.delete(e),await n.unsubscribeTopic(s,e),await O();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever do t\xF3pico:",data:t}),o?.(t);}},[n,s,o,O]),F=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>{d.current.has(t)||d.current.set(t,{});}),await n.subscribeTopicsBatch(s,e),await O(),T||(V(!0),E(!0));}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever em t\xF3picos:",data:t}),o?.(t);}},[n,s,T,o,O]),Q=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>d.current.delete(t)),await n.unsubscribeTopicsBatch(s,e),await O();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever de t\xF3picos:",data:t}),o?.(t);}},[n,s,o,O]),X=useCallback(async()=>{g(!0);try{let e=null,t=!1;if("serviceWorker"in navigator&&"PushManager"in window&&await Notification.requestPermission()==="granted")try{let a=await navigator.serviceWorker.register(`${b}${N}`);await navigator.serviceWorker.ready,e=await a.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a$1(h)}),t=!0;}catch{t=!1;}return await p(e,t)}catch(e){return a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente:",data:e}),o?.(e),null}finally{g(!1);}},[o,p,N,b,h]),Y=useCallback(()=>{S(0);},[]),ae=useMemo(()=>({clientId:s,subscribedTopics:y,isLoading:j,newMessageCount:q,isRegisterError:$,subscribeToTopic:J,unsubscribeFromTopic:U,subscribeTopicsBatch:F,unsubscribeTopicsBatch:Q,resetMessageCount:Y,registerClient:X}),[s,j,$,q,X,Y,y,J,F,U,Q]);return jsx(te.Provider,{value:ae,children:v})};function Ee(){let v=useContext(te);if(!v)throw new Error("usePushNotifications precisa estar dentro de PushNotificationProvider");return v}
|
|
9
|
-
|
|
10
|
-
export { ge as PushNotificationProvider, Ee as usePushNotifications };
|
|
11
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/contexts/PushNotifications/index.tsx"],"names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","PushNotificationContext","PushNotificationProvider","children","originId","originType","bearerToken","vapidKey","serviceWorkerPath","serviceWorkerFile","pollingInterval","apiAdapters","onMessageReceived","onError","clientId","setClientId","isRegistering","setIsRegistering","isRegisterError","setIsRegisterError","isPassiveClient","setIsPassiveClient","newMessageCount","setNewMessageCount","processedMessageIds","subscribedTopics","setSubscribedTopics","isLoadingSubscriptions","setIsLoadingSubscriptions","pollingEnabled","setPollingEnabled","shouldPoll","setShouldPoll","topicOptionsRef","isLoading","interval","deliverables","m","prev","consoleLog","topic","error","performClientRegistration","subscription","isPassive","keys","payload","response","mounted","messageHandler","initSwAndRegister","id","err","permission","registration","urlBase64ToUint8Array","e","message","deliveredId","fallbackErr","refetchSubscriptions","data","subscribeToTopic","options","unsubscribeFromTopic","subscribeTopicsBatch","topics","unsubscribeTopicsBatch","registerClient","resetMessageCount","value","usePushNotifications","context"],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ConsoleType, Environment } from 'types/consoleLog';\nimport {\n type ClientRegistrationPayload,\n MessageStatus,\n type PushNotificationContextData,\n type PushNotificationProviderProps,\n type SubscriptionsData,\n type TopicSubscriptionOptions,\n} from 'types/pushNotifications';\nimport { consoleLog } from 'utils/consoleLog';\nimport { urlBase64ToUint8Array } from 'utils/urlBase64ToUint8Array';\n\nconst PushNotificationContext = createContext<\n PushNotificationContextData | undefined\n>(undefined);\n\nexport const PushNotificationProvider = <TMessage = unknown,>({\n children,\n originId,\n originType,\n bearerToken,\n vapidKey,\n serviceWorkerPath = '/',\n serviceWorkerFile = 'service-worker.js',\n pollingInterval = 1000,\n apiAdapters,\n onMessageReceived,\n onError,\n}: PushNotificationProviderProps<TMessage>) => {\n const [clientId, setClientId] = useState<string | null>(null);\n const [isRegistering, setIsRegistering] = useState<boolean>(false);\n const [isRegisterError, setIsRegisterError] = useState<boolean>(false);\n const [isPassiveClient, setIsPassiveClient] = useState<boolean>(false);\n const [newMessageCount, setNewMessageCount] = useState<number>(0);\n const [processedMessageIds] = useState<Set<string>>(new Set());\n\n const [subscribedTopics, setSubscribedTopics] = useState<SubscriptionsData>({\n subscriptions: [],\n });\n const [isLoadingSubscriptions, setIsLoadingSubscriptions] =\n useState<boolean>(false);\n\n const [pollingEnabled, setPollingEnabled] = useState<boolean>(false);\n const [shouldPoll, setShouldPoll] = useState<boolean>(false);\n\n const topicOptionsRef = useRef<Map<string, TopicSubscriptionOptions>>(\n new Map(),\n );\n\n const isLoading = useMemo(\n () => !clientId || isLoadingSubscriptions || isRegistering,\n [clientId, isLoadingSubscriptions, isRegistering],\n );\n\n useEffect(() => {\n if (\n !pollingEnabled ||\n !shouldPoll ||\n !clientId ||\n !apiAdapters.fetchMessages ||\n subscribedTopics.subscriptions.length === 0\n )\n return;\n\n const interval = setInterval(async () => {\n try {\n const result = await apiAdapters.fetchMessages!(clientId);\n const messages = result?.messages ?? [];\n\n const deliverables = messages.filter(m => {\n if (!m?.payload) return false;\n if (processedMessageIds.has(m.id)) return false;\n\n return true;\n });\n\n if (deliverables.length === 0) return;\n\n deliverables.forEach(m => {\n processedMessageIds.add(m.id);\n onMessageReceived?.(m.payload, m.topic);\n });\n\n setNewMessageCount(prev => prev + deliverables.length);\n\n try {\n const updates = await Promise.allSettled(\n deliverables.map(m =>\n apiAdapters.updateMessageStatus(m.id, {\n status: MessageStatus.DELIVERED,\n }),\n ),\n );\n\n updates.forEach(u => {\n if (u.status === 'rejected') {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [\n Environment.DEVELOPMENT,\n Environment.HOMOLOGATION,\n ],\n message: 'Erro ao marcar mensagem como entregue:',\n data: u.reason,\n });\n }\n });\n } finally {\n const topicsProcessed = new Set(\n deliverables.map(m => m.topic).filter(Boolean) as string[],\n );\n\n topicsProcessed.forEach(topic => {\n const topicOptions = topicOptionsRef.current.get(topic);\n\n if (topicOptions?.stopPollingOnFirstMessage) {\n topicOptionsRef.current.delete(topic);\n }\n });\n\n const hasSubscriptions = subscribedTopics.subscriptions.length > 0;\n\n if (!hasSubscriptions) {\n setPollingEnabled(false);\n setShouldPoll(false);\n }\n }\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao buscar mensagens:',\n data: error,\n });\n }\n }, pollingInterval);\n\n return () => clearInterval(interval);\n }, [\n apiAdapters,\n clientId,\n onMessageReceived,\n pollingEnabled,\n pollingInterval,\n processedMessageIds,\n shouldPoll,\n subscribedTopics.subscriptions.length,\n ]);\n\n const performClientRegistration = useCallback(\n async (subscription: PushSubscription | null, isPassive: boolean) => {\n setIsRegistering(true);\n\n try {\n const keys = subscription?.toJSON().keys;\n const payload: ClientRegistrationPayload = {\n origin_type: originType,\n origin_id: originId,\n ...(isPassive && subscription\n ? {\n endpoint: subscription.endpoint,\n auth: keys?.auth,\n p256dh: keys?.p256dh,\n }\n : {}),\n };\n\n const response = await apiAdapters.registerClient(payload);\n\n setClientId(response.id);\n setIsRegisterError(false);\n setIsPassiveClient(isPassive);\n\n if (!isPassive) {\n setShouldPoll(true);\n }\n\n return response.id;\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente:',\n data: error,\n });\n\n setIsRegisterError(true);\n onError?.(error as Error);\n\n return null;\n } finally {\n setIsRegistering(false);\n }\n },\n [apiAdapters, onError, originId, originType],\n );\n\n useEffect(() => {\n let mounted = true;\n let messageHandler: ((e: MessageEvent) => void) | null = null;\n\n async function initSwAndRegister() {\n setIsRegistering(true);\n\n if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Push notifications não suportadas, criando cliente ativo com polling',\n });\n\n try {\n const id = await performClientRegistration(null, false);\n if (mounted && id) {\n setClientId(id);\n setShouldPoll(true);\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente ativo:',\n data: err,\n });\n onError?.(err as Error);\n } finally {\n setIsRegistering(false);\n }\n return;\n }\n\n try {\n const permission = await Notification.requestPermission();\n\n let subscription: PushSubscription | null = null;\n let isPassiveClient = false;\n\n if (permission === 'granted') {\n try {\n const registration = await navigator.serviceWorker.register(\n `${serviceWorkerPath}${serviceWorkerFile}`,\n );\n\n if (!mounted) return;\n\n await navigator.serviceWorker.ready;\n\n if (!mounted) return;\n\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(\n vapidKey,\n ) as BufferSource,\n });\n\n messageHandler = async (e: MessageEvent) => {\n const message = e.data?.payload;\n const deliveredId = e.data?.id;\n\n if (message) {\n setNewMessageCount(prev => prev + 1);\n onMessageReceived?.(message, e.data?.topic);\n }\n\n if (deliveredId) {\n try {\n await apiAdapters.updateMessageStatus(deliveredId, {\n status: MessageStatus.DELIVERED,\n });\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [\n Environment.DEVELOPMENT,\n Environment.HOMOLOGATION,\n ],\n message: 'Erro ao atualizar status da mensagem:',\n data: err,\n });\n setIsRegisterError(true);\n onError?.(err as Error);\n }\n }\n };\n\n navigator.serviceWorker.addEventListener('message', messageHandler);\n\n isPassiveClient = true;\n consoleLog({\n type: ConsoleType.LOG,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Permissão concedida, criando cliente passivo (aguarda webpush)',\n });\n } catch (err) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Falha ao configurar push subscription, criando cliente ativo:',\n data: err,\n });\n isPassiveClient = false;\n }\n } else {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'Permissão de notificação negada, criando cliente ativo com polling',\n });\n isPassiveClient = false;\n }\n\n const id = await performClientRegistration(\n subscription,\n isPassiveClient,\n );\n if (mounted && id) {\n setClientId(id);\n\n if (!isPassiveClient) {\n setShouldPoll(true);\n }\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inicializar notificações:',\n data: err,\n });\n onError?.(err as Error);\n\n try {\n const id = await performClientRegistration(null, false);\n if (mounted && id) {\n setClientId(id);\n setShouldPoll(true);\n }\n } catch (fallbackErr) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao criar cliente ativo como fallback:',\n data: fallbackErr,\n });\n }\n } finally {\n setIsRegistering(false);\n }\n }\n\n if (bearerToken) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message:\n 'O parâmetro bearerToken está deprecated e não é mais necessário. Ele será removido em versões futuras.',\n });\n }\n\n void initSwAndRegister();\n\n return () => {\n mounted = false;\n if (messageHandler && 'serviceWorker' in navigator) {\n navigator.serviceWorker.removeEventListener('message', messageHandler);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n apiAdapters,\n onError,\n onMessageReceived,\n performClientRegistration,\n serviceWorkerFile,\n serviceWorkerPath,\n vapidKey,\n ]);\n\n const refetchSubscriptions = useCallback(async () => {\n if (!clientId) return;\n\n setIsLoadingSubscriptions(true);\n\n try {\n const data = await apiAdapters.listSubscriptions(clientId);\n\n setSubscribedTopics(data);\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao listar inscrições:',\n data: error,\n });\n\n onError?.(error as Error);\n } finally {\n setIsLoadingSubscriptions(false);\n }\n }, [apiAdapters, clientId, onError]);\n\n useEffect(() => {\n if (clientId) {\n void refetchSubscriptions();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clientId]);\n\n const subscribeToTopic = useCallback(\n async (topic: string, options?: TopicSubscriptionOptions) => {\n if (!clientId) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Cliente não registrado',\n });\n\n return;\n }\n\n try {\n if (options) {\n topicOptionsRef.current.set(topic, options);\n }\n\n await apiAdapters.subscribeTopic(clientId, topic);\n await refetchSubscriptions();\n\n if (!isPassiveClient && (!pollingEnabled || !shouldPoll)) {\n setPollingEnabled(true);\n setShouldPoll(true);\n }\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inscrever no tópico:',\n data: error,\n });\n\n onError?.(error as Error);\n }\n },\n [\n apiAdapters,\n clientId,\n isPassiveClient,\n onError,\n pollingEnabled,\n refetchSubscriptions,\n shouldPoll,\n ],\n );\n\n const unsubscribeFromTopic = useCallback(\n async (topic: string) => {\n if (!clientId) {\n consoleLog({\n type: ConsoleType.WARN,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Cliente não registrado',\n });\n\n return;\n }\n\n try {\n topicOptionsRef.current.delete(topic);\n\n await apiAdapters.unsubscribeTopic(clientId, topic);\n await refetchSubscriptions();\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao desinscrever do tópico:',\n data: error,\n });\n\n onError?.(error as Error);\n }\n },\n [apiAdapters, clientId, onError, refetchSubscriptions],\n );\n\n const subscribeTopicsBatch = useCallback(\n async (topics: string[]): Promise<void> => {\n if (!clientId || topics.length === 0) return;\n\n try {\n topics.forEach(topic => {\n if (!topicOptionsRef.current.has(topic)) {\n topicOptionsRef.current.set(topic, {});\n }\n });\n\n await apiAdapters.subscribeTopicsBatch(clientId, topics);\n await refetchSubscriptions();\n\n if (!isPassiveClient) {\n setPollingEnabled(true);\n setShouldPoll(true);\n }\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao inscrever em tópicos:',\n data: err,\n });\n\n onError?.(err as Error);\n }\n },\n [apiAdapters, clientId, isPassiveClient, onError, refetchSubscriptions],\n );\n\n const unsubscribeTopicsBatch = useCallback(\n async (topics: string[]): Promise<void> => {\n if (!clientId || topics.length === 0) return;\n\n try {\n topics.forEach(topic => topicOptionsRef.current.delete(topic));\n\n await apiAdapters.unsubscribeTopicsBatch(clientId, topics);\n await refetchSubscriptions();\n } catch (err) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao desinscrever de tópicos:',\n data: err,\n });\n\n onError?.(err as Error);\n }\n },\n [apiAdapters, clientId, onError, refetchSubscriptions],\n );\n\n const registerClient = useCallback(async () => {\n setIsRegistering(true);\n\n try {\n let subscription: PushSubscription | null = null;\n let isPassive = false;\n\n if ('serviceWorker' in navigator && 'PushManager' in window) {\n const permission = await Notification.requestPermission();\n\n if (permission === 'granted') {\n try {\n const registration = await navigator.serviceWorker.register(\n `${serviceWorkerPath}${serviceWorkerFile}`,\n );\n\n await navigator.serviceWorker.ready;\n\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(\n vapidKey,\n ) as BufferSource,\n });\n\n isPassive = true;\n } catch {\n isPassive = false;\n }\n }\n }\n\n return await performClientRegistration(subscription, isPassive);\n } catch (error) {\n consoleLog({\n type: ConsoleType.ERROR,\n environment: [Environment.DEVELOPMENT, Environment.HOMOLOGATION],\n message: 'Erro ao registrar cliente:',\n data: error,\n });\n\n onError?.(error as Error);\n\n return null;\n } finally {\n setIsRegistering(false);\n }\n }, [\n onError,\n performClientRegistration,\n serviceWorkerFile,\n serviceWorkerPath,\n vapidKey,\n ]);\n\n const resetMessageCount = useCallback(() => {\n setNewMessageCount(0);\n }, []);\n\n const value: PushNotificationContextData = useMemo(\n () => ({\n clientId,\n subscribedTopics,\n isLoading,\n newMessageCount,\n isRegisterError,\n subscribeToTopic,\n unsubscribeFromTopic,\n subscribeTopicsBatch,\n unsubscribeTopicsBatch,\n resetMessageCount,\n registerClient,\n }),\n [\n clientId,\n isLoading,\n isRegisterError,\n newMessageCount,\n registerClient,\n resetMessageCount,\n subscribedTopics,\n subscribeToTopic,\n subscribeTopicsBatch,\n unsubscribeFromTopic,\n unsubscribeTopicsBatch,\n ],\n );\n\n return (\n <PushNotificationContext.Provider value={value}>\n {children}\n </PushNotificationContext.Provider>\n );\n};\n\nexport function usePushNotifications(): PushNotificationContextData {\n const context = useContext(PushNotificationContext);\n\n if (!context) {\n throw new Error(\n 'usePushNotifications precisa estar dentro de PushNotificationProvider',\n );\n }\n\n return context;\n}\n"]}
|
package/dist/types/messages.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
interface Message<T = unknown> {
|
|
2
|
-
id: string;
|
|
3
|
-
payload: T;
|
|
4
|
-
receivedAt: number;
|
|
5
|
-
processed: boolean;
|
|
6
|
-
}
|
|
7
|
-
interface MessagesContextData {
|
|
8
|
-
messages: Message[];
|
|
9
|
-
unprocessedMessages: Message[];
|
|
10
|
-
addMessage: (payload: unknown) => void;
|
|
11
|
-
markAsProcessed: (id: string) => void;
|
|
12
|
-
clearMessages: () => void;
|
|
13
|
-
getMessagesByType: <T>(filter: (msg: Message) => boolean) => Message<T>[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export { Message, MessagesContextData };
|
package/dist/types/messages.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
|
|
3
|
-
interface PushMessage<TPayload = unknown> {
|
|
4
|
-
message: string;
|
|
5
|
-
topic: string;
|
|
6
|
-
updatedAt: string;
|
|
7
|
-
createdAt: string;
|
|
8
|
-
payload: TPayload;
|
|
9
|
-
id: string;
|
|
10
|
-
}
|
|
11
|
-
interface SubscriptionItem {
|
|
12
|
-
topic: string;
|
|
13
|
-
}
|
|
14
|
-
interface SubscriptionsData {
|
|
15
|
-
subscriptions: SubscriptionItem[];
|
|
16
|
-
}
|
|
17
|
-
interface ClientRegistrationPayload {
|
|
18
|
-
origin_type: string;
|
|
19
|
-
origin_id: string;
|
|
20
|
-
endpoint?: string;
|
|
21
|
-
auth?: string;
|
|
22
|
-
p256dh?: string;
|
|
23
|
-
}
|
|
24
|
-
interface ClientRegistrationResult {
|
|
25
|
-
id: string;
|
|
26
|
-
}
|
|
27
|
-
declare enum MessageStatus {
|
|
28
|
-
SENT = "SENT",
|
|
29
|
-
DELIVERED = "DELIVERED",
|
|
30
|
-
READ = "READ"
|
|
31
|
-
}
|
|
32
|
-
interface MessageStatusPayload {
|
|
33
|
-
status: MessageStatus;
|
|
34
|
-
}
|
|
35
|
-
interface PushNotificationApiAdapters<TMessage = unknown> {
|
|
36
|
-
registerClient: (payload: ClientRegistrationPayload) => Promise<ClientRegistrationResult>;
|
|
37
|
-
subscribeTopic: (clientId: string, topic: string) => Promise<void>;
|
|
38
|
-
unsubscribeTopic: (clientId: string, topic: string) => Promise<void>;
|
|
39
|
-
subscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;
|
|
40
|
-
unsubscribeTopicsBatch: (clientId: string, topics: string[]) => Promise<void>;
|
|
41
|
-
listSubscriptions: (clientId: string) => Promise<SubscriptionsData>;
|
|
42
|
-
fetchMessages?: (clientId: string) => Promise<{
|
|
43
|
-
messages: PushMessage<TMessage>[];
|
|
44
|
-
}>;
|
|
45
|
-
updateMessageStatus: (messageId: string, status: MessageStatusPayload) => Promise<void>;
|
|
46
|
-
}
|
|
47
|
-
interface PushNotificationProviderProps<TMessage = unknown> {
|
|
48
|
-
children: ReactNode;
|
|
49
|
-
bearerToken: string;
|
|
50
|
-
originId: string;
|
|
51
|
-
originType: string;
|
|
52
|
-
vapidKey: string;
|
|
53
|
-
serviceWorkerPath?: string;
|
|
54
|
-
serviceWorkerFile?: string;
|
|
55
|
-
pollingInterval?: number;
|
|
56
|
-
apiAdapters: PushNotificationApiAdapters<TMessage>;
|
|
57
|
-
onMessageReceived?: (message: TMessage, topic?: string) => void;
|
|
58
|
-
onError?: (error: Error) => void;
|
|
59
|
-
}
|
|
60
|
-
interface TopicSubscriptionOptions {
|
|
61
|
-
stopPollingOnFirstMessage?: boolean;
|
|
62
|
-
}
|
|
63
|
-
interface PushNotificationContextData {
|
|
64
|
-
clientId: string | null;
|
|
65
|
-
subscribedTopics: SubscriptionsData;
|
|
66
|
-
isLoading: boolean;
|
|
67
|
-
newMessageCount: number;
|
|
68
|
-
isRegisterError: boolean;
|
|
69
|
-
subscribeToTopic: (topic: string, options?: TopicSubscriptionOptions) => Promise<void>;
|
|
70
|
-
unsubscribeFromTopic: (topic: string) => Promise<void>;
|
|
71
|
-
subscribeTopicsBatch: (topics: string[]) => Promise<void>;
|
|
72
|
-
unsubscribeTopicsBatch: (topics: string[]) => Promise<void>;
|
|
73
|
-
resetMessageCount: () => void;
|
|
74
|
-
registerClient: () => Promise<string | null>;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export { ClientRegistrationPayload, ClientRegistrationResult, MessageStatus, MessageStatusPayload, PushMessage, PushNotificationApiAdapters, PushNotificationContextData, PushNotificationProviderProps, SubscriptionItem, SubscriptionsData, TopicSubscriptionOptions };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|