@zydon/common 2.8.57 → 2.8.59

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.
@@ -1,11 +1,11 @@
1
1
  import { a as a$1 } from '../../chunk-RP7PNTLJ.js';
2
2
  import { a } from '../../chunk-GPFANUMT.js';
3
- import '../../chunk-E5ULJSWF.js';
3
+ import '../../chunk-WMHH24KM.js';
4
4
  import '../../chunk-TVKBRJHF.js';
5
5
  import { createContext, useState, useRef, useMemo, useEffect, useCallback, useContext } from 'react';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
 
8
- var ee=createContext(void 0),fe=({children:v,originId:V,originType:G,bearerToken:te,vapidKey:H,serviceWorkerPath:k="/",serviceWorkerFile:x="service-worker.js",pollingInterval:A=1e3,apiAdapters:r,onMessageReceived:y,onError:o})=>{let[s,h]=useState(null),[W,m]=useState(!1),[B,L]=useState(!1),[N,se]=useState(!1),[z,w]=useState(0),[D]=useState(new Set),[p,ie]=useState({subscriptions:[]}),[F,_]=useState(!1),[b,I]=useState(!1),[P,f]=useState(!1),E=useRef(new Map),$=useMemo(()=>!s||F||W,[s,F,W]);useEffect(()=>{if(!b||!P||!s||!r.fetchMessages||p.subscriptions.length===0)return;let e=setInterval(async()=>{try{let a$1=((await r.fetchMessages(s))?.messages??[]).filter(i=>!(!i?.payload||D.has(i.id)));if(a$1.length===0)return;a$1.forEach(i=>{D.add(i.id),y?.(i.payload,i.topic);}),w(i=>i+a$1.length);try{(await Promise.allSettled(a$1.map(u=>r.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(g=>g.topic).filter(Boolean)).forEach(g=>{E.current.get(g)?.stopPollingOnFirstMessage&&E.current.delete(g);}),p.subscriptions.length>0||(I(!1),f(!1));}}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao buscar mensagens:",data:t});}},A);return ()=>clearInterval(e)},[r,s,y,b,A,D,P,p.subscriptions.length]);let T=useCallback(async(e,t)=>{m(!0);try{let c=e?.toJSON().keys,a={origin_type:G,origin_id:V,...t&&e?{endpoint:e.endpoint,auth:c?.auth,p256dh:c?.p256dh}:{}},i=await r.registerClient(a);return h(i.id),L(!1),se(t),t||f(!0),i.id}catch(c){return a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente:",data:c}),L(!0),o?.(c),null}finally{m(!1);}},[r,o,V,G]);useEffect(()=>{let e=!0,t=null;async function c(){if(m(!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 T(null,!1);e&&a&&(h(a),f(!0));}catch(a$1){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao registrar cliente ativo:",data:a$1}),o?.(a$1);}finally{m(!1);}return}try{let a$2=await Notification.requestPermission(),i=null,u=!1;if(a$2==="granted")try{let M=await navigator.serviceWorker.register(`${k}${x}`);if(!e||(await navigator.serviceWorker.ready,!e))return;i=await M.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a$1(H)}),t=async S=>{let Q=S.data?.payload,X=S.data?.id;if(Q&&(w(R=>R+1),y?.(Q,S.data?.topic)),X)try{await r.updateMessageStatus(X,{status:"DELIVERED"});}catch(R){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao atualizar status da mensagem:",data:R}),L(!0),o?.(R);}},navigator.serviceWorker.addEventListener("message",t),u=!0,a({type:"LOG",environment:["development","homologation"],message:"Permiss\xE3o concedida, criando cliente passivo (aguarda webpush)"});}catch(M){a({type:"WARN",environment:["development","homologation"],message:"Falha ao configurar push subscription, criando cliente ativo:",data:M}),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 g=await T(i,u);e&&g&&(h(g),u||f(!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 T(null,!1);e&&i&&(h(i),f(!0));}catch(i){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao criar cliente ativo como fallback:",data:i});}}finally{m(!1);}}return te&&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);}},[r,o,y,T,x,k,H]);let O=useCallback(async()=>{if(s){_(!0);try{let e=await r.listSubscriptions(s);ie(e);}catch(e){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao listar inscri\xE7\xF5es:",data:e}),o?.(e);}finally{_(!1);}}},[r,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&&E.current.set(e,t),await r.subscribeTopic(s,e),await O(),!N&&(!b||!P)&&(I(!0),f(!0));}catch(c){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever no t\xF3pico:",data:c}),o?.(c);}},[r,s,N,o,b,O,P]),q=useCallback(async e=>{if(!s){a({type:"WARN",environment:["development","homologation"],message:"Cliente n\xE3o registrado"});return}try{E.current.delete(e),await r.unsubscribeTopic(s,e),await O();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever do t\xF3pico:",data:t}),o?.(t);}},[r,s,o,O]),J=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>{E.current.has(t)||E.current.set(t,{});}),await r.subscribeTopicsBatch(s,e),await O(),N||(I(!0),f(!0));}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao inscrever em t\xF3picos:",data:t}),o?.(t);}},[r,s,N,o,O]),U=useCallback(async e=>{if(!(!s||e.length===0))try{e.forEach(t=>E.current.delete(t)),await r.unsubscribeTopicsBatch(s,e),await O();}catch(t){a({type:"ERROR",environment:["development","homologation"],message:"Erro ao desinscrever de t\xF3picos:",data:t}),o?.(t);}},[r,s,o,O]),K=useCallback(()=>{w(0);},[]),ne=useMemo(()=>({clientId:s,subscribedTopics:p,isLoading:$,newMessageCount:z,isRegisterError:B,subscribeToTopic:j,unsubscribeFromTopic:q,subscribeTopicsBatch:J,unsubscribeTopicsBatch:U,resetMessageCount:K}),[s,$,B,z,K,p,j,J,q,U]);return jsx(ee.Provider,{value:ne,children:v})};function Ee(){let v=useContext(ee);if(!v)throw new Error("usePushNotifications precisa estar dentro de PushNotificationProvider");return v}
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
9
 
10
- export { fe as PushNotificationProvider, Ee as usePushNotifications };
10
+ export { ge as PushNotificationProvider, Ee as usePushNotifications };
11
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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","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 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 }),\n [\n clientId,\n isLoading,\n isRegisterError,\n newMessageCount,\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"]}
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 }, [onError, performClientRegistration, serviceWorkerFile, serviceWorkerPath, vapidKey]);\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"]}
@@ -0,0 +1,10 @@
1
+ import { PopoverProps } from '@mui/material/Popover';
2
+
3
+ type MenuPopoverArrowValue = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'left-top' | 'left-center' | 'left-bottom' | 'right-top' | 'right-center' | 'right-bottom';
4
+ interface MenuPopoverProps extends Omit<PopoverProps, 'open'> {
5
+ open: HTMLElement | null;
6
+ arrow?: MenuPopoverArrowValue;
7
+ disabledArrow?: boolean;
8
+ }
9
+
10
+ export { MenuPopoverProps as M };
@@ -71,6 +71,7 @@ interface PushNotificationContextData {
71
71
  subscribeTopicsBatch: (topics: string[]) => Promise<void>;
72
72
  unsubscribeTopicsBatch: (topics: string[]) => Promise<void>;
73
73
  resetMessageCount: () => void;
74
+ registerClient: () => Promise<string | null>;
74
75
  }
75
76
 
76
77
  export { ClientRegistrationPayload, ClientRegistrationResult, MessageStatus, MessageStatusPayload, PushMessage, PushNotificationApiAdapters, PushNotificationContextData, PushNotificationProviderProps, SubscriptionItem, SubscriptionsData, TopicSubscriptionOptions };
@@ -1,2 +1,2 @@
1
- export { a as MessageStatus } from '../chunk-E5ULJSWF.js';
1
+ export { a as MessageStatus } from '../chunk-WMHH24KM.js';
2
2
  //# sourceMappingURL=pushNotifications.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zydon/common",
3
- "version": "2.8.57",
3
+ "version": "2.8.59",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/DataView/styles.ts","../src/components/DataView/Pagination.tsx"],"names":["Checkbox","CircularProgress","Divider","Stack","styled","Typography","Container","Panel_default","prop","theme","breakpoint","Header","ActionsContainer","ActionsDivider","ToolbarActionsDivider","Topbar","SearchContainer","PaginationContainer","MobilePaginationContainer","DesktopPaginationContainer","DataGridWrapper","SelectionOverlay","SelectionCount","SelectionActions","SelectionCheckbox","MoreActionsPopover","MenuPopover_default","TopbarDivider","LoadingProgress","useCallback","useMemo","MuiPagination","jsx","Pagination","count","page","rowsPerPage","onPageChange","onRowsPerPageChange","totalPages","handlePageChange","_","newPage","handleRowsPerPageChange","event","ariaLabel","Pagination_default"],"mappings":"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","sourcesContent":["import Checkbox from '@mui/material/Checkbox';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Divider from '@mui/material/Divider';\nimport Stack, { StackProps } from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\nimport { Breakpoint } from '@mui/material/styles';\nimport Typography from '@mui/material/Typography';\n\nimport MenuPopover from 'components/MenuPopover';\nimport Panel from 'components/Panel';\n\nexport interface DefaultProps {\n breakpoint: Breakpoint | number;\n}\n\nexport interface ContainerProps extends StackProps {\n breakpoint: Breakpoint | number;\n}\n\nexport const Container = styled(Panel, {\n shouldForwardProp: prop => prop !== 'breakpoint',\n})<ContainerProps>(({ theme, breakpoint }) => ({\n position: 'relative',\n borderRadius: 12,\n padding: 0,\n gap: 0,\n overflow: 'hidden',\n\n [theme.breakpoints.down(breakpoint)]: {\n borderColor: theme.palette.divider,\n },\n}));\n\nexport const Header = styled(Stack, {\n shouldForwardProp: prop => prop !== 'breakpoint',\n})<DefaultProps>(({ theme, breakpoint }) => ({\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(3, 3, 0),\n gap: theme.spacing(3),\n\n [theme.breakpoints.down(breakpoint)]: {\n padding: theme.spacing(2, 2, 0),\n },\n}));\n\nexport const ActionsContainer = styled(Stack, {\n shouldForwardProp: prop => prop !== 'breakpoint',\n})<DefaultProps>(({ theme, breakpoint }) => ({\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n color: theme.palette.text.secondary,\n\n [theme.breakpoints.down(breakpoint)]: {\n '& button, & a': {\n textIndent: '-9999em',\n fontSize: 0,\n minWidth: 36,\n maxWidth: 36,\n height: 36,\n width: 36,\n overflow: 'hidden',\n\n '& .MuiButton-icon': {\n margin: 0,\n },\n },\n },\n}));\n\nexport const ActionsDivider = styled(Divider)(({ theme }) => ({\n borderStyle: 'dashed',\n height: theme.spacing(2),\n margin: 'auto',\n}));\n\nexport const ToolbarActionsDivider = styled(Divider)(({ theme }) => ({\n borderStyle: 'dashed',\n height: theme.spacing(1.5),\n marginTop: 'auto',\n marginBottom: 'auto',\n}));\n\nexport const Topbar = styled(Stack, {\n shouldForwardProp: prop => prop !== 'breakpoint',\n})<DefaultProps>(({ theme, breakpoint }) => ({\n position: 'relative',\n padding: theme.spacing(2),\n flexDirection: 'row',\n alignItems: 'center',\n color: theme.palette.text.secondary,\n\n [theme.breakpoints.down(breakpoint)]: {\n padding: theme.spacing(1.5, 2),\n borderBottom: `1px solid ${theme.palette.divider}`,\n minHeight: 60,\n\n [theme.breakpoints.down(breakpoint)]: {\n '& button': {\n textIndent: '-9999em',\n fontSize: 0,\n minWidth: 36,\n maxWidth: 36,\n height: 36,\n width: 36,\n overflow: 'hidden',\n\n '& .MuiButton-icon': {\n margin: 0,\n },\n },\n },\n },\n}));\n\nexport const SearchContainer = styled(Stack, {\n shouldForwardProp: prop => prop !== 'breakpoint',\n})<DefaultProps>(({ theme, breakpoint }) => ({\n width: 320,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n\n [theme.breakpoints.down(breakpoint)]: {\n width: '100%',\n zIndex: 1,\n\n '& fieldset, & input': {\n display: 'flex',\n },\n\n '& .MuiInputAdornment-root': {\n marginLeft: 0,\n },\n },\n}));\n\nexport const PaginationContainer = styled(Stack)(({ theme }) => ({\n '& .MuiToolbar-root': {\n height: 24,\n minHeight: 24,\n overflow: 'hidden',\n\n [theme.breakpoints.down('sm')]: {\n height: 'auto',\n flexWrap: 'wrap',\n justifyContent: 'center',\n },\n },\n}));\n\nexport const MobilePaginationContainer = styled(Stack)(({ theme }) => ({\n minHeight: 60,\n alignItems: 'flex-end',\n justifyContent: 'center',\n borderTop: `1px solid ${theme.palette.divider}`,\n\n [theme.breakpoints.down('sm')]: {\n minHeight: 'auto',\n },\n}));\n\nexport const DesktopPaginationContainer = styled(Stack)(({ theme }) => ({\n flexDirection: 'row',\n height: 60,\n alignItems: 'center',\n justifyContent: 'space-between',\n borderTop: `1px solid ${theme.palette.divider}`,\n gap: theme.spacing(2),\n padding: theme.spacing(2),\n}));\n\nexport const DataGridWrapper = styled(Stack)({\n position: 'relative',\n flex: 1,\n minHeight: 0,\n});\n\nexport const SelectionOverlay = styled(Stack)(({ theme }) => ({\n flexDirection: 'row',\n alignItems: 'center',\n padding: `0 ${theme.spacing(3)}`,\n top: 0,\n left: 0,\n width: '100%',\n zIndex: 9,\n height: 48,\n position: 'absolute',\n backgroundColor: theme.palette.primary.lighter,\n}));\n\nexport const SelectionCount = styled(Typography)(({ theme }) => ({\n flexGrow: 1,\n color: theme.palette.primary.main,\n fontWeight: 600,\n}));\n\nexport const SelectionActions = styled(Stack)(({ theme }) => ({\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nexport const SelectionCheckbox = styled(Checkbox)({\n marginLeft: -6,\n});\n\nexport const MoreActionsPopover = styled(MenuPopover)({\n minWidth: 160,\n});\n\nexport const TopbarDivider = styled(Divider)(({ theme }) => ({\n marginTop: theme.spacing(2),\n}));\n\nexport const LoadingProgress = styled(CircularProgress)({\n margin: '160px auto',\n});\n","import { useCallback, useMemo } from 'react';\nimport MuiPagination from '@mui/material/TablePagination';\n\nimport { PaginationProps } from './props';\nimport { PaginationContainer } from './styles';\n\nconst Pagination = ({\n count,\n page,\n rowsPerPage,\n onPageChange,\n onRowsPerPageChange,\n}: PaginationProps) => {\n const totalPages = Math.ceil(count / rowsPerPage) || 1;\n\n const handlePageChange = useCallback(\n (_: unknown, newPage: number) => {\n onPageChange(newPage);\n },\n [onPageChange],\n );\n\n const handleRowsPerPageChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n onRowsPerPageChange(Number(event.target.value));\n },\n [onRowsPerPageChange],\n );\n\n const ariaLabel = useMemo(\n () => `Página ${page + 1} de ${totalPages}`,\n [page, totalPages],\n );\n\n return (\n <PaginationContainer\n aria-label={ariaLabel}\n aria-live=\"polite\"\n role=\"navigation\"\n >\n <MuiPagination\n color=\"primary\"\n component=\"div\"\n size=\"small\"\n count={count}\n page={page}\n rowsPerPage={rowsPerPage}\n onPageChange={handlePageChange}\n onRowsPerPageChange={handleRowsPerPageChange}\n />\n </PaginationContainer>\n );\n};\n\nexport default Pagination;\n"]}
@@ -1,27 +0,0 @@
1
- import { a as a$3 } from './chunk-PVI5BAUW.js';
2
- import { a as a$4 } from './chunk-IJZCVZ32.js';
3
- import { a as a$7 } from './chunk-IDFJFFIV.js';
4
- import { a as a$5 } from './chunk-6U5LS7MP.js';
5
- import { a as a$9 } from './chunk-D3RY7C7B.js';
6
- import { i, r, k, n, l, a as a$2, b as b$1, c, d, f, e, o, g, p, q, h, j, m } from './chunk-3HKLNWRZ.js';
7
- import { a as a$6 } from './chunk-F65ZXAGV.js';
8
- import { a as a$8 } from './chunk-I4PPSW36.js';
9
- import { a } from './chunk-VURAUMLN.js';
10
- import { a as a$1 } from './chunk-LQRRMVFN.js';
11
- import { b } from './chunk-RPO7AI5K.js';
12
- import { memo, forwardRef, useState, useRef, useEffect, useMemo, useCallback, Fragment as Fragment$1, Children, isValidElement, cloneElement } from 'react';
13
- import Ve from 'react-fast-compare';
14
- import io from '@mui/material/Button';
15
- import ze from '@mui/material/IconButton';
16
- import Fe from '@mui/material/LinearProgress';
17
- import w from '@mui/material/Stack';
18
- import $o from '@mui/material/Tooltip';
19
- import Ko from '@mui/material/Typography';
20
- import ge from '@mui/lab/LoadingButton';
21
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
22
- import { GridToolbarColumnsButton } from '@mui/x-data-grid-premium';
23
-
24
- var _="datagrid-actions";var Uo=(e,n)=>typeof e=="function"?e(n):!!e,Ce=e=>{if(e)return e===!0?{}:e},he=({actions:e,context:n})=>{let[r,l]=useState(null),[c,s]=useState(null),C=useMemo(()=>e.filter(i=>!Uo(i.hidden,n)),[e,n]),h=useCallback(async i=>{s(i.id);try{await i.handler(n);}finally{s(null);}},[n]),K=useCallback(i=>{if(i.confirmation){l(i);return}h(i).catch(()=>{});},[h]),y=useCallback(async()=>{r&&(await h(r),l(null));},[r,h]),u=useCallback(()=>{c||l(null);},[c]),d=Ce(r?.confirmation);return jsxs(Fragment,{children:[jsx(m,{children:C.map(i=>{let E=!!c||Uo(i.disabled,n),G=c===i.id;return jsx(ge,{size:"small",variant:"text",color:i.color??"primary",onClick:()=>K(i),loading:G,disabled:E,startIcon:typeof i.icon=="string"?jsx(a,{icon:i.icon}):i.icon,children:i.label},i.id)})}),r&&jsx(a$9,{open:!0,onClose:u,onConfirm:()=>{y().catch(()=>{});},confirming:c===r.id,modalTitle:d?.title??"Tem certeza que deseja executar esta a\xE7\xE3o?",message:d?.message??"Essa a\xE7\xE3o ser\xE1 aplicada aos itens selecionados.",cancelButtonText:d?.cancelButtonText??"Cancelar",confirmButtonText:d?.confirmButtonText??"Confirmar",confirmButtonProps:{color:r.color??"primary"}})]})},qo=he;var we=({rowCount:e,page:n,rowsPerPage:r$1,onPaginationChange:l})=>jsxs(i,{children:[jsxs(w,{direction:"row",alignItems:"center",gap:.5,children:[jsx(Ko,{variant:"body2",color:"text.disabled",children:"Total de itens:"}),jsx(Ko,{variant:"body2",children:e})]}),jsx(r,{count:e,page:n,rowsPerPage:r$1,onPageChange:c=>l(c,r$1),onRowsPerPageChange:c=>l(n,c)})]}),Jo=memo(we);var Xo=(e,n)=>Children.map(e,r=>{if(!isValidElement(r))return r;let l=r.props.onClick,c={};c.onClick=(...C)=>{n(),l&&l(...C);};let s=r.props;return s?.children&&(c.children=Xo(s.children,n)),cloneElement(r,c)}),Ie=({children:e,onClose:n})=>e?Xo(e,n):null,Yo=memo(Ie);var De=forwardRef(({children:e,...n},r)=>jsx(io,{...n,ref:r,color:"inherit",startIcon:jsx(a,{icon:"COLUMNS"}),children:e??"Colunas"}));De.displayName="ColumnsButton";var Ee=({setFilterButtonEl:e})=>{let n=useCallback(r=>{e(r);},[e]);return jsx(a$8,{container:_,children:jsx(GridToolbarColumnsButton,{ref:n,slotProps:{button:{color:"inherit",startIcon:jsx(a,{icon:"COLUMNS"}),children:"Colunas"}}})})},Zo=Ee;var _e=({title:e$1,header:n$1,headerProps:r$1,breakpoint:l$1="md",columns:c$1,rows:s=[],mobileSlots:C,mobileSlotsProps:h$1,mobileRender:K,rowCount:y=0,paginationModel:u={page:0,pageSize:25},onPaginationChange:d$1,actions:i,moreActions:E,onAdd:G,onSearch:ao,searchValue:oe,onSearchChange:ee,slots:P,slotProps:te,loading:R,fetching:lo,fetchingNextPage:ne,containerProps:re={height:562,maxHeight:562},hideFooter:co,showColumnButton:Q=!1,filterButton:I,activeFilters:so,bulkActions:mo,onRowsScrollEnd:O,scrollEndThreshold:J=200,...k$1})=>{let A=a$1(),f$1=b("down",l$1),[ie,ae]=useState(null),po=useRef(null);useEffect(()=>{let t=po.current;if(!t||!f$1||!O)return;let T=()=>{let{scrollTop:j,scrollHeight:M,clientHeight:z}=t;M-j-z<=J&&O();};return t.addEventListener("scroll",T,{passive:!0}),()=>{t.removeEventListener("scroll",T);}},[f$1,O,J,s.length]);let uo=!!ao,X=!!G,L=!!i,Y=!!E,Z=f$1&&Y,H=!f$1&&Y,le=L||X||Z,fo=H||uo||Q||!!I||!f$1,m=useMemo(()=>Array.isArray(k$1.rowSelectionModel)?k$1.rowSelectionModel:[],[k$1.rowSelectionModel]),b$2=m.length,N=useMemo(()=>k$1.getRowId??(t=>t.id),[k$1.getRowId]),S=useMemo(()=>s.map(t=>N(t)),[s,N]),V=useMemo(()=>new Set(S),[S]),go=useMemo(()=>m.reduce((t,T)=>t+(V.has(T)?1:0),0),[m,V]),Co=S.length>0&&go===S.length,ce=go>0&&!Co,{onRowSelectionModelChange:v}=k$1,x=useCallback(t=>{v&&v(t);},[v]),$=useCallback(()=>{x([]);},[x]),ho=useMemo(()=>new Set(m),[m]),ko=useMemo(()=>s.filter(t=>ho.has(N(t))),[s,ho,N]),se=useMemo(()=>({selectedIds:m,selectedRowsInPage:ko,selectedCount:b$2,clearSelection:$}),[m,ko,b$2,$]),de=!!mo?.length,me=useCallback((t,T)=>{if(!v)return;if(T){let M=new Set(m),z=[...m];S.forEach(oo=>{M.has(oo)||z.push(oo);}),x(z);return}let j=m.filter(M=>!V.has(M));x(j);},[v,m,S,V,x]),Ao=useCallback(()=>d$1?jsx(Jo,{rowCount:y,page:u.page,rowsPerPage:u.pageSize,onPaginationChange:d$1}):null,[y,u,d$1]),pe=useMemo(()=>({...P,footer:Ao,...Q&&!P?.toolbar&&{toolbar:Zo}}),[P,Ao,Q]),ue=de&&b$2>0&&jsxs(k,{children:[jsx($o,{title:"Selecione todos nessa pagina",children:jsx(n,{size:"small",checked:Co,indeterminate:ce,onChange:me})}),jsx($o,{title:"Desselecionar tudo",children:jsx(ze,{size:"small",onClick:$,"aria-label":"Desselecionar tudo",sx:{color:"primary.main"},children:jsx(a,{icon:"CLOSE_MARK_BUTTON",width:18,height:18})})}),jsxs(l,{variant:"body2",children:[b$2," selecionado",b$2>1?"s":""]}),jsx(qo,{actions:mo??[],context:se})]});return jsxs(a$2,{breakpoint:l$1,...re,flex:R?1:void 0,minHeight:R||s.length===0?562:void 0,children:[n$1?jsx(w,{p:3,...r$1,children:n$1}):jsxs(Fragment,{children:[jsxs(b$1,{breakpoint:l$1,children:[jsx(Ko,{variant:"overline",color:"text.secondary",noWrap:!0,children:e$1}),le&&jsxs(c,{breakpoint:l$1,children:[L&&i,X&&jsxs(Fragment,{children:[L&&jsx(d,{orientation:"vertical",flexItem:!0}),jsx(io,{startIcon:jsx(a,{icon:"SIMPLE_ADD"}),variant:"contained",onClick:G,children:"Adicionar"})]}),Z&&jsxs(Fragment,{children:[(L||X)&&jsx(d,{orientation:"vertical",flexItem:!0}),jsx(io,{color:"inherit",startIcon:jsx(a,{icon:"MORE_BOLD"}),size:"small",onClick:A.onOpen,children:"Mais"})]})]})]}),fo&&jsxs(f,{breakpoint:l$1,children:[jsxs(w,{flex:1,direction:"row",alignItems:"center",id:_,gap:.5,children:[Y&&jsxs(Fragment,{children:[H&&jsxs(Fragment,{children:[jsx(io,{color:"inherit",startIcon:jsx(a,{icon:"MORE_BOLD"}),size:"small",onClick:A.onOpen,children:"Mais"}),!f$1&&jsx(e,{orientation:"vertical",flexItem:!0})]}),(H||Z)&&jsx(o,{open:A.open,anchorEl:A.open,onClose:A.onClose,disabledArrow:!0,children:jsx(Yo,{onClose:A.onClose,children:E})})]}),!f$1&&I&&jsxs(Fragment,{children:[I,H&&jsx(e,{orientation:"vertical",flexItem:!0})]})]}),uo&&jsxs(g,{breakpoint:l$1,children:[jsx(a$3,{value:oe,placeholder:"Buscar",onSearch:ao,onChange:t=>ee?.(t.target.value),size:"small",fullWidth:!0,iconPosition:"start"}),f$1&&I&&jsx(w,{ml:1,children:I})]})]}),so&&so,!fo&&jsx(p,{})]}),f$1?jsxs(a$4,{isFetching:lo,fetching:jsx(a$5,{}),isLoading:R,loading:jsx(q,{}),isEmpty:s.length===0,empty:jsxs(w,{flex:1,direction:"column",...h$1,children:[C&&C,jsx(w,{flex:1,alignItems:"center",justifyContent:"center",children:P?.noRowsOverlay?jsx(P.noRowsOverlay,{}):jsx(Ko,{variant:"body2",color:"text.secondary",children:"Nenhum registro encontrado"})})]}),children:[jsxs(w,{direction:"column",flex:1,minHeight:0,...h$1,children:[C&&C,jsx(a$6,{fillContent:!0,ref:po,children:s.map(t=>jsx(Fragment$1,{children:K(t)},t.id))})]}),!co&&d$1&&jsx(h,{children:jsx(r,{count:y,page:u.page,rowsPerPage:u.pageSize,onPageChange:t=>d$1?.(t,u.pageSize),onRowsPerPageChange:t=>d$1?.(u.page,t)})})]}):jsxs(j,{children:[ue,jsx(a$7,{columns:c$1,rows:s,slots:pe,slotProps:{panel:{anchorEl:ie},toolbar:{setFilterButtonEl:ae,showQuickFilter:!0},...te},columnHeaderHeight:48,getRowHeight:()=>68,loading:R,fetching:lo,hideFooter:co,onRowsScrollEnd:O,scrollEndThreshold:J,...k$1})]}),ne&&jsx(Fe,{})]},R?"loading":"data")},Ft=memo(_e,Ve);
25
-
26
- export { Jo as a, Yo as b, Zo as c, Ft as d };
27
- //# sourceMappingURL=chunk-75PS5WVR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/DataView/index.tsx","../src/components/DataView/contants.ts","../src/components/DataView/BulkActionsBar.tsx","../src/components/DataView/DesktopFooter.tsx","../src/components/DataView/EnhancedMoreActions.ts","../src/components/DataView/Toolbar.tsx"],"names":["Fragment","memo","useCallback","useEffect","useMemo","useRef","useState","isEqual","Button","IconButton","LinearProgress","Stack","Tooltip","Typography","DATAGRID_ACTIONS","LoadingButton","jsx","jsxs","resolveDynamicBoolean","value","context","getConfirmationConfig","confirmation","BulkActionsBar","actions","confirmAction","setConfirmAction","runningActionId","setRunningActionId","visibleActions","action","executeAction","handleActionClick","handleConfirm","handleCloseConfirm","confirmationConfig","SelectionActions","disabled","loading","Icon_default","Confirm_default","BulkActionsBar_default","DesktopFooter","rowCount","page","rowsPerPage","onPaginationChange","DesktopPaginationContainer","Pagination_default","newPage","newRowsPerPage","DesktopFooter_default","Children","cloneElement","isValidElement","createEnhanceMoreActions","children","onClose","child","originalOnClick","enhancedProps","args","childProps","EnhancedMoreActions","EnhancedMoreActions_default","forwardRef","GridToolbarColumnsButton","ColumnsButton","props","ref","Toolbar","setFilterButtonEl","handleColumnsButtonRef","button","Portal_default","Toolbar_default","DataViewComponent","title","header","headerProps","breakpoint","columns","rows","mobileSlots","mobileSlotsProps","mobileRender","paginationModel","moreActions","onAdd","onSearch","searchValue","onSearchChange","slots","slotProps","fetching","fetchingNextPage","containerProps","hideFooter","showColumnButton","filterButton","activeFilters","bulkActions","onRowsScrollEnd","scrollEndThreshold","others","popover","usePopover_default","isMobile","useResponsive_default","filterButtonEl","scrollableNodeRef","node","handleScroll","scrollTop","scrollHeight","clientHeight","showSearch","showAdd","showActions","showMoreActions","showHeaderMoreActions","showTopbarMoreActions","showActionsContainer","showTopbar","selectionModel","numSelected","getRowId","row","pageRowIds","pageRowIdSet","selectedOnPageCount","count","id","allSelected","someSelected","onRowSelectionModelChange","emitRowSelectionChange","nextSelection","clearSelection","selectedIdSet","selectedRowsInPage","bulkActionContext","hasBulkActions","handleSelectAllToggle","_event","checked","selectedIds","FooterComponent","dataGridSlots","selectionOverlay","SelectionOverlay","SelectionCheckbox","SelectionCount","Container","Header","ActionsContainer","ActionsDivider","Topbar","ToolbarActionsDivider","MoreActionsPopover","SearchContainer","SearchInput_default","e","TopbarDivider","Result_default","FixedProgressBar_default","LoadingProgress","Scrollbar_default","MobilePaginationContainer","DataGridWrapper","DataGrid_default","DataView_default"],"mappings":"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","sourcesContent":["import {\n ChangeEvent,\n Fragment,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport isEqual from 'react-fast-compare';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport {\n GridRowId,\n GridSlotsComponentsProps,\n GridValidRowModel,\n} from '@mui/x-data-grid-premium';\n\nimport DataGrid from 'components/DataGrid';\nimport FixedProgressBar from 'components/FixedProgressBar';\nimport Icon from 'components/Icon';\nimport Result from 'components/Result';\nimport Scrollbar from 'components/Scrollbar';\nimport SearchInput from 'components/SearchInput';\nimport usePopover from 'hooks/usePopover';\nimport useResponsive from 'hooks/useResponsive';\n\nimport { DATAGRID_ACTIONS } from './contants';\nimport BulkActionsBar from './BulkActionsBar';\nimport DesktopFooter from './DesktopFooter';\nimport EnhancedMoreActions from './EnhancedMoreActions';\nimport Pagination from './Pagination';\nimport type { BulkActionContext } from './bulkActions';\nimport { DataGridSlotsProps, DataViewProps } from './props';\nimport {\n ActionsContainer,\n ActionsDivider,\n Container,\n DataGridWrapper,\n Header,\n LoadingProgress,\n MobilePaginationContainer,\n MoreActionsPopover,\n SearchContainer,\n SelectionActions,\n SelectionCheckbox,\n SelectionCount,\n SelectionOverlay,\n ToolbarActionsDivider,\n Topbar,\n TopbarDivider,\n} from './styles';\nimport Toolbar from './Toolbar';\n\nconst DataViewComponent = <T extends GridValidRowModel = GridValidRowModel>({\n title,\n header,\n headerProps,\n breakpoint = 'md',\n columns,\n rows = [],\n mobileSlots,\n mobileSlotsProps,\n mobileRender,\n rowCount = 0,\n paginationModel = { page: 0, pageSize: 25 },\n onPaginationChange,\n actions,\n moreActions,\n onAdd,\n onSearch,\n searchValue,\n onSearchChange,\n slots,\n slotProps,\n loading,\n fetching,\n fetchingNextPage,\n containerProps = { height: 562, maxHeight: 562 },\n hideFooter,\n showColumnButton = false,\n filterButton,\n activeFilters,\n bulkActions,\n onRowsScrollEnd,\n scrollEndThreshold = 200,\n ...others\n}: DataViewProps<T>) => {\n const popover = usePopover();\n const isMobile = useResponsive('down', breakpoint);\n const [filterButtonEl, setFilterButtonEl] =\n useState<HTMLButtonElement | null>(null);\n const scrollableNodeRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const node = scrollableNodeRef.current;\n\n if (!node || !isMobile || !onRowsScrollEnd) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = node;\n const distanceToBottom = scrollHeight - scrollTop - clientHeight;\n if (distanceToBottom <= scrollEndThreshold) {\n (onRowsScrollEnd as () => void)();\n }\n };\n\n node.addEventListener('scroll', handleScroll, { passive: true });\n\n return () => {\n node.removeEventListener('scroll', handleScroll);\n };\n }, [isMobile, onRowsScrollEnd, scrollEndThreshold, rows.length]);\n\n const showSearch = !!onSearch;\n const showAdd = !!onAdd;\n const showActions = !!actions;\n const showMoreActions = !!moreActions;\n const showHeaderMoreActions = isMobile && showMoreActions;\n const showTopbarMoreActions = !isMobile && showMoreActions;\n const showActionsContainer = showActions || showAdd || showHeaderMoreActions;\n const showTopbar =\n showTopbarMoreActions ||\n showSearch ||\n showColumnButton ||\n !!filterButton ||\n !isMobile;\n\n const selectionModel = useMemo(() => {\n if (Array.isArray(others.rowSelectionModel)) {\n return others.rowSelectionModel;\n }\n return [];\n }, [others.rowSelectionModel]);\n const numSelected = selectionModel.length;\n\n const getRowId = useMemo(\n () =>\n (others.getRowId ?? ((row: GridValidRowModel) => row.id)) as (\n row: GridValidRowModel,\n ) => GridRowId,\n [others.getRowId],\n );\n const pageRowIds = useMemo(\n () => rows.map(row => getRowId(row)),\n [rows, getRowId],\n );\n const pageRowIdSet = useMemo(() => new Set(pageRowIds), [pageRowIds]);\n const selectedOnPageCount = useMemo(\n () =>\n selectionModel.reduce(\n (count, id) => count + (pageRowIdSet.has(id) ? 1 : 0),\n 0,\n ),\n [selectionModel, pageRowIdSet],\n );\n const allSelected =\n pageRowIds.length > 0 && selectedOnPageCount === pageRowIds.length;\n const someSelected = selectedOnPageCount > 0 && !allSelected;\n\n const { onRowSelectionModelChange } = others;\n const emitRowSelectionChange = useCallback(\n (nextSelection: GridRowId[]) => {\n if (!onRowSelectionModelChange) return;\n (\n onRowSelectionModelChange as unknown as (\n model: GridRowId[],\n details?: unknown,\n ) => void\n )(nextSelection);\n },\n [onRowSelectionModelChange],\n );\n\n const clearSelection = useCallback(() => {\n emitRowSelectionChange([]);\n }, [emitRowSelectionChange]);\n\n const selectedIdSet = useMemo(\n () => new Set(selectionModel),\n [selectionModel],\n );\n const selectedRowsInPage = useMemo(\n () => rows.filter(row => selectedIdSet.has(getRowId(row))),\n [rows, selectedIdSet, getRowId],\n );\n\n const bulkActionContext: BulkActionContext<T> = useMemo(\n () => ({\n selectedIds: selectionModel,\n selectedRowsInPage: selectedRowsInPage as T[],\n selectedCount: numSelected,\n clearSelection,\n }),\n [selectionModel, selectedRowsInPage, numSelected, clearSelection],\n );\n\n const hasBulkActions = !!bulkActions?.length;\n\n const handleSelectAllToggle = useCallback(\n (_event: ChangeEvent<HTMLInputElement>, checked: boolean) => {\n if (!onRowSelectionModelChange) return;\n\n if (checked) {\n const selectedIds = new Set(selectionModel);\n const nextSelection = [...selectionModel];\n\n pageRowIds.forEach(id => {\n if (!selectedIds.has(id)) {\n nextSelection.push(id);\n }\n });\n\n emitRowSelectionChange(nextSelection);\n return;\n }\n\n const nextSelection = selectionModel.filter(id => !pageRowIdSet.has(id));\n emitRowSelectionChange(nextSelection);\n },\n [\n onRowSelectionModelChange,\n selectionModel,\n pageRowIds,\n pageRowIdSet,\n emitRowSelectionChange,\n ],\n );\n\n const FooterComponent = useCallback(() => {\n if (onPaginationChange) {\n return (\n <DesktopFooter\n rowCount={rowCount}\n page={paginationModel.page}\n rowsPerPage={paginationModel.pageSize}\n onPaginationChange={onPaginationChange}\n />\n );\n }\n\n return null;\n }, [rowCount, paginationModel, onPaginationChange]);\n\n const dataGridSlots: DataGridSlotsProps = useMemo(\n () => ({\n ...slots,\n footer: FooterComponent as unknown as DataGridSlotsProps['footer'],\n ...(showColumnButton &&\n !slots?.toolbar && {\n toolbar: Toolbar as unknown as DataGridSlotsProps['toolbar'],\n }),\n }),\n [slots, FooterComponent, showColumnButton],\n );\n\n const selectionOverlay = hasBulkActions && numSelected > 0 && (\n <SelectionOverlay>\n <Tooltip title=\"Selecione todos nessa pagina\">\n <SelectionCheckbox\n size=\"small\"\n checked={allSelected}\n indeterminate={someSelected}\n onChange={handleSelectAllToggle}\n />\n </Tooltip>\n\n <Tooltip title=\"Desselecionar tudo\">\n <IconButton\n size=\"small\"\n onClick={clearSelection}\n aria-label=\"Desselecionar tudo\"\n sx={{ color: 'primary.main' }}\n >\n <Icon icon=\"CLOSE_MARK_BUTTON\" width={18} height={18} />\n </IconButton>\n </Tooltip>\n\n <SelectionCount variant=\"body2\">\n {numSelected} selecionado{numSelected > 1 ? 's' : ''}\n </SelectionCount>\n\n <BulkActionsBar actions={bulkActions ?? []} context={bulkActionContext} />\n </SelectionOverlay>\n );\n\n return (\n <Container\n key={loading ? 'loading' : 'data'}\n breakpoint={breakpoint}\n {...containerProps}\n flex={loading ? 1 : undefined}\n minHeight={loading || rows.length === 0 ? 562 : undefined}\n >\n {header ? (\n <Stack p={3} {...headerProps}>\n {header}\n </Stack>\n ) : (\n <>\n <Header breakpoint={breakpoint}>\n <Typography variant=\"overline\" color=\"text.secondary\" noWrap>\n {title}\n </Typography>\n\n {showActionsContainer && (\n <ActionsContainer breakpoint={breakpoint}>\n {showActions && actions}\n\n {showAdd && (\n <>\n {showActions && (\n <ActionsDivider orientation=\"vertical\" flexItem />\n )}\n\n <Button\n startIcon={<Icon icon=\"SIMPLE_ADD\" />}\n variant=\"contained\"\n onClick={onAdd}\n >\n Adicionar\n </Button>\n </>\n )}\n\n {showHeaderMoreActions && (\n <>\n {(showActions || showAdd) && (\n <ActionsDivider orientation=\"vertical\" flexItem />\n )}\n\n <Button\n color=\"inherit\"\n startIcon={<Icon icon=\"MORE_BOLD\" />}\n size=\"small\"\n onClick={popover.onOpen}\n >\n Mais\n </Button>\n </>\n )}\n </ActionsContainer>\n )}\n </Header>\n\n {showTopbar && (\n <Topbar breakpoint={breakpoint}>\n <Stack\n flex={1}\n direction=\"row\"\n alignItems=\"center\"\n id={DATAGRID_ACTIONS}\n gap={0.5}\n >\n {showMoreActions && (\n <>\n {showTopbarMoreActions && (\n <>\n <Button\n color=\"inherit\"\n startIcon={<Icon icon=\"MORE_BOLD\" />}\n size=\"small\"\n onClick={popover.onOpen}\n >\n Mais\n </Button>\n\n {!isMobile && (\n <ToolbarActionsDivider\n orientation=\"vertical\"\n flexItem\n />\n )}\n </>\n )}\n\n {(showTopbarMoreActions || showHeaderMoreActions) && (\n <MoreActionsPopover\n open={popover.open}\n anchorEl={popover.open}\n onClose={popover.onClose}\n disabledArrow={true}\n >\n <EnhancedMoreActions onClose={popover.onClose}>\n {moreActions}\n </EnhancedMoreActions>\n </MoreActionsPopover>\n )}\n </>\n )}\n\n {!isMobile && filterButton && (\n <>\n {filterButton}\n\n {showTopbarMoreActions && (\n <ToolbarActionsDivider orientation=\"vertical\" flexItem />\n )}\n </>\n )}\n </Stack>\n\n {showSearch && (\n <SearchContainer breakpoint={breakpoint}>\n <SearchInput\n value={searchValue}\n placeholder=\"Buscar\"\n onSearch={onSearch}\n onChange={e => onSearchChange?.(e.target.value)}\n size=\"small\"\n fullWidth\n iconPosition=\"start\"\n />\n {isMobile && filterButton && (\n <Stack ml={1}>{filterButton}</Stack>\n )}\n </SearchContainer>\n )}\n </Topbar>\n )}\n\n {activeFilters && activeFilters}\n\n {!showTopbar && <TopbarDivider />}\n </>\n )}\n\n {isMobile ? (\n <Result\n isFetching={fetching}\n fetching={<FixedProgressBar />}\n isLoading={loading}\n loading={<LoadingProgress />}\n isEmpty={rows.length === 0}\n empty={\n <Stack flex={1} direction=\"column\" {...mobileSlotsProps}>\n {mobileSlots && mobileSlots}\n\n <Stack flex={1} alignItems=\"center\" justifyContent=\"center\">\n {slots?.noRowsOverlay ? (\n <slots.noRowsOverlay />\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n Nenhum registro encontrado\n </Typography>\n )}\n </Stack>\n </Stack>\n }\n >\n <Stack\n direction=\"column\"\n flex={1}\n minHeight={0}\n {...mobileSlotsProps}\n >\n {mobileSlots && mobileSlots}\n\n <Scrollbar fillContent ref={scrollableNodeRef}>\n {rows.map(row => (\n <Fragment key={row.id}>{mobileRender(row)}</Fragment>\n ))}\n </Scrollbar>\n </Stack>\n\n {!hideFooter && onPaginationChange && (\n <MobilePaginationContainer>\n <Pagination\n count={rowCount}\n page={paginationModel.page}\n rowsPerPage={paginationModel.pageSize}\n onPageChange={newPage =>\n onPaginationChange?.(newPage, paginationModel.pageSize)\n }\n onRowsPerPageChange={newRowsPerPage =>\n onPaginationChange?.(paginationModel.page, newRowsPerPage)\n }\n />\n </MobilePaginationContainer>\n )}\n </Result>\n ) : (\n <DataGridWrapper>\n {selectionOverlay}\n <DataGrid\n columns={columns}\n rows={rows}\n slots={dataGridSlots}\n slotProps={{\n panel: { anchorEl: filterButtonEl },\n toolbar: {\n setFilterButtonEl,\n showQuickFilter: true,\n } as unknown as GridSlotsComponentsProps['toolbar'],\n ...slotProps,\n }}\n columnHeaderHeight={48}\n getRowHeight={() => 68}\n loading={loading}\n fetching={fetching}\n hideFooter={hideFooter}\n onRowsScrollEnd={onRowsScrollEnd}\n scrollEndThreshold={scrollEndThreshold}\n {...others}\n />\n </DataGridWrapper>\n )}\n\n {fetchingNextPage && <LinearProgress />}\n </Container>\n );\n};\n\nexport default memo(DataViewComponent, isEqual) as typeof DataViewComponent;\nexport {\n ActionsContainer,\n ActionsDivider,\n Container,\n DataGridWrapper,\n DesktopFooter,\n EnhancedMoreActions,\n Header,\n MobilePaginationContainer,\n SearchContainer,\n SelectionActions,\n SelectionCount,\n SelectionOverlay,\n Toolbar,\n ToolbarActionsDivider,\n Topbar,\n};\nexport type {\n BulkAction,\n BulkActionConfirmation,\n BulkActionContext,\n} from './bulkActions';\n","export const DATAGRID_ACTIONS = 'datagrid-actions';\n","import { useCallback, useMemo, useState } from 'react';\nimport LoadingButton from '@mui/lab/LoadingButton';\nimport { GridValidRowModel } from '@mui/x-data-grid-premium';\n\nimport Confirm from 'components/Confirm';\nimport Icon from 'components/Icon';\n\nimport type {\n BulkAction,\n BulkActionConfirmation,\n BulkActionContext,\n} from './bulkActions';\nimport type { BulkActionsBarProps } from './props';\nimport { SelectionActions } from './styles';\n\nconst resolveDynamicBoolean = <T extends GridValidRowModel>(\n value: boolean | ((context: BulkActionContext<T>) => boolean) | undefined,\n context: BulkActionContext<T>,\n) => (typeof value === 'function' ? value(context) : !!value);\n\nconst getConfirmationConfig = (\n confirmation: BulkActionConfirmation | boolean | undefined,\n) => {\n if (!confirmation) return undefined;\n if (confirmation === true) return {};\n\n return confirmation;\n};\n\nconst BulkActionsBar = <T extends GridValidRowModel>({\n actions,\n context,\n}: BulkActionsBarProps<T>) => {\n const [confirmAction, setConfirmAction] = useState<BulkAction<T> | null>(\n null,\n );\n const [runningActionId, setRunningActionId] = useState<string | null>(null);\n\n const visibleActions = useMemo(\n () =>\n actions.filter(action => !resolveDynamicBoolean(action.hidden, context)),\n [actions, context],\n );\n\n const executeAction = useCallback(\n async (action: BulkAction<T>) => {\n setRunningActionId(action.id);\n try {\n await action.handler(context);\n } finally {\n setRunningActionId(null);\n }\n },\n [context],\n );\n\n const handleActionClick = useCallback(\n (action: BulkAction<T>) => {\n if (action.confirmation) {\n setConfirmAction(action);\n return;\n }\n\n void executeAction(action).catch(() => undefined);\n },\n [executeAction],\n );\n\n const handleConfirm = useCallback(async () => {\n if (!confirmAction) return;\n await executeAction(confirmAction);\n setConfirmAction(null);\n }, [confirmAction, executeAction]);\n\n const handleCloseConfirm = useCallback(() => {\n if (runningActionId) return;\n setConfirmAction(null);\n }, [runningActionId]);\n\n const confirmationConfig = getConfirmationConfig(confirmAction?.confirmation);\n\n return (\n <>\n <SelectionActions>\n {visibleActions.map(action => {\n const disabled =\n !!runningActionId ||\n resolveDynamicBoolean(action.disabled, context);\n const loading = runningActionId === action.id;\n\n return (\n <LoadingButton\n key={action.id}\n size=\"small\"\n variant=\"text\"\n color={action.color ?? 'primary'}\n onClick={() => handleActionClick(action)}\n loading={loading}\n disabled={disabled}\n startIcon={\n typeof action.icon === 'string' ? (\n <Icon icon={action.icon} />\n ) : (\n action.icon\n )\n }\n >\n {action.label}\n </LoadingButton>\n );\n })}\n </SelectionActions>\n\n {confirmAction && (\n <Confirm\n open\n onClose={handleCloseConfirm}\n onConfirm={() => {\n void handleConfirm().catch(() => undefined);\n }}\n confirming={runningActionId === confirmAction.id}\n modalTitle={\n confirmationConfig?.title ??\n 'Tem certeza que deseja executar esta ação?'\n }\n message={\n confirmationConfig?.message ??\n 'Essa ação será aplicada aos itens selecionados.'\n }\n cancelButtonText={confirmationConfig?.cancelButtonText ?? 'Cancelar'}\n confirmButtonText={\n confirmationConfig?.confirmButtonText ?? 'Confirmar'\n }\n confirmButtonProps={{\n color: confirmAction.color ?? 'primary',\n }}\n />\n )}\n </>\n );\n};\n\nexport default BulkActionsBar;\n","import { memo } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Pagination from './Pagination';\nimport { DesktopFooterProps } from './props';\nimport { DesktopPaginationContainer } from './styles';\n\nconst DesktopFooter = ({\n rowCount,\n page,\n rowsPerPage,\n onPaginationChange,\n}: DesktopFooterProps) => {\n return (\n <DesktopPaginationContainer>\n <Stack direction=\"row\" alignItems=\"center\" gap={0.5}>\n <Typography variant=\"body2\" color=\"text.disabled\">\n Total de itens:\n </Typography>\n <Typography variant=\"body2\">{rowCount}</Typography>\n </Stack>\n\n <Pagination\n count={rowCount}\n page={page}\n rowsPerPage={rowsPerPage}\n onPageChange={newPage => onPaginationChange(newPage, rowsPerPage)}\n onRowsPerPageChange={newRowsPerPage =>\n onPaginationChange(page, newRowsPerPage)\n }\n />\n </DesktopPaginationContainer>\n );\n};\n\nexport default memo(DesktopFooter);\n","import {\n Children,\n cloneElement,\n isValidElement,\n memo,\n ReactElement,\n ReactNode,\n} from 'react';\n\nimport { EnhancedMoreActionsProps } from './props';\n\nconst createEnhanceMoreActions = (\n children: ReactNode,\n onClose: () => void,\n): ReactNode => {\n return Children.map(children, child => {\n if (!isValidElement(child)) {\n return child;\n }\n\n const originalOnClick = (\n child.props as { onClick?: (...args: unknown[]) => void }\n ).onClick;\n\n const enhancedProps: {\n onClick?: (...args: unknown[]) => void;\n children?: ReactNode;\n } = {};\n\n enhancedProps.onClick = (...args: unknown[]) => {\n onClose();\n if (originalOnClick) {\n originalOnClick(...args);\n }\n };\n\n const childProps = child.props as { children?: ReactNode };\n if (childProps?.children) {\n enhancedProps.children = createEnhanceMoreActions(\n childProps.children,\n onClose,\n );\n }\n\n return cloneElement(child as ReactElement, enhancedProps);\n });\n};\n\nconst EnhancedMoreActions = ({\n children,\n onClose,\n}: EnhancedMoreActionsProps) => {\n if (!children) return null;\n return createEnhanceMoreActions(children, onClose);\n};\n\nexport default memo(EnhancedMoreActions);\n","import { forwardRef, useCallback } from 'react';\nimport Button, { ButtonProps } from '@mui/material/Button';\nimport { GridToolbarColumnsButton } from '@mui/x-data-grid-premium';\n\nimport Icon from 'components/Icon';\nimport Portal from 'components/Portal';\n\nimport { DATAGRID_ACTIONS } from './contants';\nimport { ToolbarProps } from './props';\n\nconst ColumnsButton = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ children, ...props }, ref) => (\n <Button\n {...props}\n ref={ref}\n color=\"inherit\"\n startIcon={<Icon icon=\"COLUMNS\" />}\n >\n {children ?? 'Colunas'}\n </Button>\n ),\n);\n\nColumnsButton.displayName = 'ColumnsButton';\n\nconst Toolbar = ({ setFilterButtonEl }: ToolbarProps) => {\n const handleColumnsButtonRef = useCallback(\n (button: HTMLButtonElement | null) => {\n setFilterButtonEl(button);\n },\n [setFilterButtonEl],\n );\n\n return (\n <Portal container={DATAGRID_ACTIONS}>\n <GridToolbarColumnsButton\n ref={handleColumnsButtonRef}\n slotProps={{\n button: {\n color: 'inherit',\n startIcon: <Icon icon=\"COLUMNS\" />,\n children: 'Colunas',\n },\n }}\n />\n </Portal>\n );\n};\n\nexport default Toolbar;\n"]}
@@ -1,12 +0,0 @@
1
- import p from '@mui/lab/LoadingButton';
2
- import c from '@mui/material/Button';
3
- import u from '@mui/material/Dialog';
4
- import C from '@mui/material/DialogActions';
5
- import D from '@mui/material/DialogContent';
6
- import x from '@mui/material/DialogTitle';
7
- import { jsxs, jsx } from 'react/jsx-runtime';
8
-
9
- var B=({modalTitle:r="Tem certeza que deseja excluir?",message:n="Essa a\xE7\xE3o n\xE3o poder\xE1 ser desfeita.",cancelButtonText:a="Cancelar",confirmButtonText:e="Sim, excluir registro",onClose:i,onConfirm:l,confirming:m,child:g,cancelButtonProps:f,confirmButtonProps:s,...d})=>jsxs(u,{fullWidth:!0,maxWidth:"xs",...d,onClose:i,children:[jsx(x,{children:r}),jsx(D,{children:n}),g,jsxs(C,{children:[jsx(c,{variant:"outlined",color:"inherit",onClick:i,size:"large",...f,children:a}),jsx(p,{variant:"contained",onClick:l,size:"large",loading:m,...s,children:e})]})]}),L=B;
10
-
11
- export { L as a };
12
- //# sourceMappingURL=chunk-D3RY7C7B.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Confirm/index.tsx"],"names":["LoadingButton","Button","Dialog","DialogActions","DialogContent","DialogTitle","jsx","jsxs","Confirm","modalTitle","message","cancelButtonText","confirmButtonText","onClose","onConfirm","confirming","child","cancelButtonProps","confirmButtonProps","other","Confirm_default"],"mappings":"AAAA,OAAOA,MAAmB,yBAC1B,OAAOC,MAAY,uBACnB,OAAOC,MAAY,uBACnB,OAAOC,MAAmB,8BAC1B,OAAOC,MAAmB,8BAC1B,OAAOC,MAAiB,4BAmBlB,cAAAC,EAIA,QAAAC,MAJA,oBAfN,IAAMC,EAAU,CAAC,CACf,WAAAC,EAAa,kCACb,QAAAC,EAAU,iDACV,iBAAAC,EAAmB,WACnB,kBAAAC,EAAoB,wBACpB,QAAAC,EACA,UAAAC,EACA,WAAAC,EACA,MAAAC,EACA,kBAAAC,EACA,mBAAAC,EACA,GAAGC,CACL,IAEIZ,EAACL,EAAA,CAAO,UAAS,GAAC,SAAS,KAAM,GAAGiB,EAAO,QAASN,EAClD,UAAAP,EAACD,EAAA,CAAa,SAAAI,EAAW,EAEzBH,EAACF,EAAA,CAAe,SAAAM,EAAQ,EACvBM,EACDT,EAACJ,EAAA,CACC,UAAAG,EAACL,EAAA,CACC,QAAQ,WACR,MAAM,UACN,QAASY,EACT,KAAK,QACJ,GAAGI,EAEH,SAAAN,EACH,EAEAL,EAACN,EAAA,CACC,QAAQ,YACR,QAASc,EACT,KAAK,QACL,QAASC,EACR,GAAGG,EAEH,SAAAN,EACH,GACF,GACF,EAIGQ,EAAQZ","sourcesContent":["import LoadingButton from '@mui/lab/LoadingButton';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\n\nimport { ConfirmProps } from './props';\n\nconst Confirm = ({\n modalTitle = 'Tem certeza que deseja excluir?',\n message = 'Essa ação não poderá ser desfeita.',\n cancelButtonText = 'Cancelar',\n confirmButtonText = 'Sim, excluir registro',\n onClose,\n onConfirm,\n confirming,\n child,\n cancelButtonProps,\n confirmButtonProps,\n ...other\n}: ConfirmProps) => {\n return (\n <Dialog fullWidth maxWidth=\"xs\" {...other} onClose={onClose}>\n <DialogTitle>{modalTitle}</DialogTitle>\n\n <DialogContent>{message}</DialogContent>\n {child}\n <DialogActions>\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n onClick={onClose}\n size=\"large\"\n {...cancelButtonProps}\n >\n {cancelButtonText}\n </Button>\n\n <LoadingButton\n variant=\"contained\"\n onClick={onConfirm}\n size=\"large\"\n loading={confirming}\n {...confirmButtonProps}\n >\n {confirmButtonText}\n </LoadingButton>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default Confirm;\n"]}