@zydon/common 2.8.63 → 2.8.65

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.
Files changed (152) hide show
  1. package/dist/{chunk-M3IIWN6P.js → chunk-2MCLMTFV.js} +2 -2
  2. package/dist/chunk-2MCLMTFV.js.map +1 -0
  3. package/dist/{chunk-NR6PQELF.js → chunk-3ELMAXMX.js} +2 -2
  4. package/dist/chunk-5PUQMKA5.js +27 -0
  5. package/dist/chunk-5PUQMKA5.js.map +1 -0
  6. package/dist/{chunk-CMNW65VY.js → chunk-7JCGMZ6E.js} +2 -2
  7. package/dist/{chunk-AVPFUSEB.js → chunk-7LBBLVDC.js} +1 -1
  8. package/dist/{chunk-AVPFUSEB.js.map → chunk-7LBBLVDC.js.map} +1 -1
  9. package/dist/{chunk-EDO23OCC.js → chunk-DGCPCUVB.js} +2 -2
  10. package/dist/chunk-DGCPCUVB.js.map +1 -0
  11. package/dist/{chunk-H3SS73NK.js → chunk-EPMAHRQO.js} +2 -2
  12. package/dist/chunk-FBVAHVU3.js +11 -0
  13. package/dist/chunk-FBVAHVU3.js.map +1 -0
  14. package/dist/{chunk-DRJ5UDF6.js → chunk-FQOV5EGQ.js} +2 -2
  15. package/dist/{chunk-V7EE5E2H.js → chunk-GODJQLB7.js} +3 -3
  16. package/dist/chunk-JSL5OEWZ.js +7 -0
  17. package/dist/chunk-JSL5OEWZ.js.map +1 -0
  18. package/dist/chunk-KZFKHQ5P.js +14 -0
  19. package/dist/chunk-KZFKHQ5P.js.map +1 -0
  20. package/dist/{chunk-KYV74QIT.js → chunk-LNESYSHP.js} +1 -1
  21. package/dist/chunk-LNESYSHP.js.map +1 -0
  22. package/dist/{chunk-BNBE2OMA.js → chunk-LZQ7OFKO.js} +1 -1
  23. package/dist/{chunk-BNBE2OMA.js.map → chunk-LZQ7OFKO.js.map} +1 -1
  24. package/dist/{chunk-HVH6MGHX.js → chunk-N2UR3W55.js} +2 -2
  25. package/dist/{chunk-IDFJFFIV.js → chunk-NMGWHSNZ.js} +2 -2
  26. package/dist/{chunk-LJ5JKDMG.js → chunk-NWT5TUJO.js} +2 -2
  27. package/dist/chunk-NWT5TUJO.js.map +1 -0
  28. package/dist/{chunk-EFAF33PQ.js → chunk-PODYWSY7.js} +2 -2
  29. package/dist/{chunk-ESDQCHJR.js → chunk-PWR4GBUH.js} +2 -2
  30. package/dist/{chunk-3WFLKIPF.js → chunk-Q2AVS24Z.js} +2 -2
  31. package/dist/{chunk-SKFBUMRN.js → chunk-QMFFV7WM.js} +3 -3
  32. package/dist/{chunk-UOR22KQX.js → chunk-SDS77DQQ.js} +3 -3
  33. package/dist/{chunk-OFOIKKG2.js → chunk-T53CFFZY.js} +2 -2
  34. package/dist/chunk-TBFQ5PEL.js +34 -0
  35. package/dist/chunk-TBFQ5PEL.js.map +1 -0
  36. package/dist/{chunk-7OV7UPWM.js → chunk-U4I7JPER.js} +1 -1
  37. package/dist/{chunk-7OV7UPWM.js.map → chunk-U4I7JPER.js.map} +1 -1
  38. package/dist/{chunk-T6UNWMMX.js → chunk-UJMWTYPH.js} +2 -2
  39. package/dist/{chunk-PVI5BAUW.js → chunk-Y3TJIK6E.js} +2 -2
  40. package/dist/chunk-YJQVENY7.js +18 -0
  41. package/dist/chunk-YJQVENY7.js.map +1 -0
  42. package/dist/{chunk-YG74GZPD.js → chunk-YKLRB3EJ.js} +2 -2
  43. package/dist/components/ActionButton/index.js +3 -3
  44. package/dist/components/Autocomplete/index.js +3 -3
  45. package/dist/components/AutocompleteDetailed/index.js +1 -1
  46. package/dist/components/AvatarButton/index.js +7 -7
  47. package/dist/components/BuilderLayout/index.js +3 -3
  48. package/dist/components/BuilderSidebar/index.js +2 -2
  49. package/dist/components/BulkEditModal/index.js +4 -4
  50. package/dist/components/CardBrand/index.js +2 -2
  51. package/dist/components/Common/index.js +5 -5
  52. package/dist/components/Common/index.js.map +1 -1
  53. package/dist/components/CopyButton/index.js +4 -4
  54. package/dist/components/DataCards/index.js +1 -1
  55. package/dist/components/DataGrid/index.js +2 -2
  56. package/dist/components/DataView/index.js +6 -6
  57. package/dist/components/DragButton/index.js +3 -3
  58. package/dist/components/Drawer/index.js +5 -5
  59. package/dist/components/Drawer/index.js.map +1 -1
  60. package/dist/components/DynamicDataView/index.js +8 -8
  61. package/dist/components/DynamicDataView/index.js.map +1 -1
  62. package/dist/components/EasyCropModal/index.js +4 -4
  63. package/dist/components/EmptyContent/index.js +1 -1
  64. package/dist/components/Error/index.js +2 -2
  65. package/dist/components/ExpandableGroup/index.js +2 -2
  66. package/dist/components/FileUpload/index.js +8 -8
  67. package/dist/components/FrameSkeleton/index.js +2 -2
  68. package/dist/components/HelpButton/index.js +3 -3
  69. package/dist/components/Icon/index.js +2 -2
  70. package/dist/components/IconButton/index.js +3 -3
  71. package/dist/components/ImageCropModal/index.js +3 -3
  72. package/dist/components/Incrementer/index.js +3 -3
  73. package/dist/components/InfoCircle/index.js +3 -3
  74. package/dist/components/Label/index.js +1 -1
  75. package/dist/components/ListBundles/index.js +3 -3
  76. package/dist/components/MenuItem/index.js +2 -2
  77. package/dist/components/Modal/index.js +3 -3
  78. package/dist/components/MoreMenu/index.js +2 -2
  79. package/dist/components/NotFound/index.js +2 -2
  80. package/dist/components/PasswordRules/index.js +2 -2
  81. package/dist/components/PopoverSelect/index.js +2 -2
  82. package/dist/components/SearchInput/index.js +3 -3
  83. package/dist/components/SelectList/index.js +5 -5
  84. package/dist/components/SelectableCards/index.js +4 -4
  85. package/dist/components/SeoPreview/index.js +2 -2
  86. package/dist/components/SplashScreen/index.js.map +1 -1
  87. package/dist/components/StateDisplay/index.js +3 -3
  88. package/dist/components/Steps/index.js +2 -2
  89. package/dist/components/StyledTab/index.js +2 -2
  90. package/dist/components/SwapList/index.js +3 -3
  91. package/dist/components/ToggleTheme/index.js +5 -5
  92. package/dist/components/Tooltip/index.js +1 -1
  93. package/dist/components/WebhookCard/index.js +7 -7
  94. package/dist/components/WebhookCard/index.js.map +1 -1
  95. package/dist/components/carousel/index.js +3 -3
  96. package/dist/components/form/Address/index.js +4 -4
  97. package/dist/components/form/Autocomplete/index.js +4 -4
  98. package/dist/components/form/AutocompleteDetailed/index.js +1 -1
  99. package/dist/components/form/Codes/index.js +2 -2
  100. package/dist/components/form/Codes/index.js.map +1 -1
  101. package/dist/components/form/FileUpload/index.js +8 -8
  102. package/dist/components/form/Incrementer/index.js +3 -3
  103. package/dist/components/form/Password/index.js +2 -2
  104. package/dist/components/form/SelectList/index.js +5 -5
  105. package/dist/components/form/SelectableCards/index.js +4 -4
  106. package/dist/components/form/Webhook/index.js +5 -5
  107. package/dist/components/lightbox/index.js +2 -2
  108. package/dist/components/table/index.js +3 -3
  109. package/dist/contexts/PushNotifications/index.js.map +1 -1
  110. package/dist/hooks/useThemeToggle.js +4 -4
  111. package/dist/index.js +4 -4
  112. package/dist/theme/theme-provider.js +3 -3
  113. package/dist/theme/with-settings/index.js +2 -2
  114. package/dist/types/icon.d.ts +2 -0
  115. package/dist/types/icon.js +1 -1
  116. package/dist/utils/color.js +1 -1
  117. package/eslint-shared-rules.cjs +25 -0
  118. package/package.json +11 -5
  119. package/scripts/eslint-rules/mui-icon-button-has-label.cjs +71 -0
  120. package/scripts/eslint-rules/tooltip-child-has-wrapper.cjs +101 -0
  121. package/dist/chunk-3C7RDPW6.js +0 -18
  122. package/dist/chunk-3C7RDPW6.js.map +0 -1
  123. package/dist/chunk-EDO23OCC.js.map +0 -1
  124. package/dist/chunk-FBN7HCBY.js +0 -8
  125. package/dist/chunk-FBN7HCBY.js.map +0 -1
  126. package/dist/chunk-HHX5J5QV.js +0 -34
  127. package/dist/chunk-HHX5J5QV.js.map +0 -1
  128. package/dist/chunk-KYV74QIT.js.map +0 -1
  129. package/dist/chunk-LJ5JKDMG.js.map +0 -1
  130. package/dist/chunk-M3IIWN6P.js.map +0 -1
  131. package/dist/chunk-VURAUMLN.js +0 -11
  132. package/dist/chunk-VURAUMLN.js.map +0 -1
  133. package/dist/chunk-XLNJJJ7D.js +0 -27
  134. package/dist/chunk-XLNJJJ7D.js.map +0 -1
  135. package/dist/chunk-ZXK32CSF.js +0 -14
  136. package/dist/chunk-ZXK32CSF.js.map +0 -1
  137. /package/dist/{chunk-NR6PQELF.js.map → chunk-3ELMAXMX.js.map} +0 -0
  138. /package/dist/{chunk-CMNW65VY.js.map → chunk-7JCGMZ6E.js.map} +0 -0
  139. /package/dist/{chunk-H3SS73NK.js.map → chunk-EPMAHRQO.js.map} +0 -0
  140. /package/dist/{chunk-DRJ5UDF6.js.map → chunk-FQOV5EGQ.js.map} +0 -0
  141. /package/dist/{chunk-V7EE5E2H.js.map → chunk-GODJQLB7.js.map} +0 -0
  142. /package/dist/{chunk-HVH6MGHX.js.map → chunk-N2UR3W55.js.map} +0 -0
  143. /package/dist/{chunk-IDFJFFIV.js.map → chunk-NMGWHSNZ.js.map} +0 -0
  144. /package/dist/{chunk-EFAF33PQ.js.map → chunk-PODYWSY7.js.map} +0 -0
  145. /package/dist/{chunk-ESDQCHJR.js.map → chunk-PWR4GBUH.js.map} +0 -0
  146. /package/dist/{chunk-3WFLKIPF.js.map → chunk-Q2AVS24Z.js.map} +0 -0
  147. /package/dist/{chunk-SKFBUMRN.js.map → chunk-QMFFV7WM.js.map} +0 -0
  148. /package/dist/{chunk-UOR22KQX.js.map → chunk-SDS77DQQ.js.map} +0 -0
  149. /package/dist/{chunk-OFOIKKG2.js.map → chunk-T53CFFZY.js.map} +0 -0
  150. /package/dist/{chunk-T6UNWMMX.js.map → chunk-UJMWTYPH.js.map} +0 -0
  151. /package/dist/{chunk-PVI5BAUW.js.map → chunk-Y3TJIK6E.js.map} +0 -0
  152. /package/dist/{chunk-YG74GZPD.js.map → chunk-YKLRB3EJ.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import { a } from '../../../chunk-YXRL4O4H.js';
2
- import { a as a$2 } from '../../../chunk-OFOIKKG2.js';
3
- import { a as a$3 } from '../../../chunk-HVH6MGHX.js';
4
- import '../../../chunk-H3SS73NK.js';
5
- import { a as a$1 } from '../../../chunk-VURAUMLN.js';
6
- import '../../../chunk-EDO23OCC.js';
2
+ import { a as a$2 } from '../../../chunk-T53CFFZY.js';
3
+ import { a as a$3 } from '../../../chunk-N2UR3W55.js';
4
+ import '../../../chunk-EPMAHRQO.js';
5
+ import { a as a$1 } from '../../../chunk-FBVAHVU3.js';
6
+ import '../../../chunk-DGCPCUVB.js';
7
7
  import { useFormContext, useFieldArray } from 'react-hook-form';
8
8
  import q from '@mui/material/Divider';
9
9
  import W from '@mui/material/IconButton';
@@ -1,5 +1,5 @@
1
- import { a } from '../../chunk-VURAUMLN.js';
2
- import '../../chunk-EDO23OCC.js';
1
+ import { a } from '../../chunk-FBVAHVU3.js';
2
+ import '../../chunk-DGCPCUVB.js';
3
3
  import w from '@mui/material/Box';
4
4
  import C, { useLightboxState } from 'yet-another-react-lightbox';
5
5
  import d from 'yet-another-react-lightbox/plugins/captions';
@@ -1,6 +1,6 @@
1
- import { a } from '../../chunk-CMNW65VY.js';
2
- import '../../chunk-VURAUMLN.js';
3
- import '../../chunk-EDO23OCC.js';
1
+ import { a } from '../../chunk-7JCGMZ6E.js';
2
+ import '../../chunk-FBVAHVU3.js';
3
+ import '../../chunk-DGCPCUVB.js';
4
4
  import S from '@mui/material/TableCell';
5
5
  import F from '@mui/material/TableRow';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -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","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"]}
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"]}
@@ -1,10 +1,10 @@
1
- export { a as useThemeToggle } from '../chunk-7OV7UPWM.js';
2
- import '../chunk-LJ5JKDMG.js';
1
+ export { a as useThemeToggle } from '../chunk-U4I7JPER.js';
2
+ import '../chunk-NWT5TUJO.js';
3
3
  import '../chunk-373WGZZL.js';
4
4
  import '../chunk-BX2DSNRV.js';
5
5
  import '../chunk-X4F3O7PX.js';
6
- import '../chunk-3WFLKIPF.js';
7
- import '../chunk-KYV74QIT.js';
6
+ import '../chunk-Q2AVS24Z.js';
7
+ import '../chunk-LNESYSHP.js';
8
8
  import '../chunk-YPL4KIKN.js';
9
9
  import '../chunk-HBOBTNB5.js';
10
10
  import '../chunk-WUFEPE2G.js';
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- export { a as useThemeToggle } from './chunk-7OV7UPWM.js';
2
- export { b as ThemeProvider, a as createTheme } from './chunk-LJ5JKDMG.js';
1
+ export { a as useThemeToggle } from './chunk-U4I7JPER.js';
2
+ export { b as ThemeProvider, a as createTheme } from './chunk-NWT5TUJO.js';
3
3
  import './chunk-373WGZZL.js';
4
4
  export { c as SettingsProvider, b as useSettingsContext } from './chunk-BX2DSNRV.js';
5
5
  export { b as defaultFont, c as primaryFont, d as secondaryFont, a as shadows, e as typography } from './chunk-X4F3O7PX.js';
6
- import './chunk-3WFLKIPF.js';
7
- import './chunk-KYV74QIT.js';
6
+ import './chunk-Q2AVS24Z.js';
7
+ import './chunk-LNESYSHP.js';
8
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-YPL4KIKN.js';
9
9
  import './chunk-HBOBTNB5.js';
10
10
  import './chunk-WUFEPE2G.js';
@@ -1,9 +1,9 @@
1
- export { b as default } from '../chunk-LJ5JKDMG.js';
1
+ export { b as default } from '../chunk-NWT5TUJO.js';
2
2
  import '../chunk-373WGZZL.js';
3
3
  export { b as useSettingsContext } from '../chunk-BX2DSNRV.js';
4
4
  import '../chunk-X4F3O7PX.js';
5
- import '../chunk-3WFLKIPF.js';
6
- import '../chunk-KYV74QIT.js';
5
+ import '../chunk-Q2AVS24Z.js';
6
+ import '../chunk-LNESYSHP.js';
7
7
  import '../chunk-YPL4KIKN.js';
8
8
  import '../chunk-HBOBTNB5.js';
9
9
  import '../chunk-WUFEPE2G.js';
@@ -1,5 +1,5 @@
1
- export { c as buildPrimaryColors, b as updateComponentsWithSettings, a as updateCoreWithSettings } from '../../chunk-3WFLKIPF.js';
2
- import '../../chunk-KYV74QIT.js';
1
+ export { c as buildPrimaryColors, b as updateComponentsWithSettings, a as updateCoreWithSettings } from '../../chunk-Q2AVS24Z.js';
2
+ import '../../chunk-LNESYSHP.js';
3
3
  import '../../chunk-YPL4KIKN.js';
4
4
  import '../../chunk-HBOBTNB5.js';
5
5
  import '../../chunk-GLRLKFPS.js';
@@ -436,6 +436,8 @@ declare enum Icon {
436
436
  SORTING_AZ_02 = "SORTING_AZ_02",
437
437
  DASHBOARD_SQUARE_03 = "DASHBOARD_SQUARE_03",
438
438
  DOWNLOAD = "DOWNLOAD",
439
+ CALENDAR_01_ICON = "CALENDAR_01_ICON",
440
+ TARGET_02_ICON = "TARGET_02_ICON",
439
441
  MEDIA_VIDEO_FILES = "MEDIA_VIDEO_FILES",
440
442
  MEDIA_IMAGE_FILES = "MEDIA_IMAGE_FILES",
441
443
  MEDIA_PDF_FILES = "MEDIA_PDF_FILES",
@@ -1,2 +1,2 @@
1
- export { b as ICON_ALIASES, a as Icon } from '../chunk-EDO23OCC.js';
1
+ export { b as ICON_ALIASES, a as Icon } from '../chunk-DGCPCUVB.js';
2
2
  //# sourceMappingURL=icon.js.map
@@ -1,3 +1,3 @@
1
- export { b as getContrastTextColor, a as getLuminosity, c as normalizeHexColor } from '../chunk-KYV74QIT.js';
1
+ export { b as getContrastTextColor, a as getLuminosity, c as normalizeHexColor } from '../chunk-LNESYSHP.js';
2
2
  import '../chunk-HBOBTNB5.js';
3
3
  //# sourceMappingURL=color.js.map
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Regras ESLint compartilhadas do @zydon/common.
5
+ *
6
+ * Uso nos projetos consumidores (eslint-local-rules.cjs):
7
+ *
8
+ * module.exports = require('@zydon/common/eslint-rules');
9
+ *
10
+ * // ou misturar com regras locais:
11
+ * module.exports = {
12
+ * ...require('@zydon/common/eslint-rules'),
13
+ * 'minha-regra': require('./minha-regra.cjs'),
14
+ * };
15
+ */
16
+
17
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
18
+ const tooltipChildHasWrapper = require('./scripts/eslint-rules/tooltip-child-has-wrapper.cjs');
19
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
20
+ const muiIconButtonHasLabel = require('./scripts/eslint-rules/mui-icon-button-has-label.cjs');
21
+
22
+ module.exports = {
23
+ 'tooltip-child-has-wrapper': tooltipChildHasWrapper,
24
+ 'mui-icon-button-has-label': muiIconButtonHasLabel,
25
+ };
package/package.json CHANGED
@@ -1,13 +1,16 @@
1
1
  {
2
2
  "name": "@zydon/common",
3
- "version": "2.8.63",
3
+ "version": "2.8.65",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "files": [
9
9
  "dist",
10
- "README"
10
+ "README",
11
+ "eslint-shared-rules.cjs",
12
+ "scripts/eslint-rules/tooltip-child-has-wrapper.cjs",
13
+ "scripts/eslint-rules/mui-icon-button-has-label.cjs"
11
14
  ],
12
15
  "author": "Zydon Tech",
13
16
  "bugs": {
@@ -27,8 +30,8 @@
27
30
  "build": "tsup && node scripts/fix-sourcemaps.cjs",
28
31
  "build:watch": "tsup --watch",
29
32
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
30
- "lint:fix": "eslint --fix . --ext ts,tsx",
31
- "format": "prettier --write \"**/*.*\""
33
+ "lint:fix": "prettier --write \"**/*.*\" && eslint --fix . --ext ts,tsx",
34
+ "format": "prettier --write \"**/*.*\" && eslint --fix --quiet . --ext ts,tsx"
32
35
  },
33
36
  "exports": {
34
37
  ".": {
@@ -91,7 +94,10 @@
91
94
  "import": "./dist/utils/*.js",
92
95
  "types": "./dist/utils/*.d.ts"
93
96
  },
94
- "./styles.css": "./dist/index.css"
97
+ "./styles.css": "./dist/index.css",
98
+ "./eslint-rules": {
99
+ "require": "./eslint-shared-rules.cjs"
100
+ }
95
101
  },
96
102
  "sideEffects": false,
97
103
  "devDependencies": {
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ const MUI_ICONBUTTON_SOURCES = new Set([
4
+ '@mui/material/IconButton',
5
+ '@mui/material',
6
+ ]);
7
+
8
+ module.exports = {
9
+ meta: {
10
+ type: 'problem',
11
+ docs: {
12
+ description:
13
+ 'Require aria-label or aria-labelledby on MUI IconButton components.',
14
+ recommended: false,
15
+ },
16
+ schema: [],
17
+ messages: {
18
+ missingLabel: 'MUI IconButton must have aria-label or aria-labelledby.',
19
+ },
20
+ },
21
+ create(context) {
22
+ const muiIconButtonNames = new Set();
23
+
24
+ function isMuiIconButtonImport(node) {
25
+ return (
26
+ node && node.source && MUI_ICONBUTTON_SOURCES.has(node.source.value)
27
+ );
28
+ }
29
+
30
+ function collectMuiIconButtonNames(node) {
31
+ if (!isMuiIconButtonImport(node)) return;
32
+
33
+ for (const specifier of node.specifiers) {
34
+ if (
35
+ specifier.type === 'ImportDefaultSpecifier' &&
36
+ node.source.value === '@mui/material/IconButton'
37
+ ) {
38
+ muiIconButtonNames.add(specifier.local.name);
39
+ }
40
+
41
+ if (specifier.type === 'ImportSpecifier') {
42
+ const importedName = specifier.imported && specifier.imported.name;
43
+ if (importedName === 'IconButton') {
44
+ muiIconButtonNames.add(specifier.local.name);
45
+ }
46
+ }
47
+ }
48
+ }
49
+
50
+ function hasAriaLabel(node) {
51
+ return node.attributes.some(attr => {
52
+ if (attr.type !== 'JSXAttribute' || !attr.name) return false;
53
+ return (
54
+ attr.name.name === 'aria-label' ||
55
+ attr.name.name === 'aria-labelledby'
56
+ );
57
+ });
58
+ }
59
+
60
+ return {
61
+ ImportDeclaration: collectMuiIconButtonNames,
62
+ JSXOpeningElement(node) {
63
+ if (node.name.type !== 'JSXIdentifier') return;
64
+ if (!muiIconButtonNames.has(node.name.name)) return;
65
+ if (hasAriaLabel(node)) return;
66
+
67
+ context.report({ node, messageId: 'missingLabel' });
68
+ },
69
+ };
70
+ },
71
+ };
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ const TOOLTIP_SOURCES = new Set([
4
+ '@mui/material/Tooltip',
5
+ '@mui/material',
6
+ ]);
7
+
8
+ // Components from these sources forward refs and are safe as direct Tooltip children
9
+ const REF_SAFE_SOURCES = /^(@mui\/|@zydon\/common)/;
10
+
11
+ // Styled components from styles files also forward refs
12
+ const STYLE_FILE_PATTERN = /[\\/]styles?(?:\.ts|\.tsx)?$/;
13
+
14
+ module.exports = {
15
+ meta: {
16
+ type: 'problem',
17
+ docs: {
18
+ description:
19
+ 'Require MUI Tooltip children to be wrapped in a native HTML element or be a ref-safe component.',
20
+ recommended: false,
21
+ },
22
+ schema: [],
23
+ messages: {
24
+ unwrappedChild:
25
+ 'Tooltip children must be wrapped in a native HTML element (e.g., <span>). ' +
26
+ 'Use <span style={{ display: "inline-flex" }}> as wrapper, or use the Tooltip from @zydon/common which wraps automatically.',
27
+ },
28
+ },
29
+ create(context) {
30
+ const tooltipNames = new Set();
31
+ const refSafeNames = new Set();
32
+
33
+ function collectTooltipNames(node) {
34
+ if (!node.source || !TOOLTIP_SOURCES.has(node.source.value)) return;
35
+
36
+ for (const specifier of node.specifiers) {
37
+ if (
38
+ specifier.type === 'ImportDefaultSpecifier' &&
39
+ node.source.value === '@mui/material/Tooltip'
40
+ ) {
41
+ tooltipNames.add(specifier.local.name);
42
+ }
43
+
44
+ if (specifier.type === 'ImportSpecifier') {
45
+ const importedName = specifier.imported && specifier.imported.name;
46
+ if (importedName === 'Tooltip') {
47
+ tooltipNames.add(specifier.local.name);
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ function collectRefSafeComponents(node) {
54
+ if (!node.source) return;
55
+ const src = node.source.value;
56
+ if (!REF_SAFE_SOURCES.test(src) && !STYLE_FILE_PATTERN.test(src)) return;
57
+
58
+ for (const specifier of node.specifiers) {
59
+ refSafeNames.add(specifier.local.name);
60
+ }
61
+ }
62
+
63
+ return {
64
+ ImportDeclaration(node) {
65
+ collectTooltipNames(node);
66
+ collectRefSafeComponents(node);
67
+ },
68
+ JSXElement(node) {
69
+ const opening = node.openingElement;
70
+ if (opening.name.type !== 'JSXIdentifier') return;
71
+ if (!tooltipNames.has(opening.name.name)) return;
72
+
73
+ const jsxChildren = node.children.filter(
74
+ child =>
75
+ child.type === 'JSXElement' ||
76
+ child.type === 'JSXExpressionContainer',
77
+ );
78
+
79
+ if (jsxChildren.length !== 1) return;
80
+
81
+ const child = jsxChildren[0];
82
+
83
+ // JSXExpressionContainer ({variable}) — can't check statically, skip
84
+ if (child.type === 'JSXExpressionContainer') return;
85
+
86
+ if (child.type === 'JSXElement') {
87
+ const childName = child.openingElement.name;
88
+ if (childName.type === 'JSXIdentifier') {
89
+ // Native HTML elements start with lowercase in JSX
90
+ const isNative =
91
+ childName.name[0] === childName.name[0].toLowerCase();
92
+ const isRefSafe = refSafeNames.has(childName.name);
93
+ if (!isNative && !isRefSafe) {
94
+ context.report({ node: child, messageId: 'unwrappedChild' });
95
+ }
96
+ }
97
+ }
98
+ },
99
+ };
100
+ },
101
+ };
@@ -1,18 +0,0 @@
1
- import { a } from './chunk-VR3K2Y2C.js';
2
- import { b } from './chunk-RPO7AI5K.js';
3
- import k, { memo, useMemo, forwardRef, useCallback, useState, useDeferredValue, useEffect } from 'react';
4
- import Be, { autocompleteClasses } from '@mui/material/Autocomplete';
5
- import Le from '@mui/material/CircularProgress';
6
- import Ie from '@mui/material/TextField';
7
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { VariableSizeList } from 'react-window';
9
- import ke from '@mui/material/ListSubheader';
10
- import Y from '@mui/material/Typography';
11
- import T from '@mui/material/Stack';
12
- import Oe from '@mui/material/Popper';
13
- import { styled } from '@mui/material/styles';
14
-
15
- var _=memo(({params:e,name:r,placeholder:o,error:t,helperText:n,label:i,required:a,loading:p,tabIndex:m})=>jsx(Ie,{...e,name:r,placeholder:o,fullWidth:!0,error:!!t,helperText:n,label:i,required:a,InputProps:{...e.InputProps,endAdornment:jsxs(Fragment,{children:[p?jsx(Le,{color:"primary",size:20}):null,e.InputProps.endAdornment]})},inputProps:{...e.inputProps,name:r,tabIndex:m}}));_.displayName="AutocompleteDetailedInput";var U=_;var X=styled(Oe)({[`& .${autocompleteClasses.listbox}`]:{boxSizing:"border-box","& ul":{padding:0,margin:0}}}),F=styled(T)(({theme:e})=>({flex:1,width:"100%",gap:6,[e.breakpoints.down("md")]:{flexDirection:"column"},[e.breakpoints.up("md")]:{flexDirection:"row"}})),w=styled(T)(({theme:e})=>({flex:1,maxWidth:"100%",gap:6,[e.breakpoints.up("md")]:{flex:"1 1 calc(50% - 8px)",width:"calc(50% - 8px)",minWidth:"calc(50% - 8px)",maxWidth:"calc(50% - 8px)"}})),q=styled(T)(({theme:e})=>({position:"relative",alignItems:"center",justifyContent:"center",width:68,height:68,borderRadius:8,overflow:"hidden",img:{position:"absolute",width:"100%",height:"100%",objectFit:"cover"},[e.breakpoints.down("sm")]:{display:"none"}})),J=styled("hr")(({theme:e})=>({borderStyle:"dashed",position:"absolute",bottom:0,width:"100%",margin:0,borderColor:e.palette.divider,borderWidth:"0 0 thin"}));var we={width:68,height:68,borderRadius:1},Z=memo(({option:e})=>{let r=useMemo(()=>Object.keys(e).filter(t=>t.startsWith("field")).map((t,n)=>{let i=e[t];if(i&&typeof i=="object"){let a="label"in i?i.label:null,p="value"in i?i.value:null;return jsxs(Y,{component:"span",variant:"body2",color:"textPrimary",noWrap:!0,children:[a,": ",p]},`${t}:${n}`)}}),[e]),o=useMemo(()=>e.image?jsx("img",{alt:"Imagem",src:e.image}):jsx(a,{alt:e.label||e.value.toString(),name:e.label||e.value.toString(),sx:we}),[e]);return jsxs(Fragment,{children:[jsxs(T,{direction:"row",gap:2,margin:2,children:[jsx(q,{children:o}),jsxs(T,{flex:1,overflow:"hidden",children:[jsxs(Y,{variant:"subtitle2",color:"textPrimary",noWrap:!0,flex:1,children:[e.value," - ",e.label]}),r.length>0&&jsxs(F,{width:1,children:[jsxs(w,{children:[r[0]?r[0]:void 0,r[1]?r[1]:void 0]}),(r[2]||r[3])&&jsxs(w,{children:[r[2]?r[2]:void 0,r[3]?r[3]:void 0]})]})]})]}),jsx(J,{className:"border"})]})});Z.displayName="ListItem";var R=Z;var D=8,ee=memo(e=>{let{data:r,index:o,style:t}=e,n=r[o],i={...t,top:t.top+D,paddingTop:8,display:"block"};if(Object.prototype.hasOwnProperty.call(n,"group")){let m=n;return jsx(ke,{component:"div",style:i,children:m.group},`list-box-item-group-${m.group}`)}let a=n,p=a.props?.children?.props;return jsx(Y,{component:"li",...a.props,noWrap:!0,style:i,children:jsx(R,{...p})})});ee.displayName="ListboxRow";var te=ee;var ie=k.createContext({}),ae=forwardRef((e,r)=>{let o=k.useContext(ie);return jsx("div",{ref:r,...e,...o})});ae.displayName="OuterElementType";var He=e=>{let r=k.useRef(null);return useEffect(()=>{r.current!=null&&r.current.resetAfterIndex(0,!0);},[e]),r},Ne=forwardRef(function(r,o){let{children:t,"data-item-height":n,...i}=r,a=useMemo(()=>{let l=[];return t.forEach(u=>{l.push(u),Object.prototype.hasOwnProperty.call(u,"children")&&Array.isArray(u.children)&&l.push(...u.children);}),l},[t]),p=a.length,m=n>112?n:112,f=useCallback(l=>Object.prototype.hasOwnProperty.call(l,"group")?48:m,[m]),b=useMemo(()=>p>8?8*m:a.map(f).reduce((l,u)=>l+u,0),[p,m,a,f]),L=He(p),I=useCallback(l=>f(a[l]),[a,f]);return jsx("div",{ref:o,children:jsx(ie.Provider,{value:i,children:jsx(VariableSizeList,{itemData:a,height:b+2*D,width:"100%",ref:L,outerElementType:ae,innerElementType:"ul",itemSize:I,overscanCount:5,itemCount:p,children:te})})})}),le=Ne;var je=e=>e&&typeof e=="object"?e.value.toString():e.toString(),_e=e=>e,Ue=(e,r)=>{let o=r.inputValue.toLocaleUpperCase();return e.filter(t=>`${t.field1?.value} ${t.field1?.label} ${t.field2?.label} ${t.field2?.value} ${t.field3?.label} ${t.field3?.value} ${t.field4?.label} ${t.field4?.value} ${t.field5?.label} ${t.field5?.value} ${t.label}${t.value}`.toLocaleUpperCase().includes(o))},Xe=({key:e,...r},o)=>jsx("li",{...r,style:{display:"block"},children:jsx(R,{option:o})},e),pe=memo(forwardRef(({name:e,label:r,value:o,options:t=[],loading:n,noOptionsText:i="Nenhum resultado encontrado.",loadingText:a="Carregando op\xE7\xF5es...",error:p,helperText:m,placeholder:f,onChange:b$1,groupBy:L,disabled:I,multiple:l,required:u,renderOption:me,tabIndex:M,onSearch:v,onInputChange:S,...ue},de)=>{let[$,C]=useState(""),[H,ce]=useState(null),O=useDeferredValue($),N=b("down","md"),fe=useMemo(()=>l?(Array.isArray(o)?o:[]).reduce((d,xe)=>{let W=t.find(Pe=>Pe.value.toString()===xe.toString());return W?[...d,W]:[...d]},[]):t.find(s=>s.value.toString()===o?.toString())||null,[t,o,l]),z=useMemo(()=>N&&t[0]?Object.keys(t[0]).length*24:void 0,[N,t]),be=useCallback((g,s,d)=>{if(ce(d),S&&S(g,s,d),d==="input"){v&&v(s),C(s);return}if(d==="reset"){C(s);return}d==="clear"&&C("");},[S,v]),ge=useCallback((g,s)=>{if(!s){b$1(l?[]:null);return}if(Array.isArray(s)){b$1(s.map(je));return}b$1(typeof s=="string"?s.toString():s.value.toString());},[b$1,l]),he=useMemo(()=>({"data-item-height":z}),[z]),ye=useCallback(g=>jsx(U,{params:g,name:e,placeholder:f,error:p,helperText:m,label:r,required:u,loading:n,tabIndex:M}),[e,f,p,m,r,u,n,M]),Re=useMemo(()=>!O||H==="reset"?t:Ue(t,{inputValue:O}),[t,O,H]);return jsx(Be,{ref:de,value:fe,inputValue:$,onInputChange:be,options:Re,loading:n,noOptionsText:i,loadingText:a,disabled:n||I,disableListWrap:!0,PopperComponent:X,ListboxProps:he,ListboxComponent:me?void 0:le,onChange:ge,renderOption:Xe,renderGroup:_e,groupBy:L,multiple:l,renderInput:ye,...ue})}));pe.displayName="Autocomplete";var kt=pe;
16
-
17
- export { kt as a };
18
- //# sourceMappingURL=chunk-3C7RDPW6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/AutocompleteDetailed/index.tsx","../src/components/AutocompleteDetailed/AutocompleteDetailedInput.tsx","../src/components/AutocompleteDetailed/Listbox.tsx","../src/components/AutocompleteDetailed/ListboxRow.tsx","../src/components/AutocompleteDetailed/ListItem.tsx","../src/components/AutocompleteDetailed/styles.ts"],"names":["forwardRef","memo","useCallback","useDeferredValue","useMemo","useState","MuiAutocomplete","CircularProgress","TextField","Fragment","jsx","jsxs","AutocompleteDetailedInput","params","name","placeholder","error","helperText","label","required","loading","tabIndex","AutocompleteDetailedInput_default","React","useEffect","VariableSizeList","ListSubheader","Typography","Stack","autocompleteClasses","Popper","styled","StyledPopper","OptionBox","theme","OptionContent","ImageContainer","DividerStyled","AVATAR_SX","ListItem","option","options","key","index","data","value","image","CustomAvatar_default","ListItem_default","LISTBOX_PADDING","ListboxRow","props","style","dataSet","inlineStyle","groupItem","element","listItemProps","ListboxRow_default","OuterElementContext","OuterElementType","ref","outerProps","useResetCache","ListboxComponent","children","dataItemHeight","other","itemData","item","itemCount","itemSize","getChildSize","child","getHeight","a","b","gridRef","getItemSize","Listbox_default","getOptionValue","optionValue","renderGroup","filterOptions","opts","state","searchValue","opt","renderOptionListItem","AutocompleteDetailed","noOptionsText","loadingText","onChange","groupBy","disabled","multiple","renderOption","onSearch","onInputChange","inputValue","setInputValue","inputReason","setInputReason","deferredInputValue","mdDown","useResponsive_default","formattedValue","acc","curr","optionHeight","handleInputChange","event","eventValue","reason","handleChange","_","listboxProps","memoizedRenderInput","filteredOptions","AutocompleteDetailed_default"],"mappings":"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","sourcesContent":["import {\n forwardRef,\n HTMLAttributes,\n memo,\n ReactNode,\n useCallback,\n useDeferredValue,\n useMemo,\n useState,\n} from 'react';\nimport MuiAutocomplete, {\n AutocompleteRenderGroupParams,\n AutocompleteRenderInputParams,\n} from '@mui/material/Autocomplete';\n\nimport useResponsive from 'hooks/useResponsive';\nimport { Option } from 'types/option';\n\nimport AutocompleteDetailedInput from './AutocompleteDetailedInput';\nimport ListboxComponent from './Listbox';\nimport ListItem from './ListItem';\nimport { AutocompleteDetailedProps } from './props';\nimport { StyledPopper } from './styles';\n\nconst getOptionValue = (optionValue: Option | string | number): string =>\n optionValue && typeof optionValue === 'object'\n ? optionValue.value.toString()\n : optionValue.toString();\n\nconst renderGroup = (params: AutocompleteRenderGroupParams) =>\n params as unknown as ReactNode;\n\nconst filterOptions = (opts: Option[], state: { inputValue: string }) => {\n const searchValue = state.inputValue.toLocaleUpperCase();\n return opts.filter(opt => {\n const search = `${opt.field1?.value} ${opt.field1?.label} ${opt.field2?.label} ${opt.field2?.value} ${opt.field3?.label} ${opt.field3?.value} ${opt.field4?.label} ${opt.field4?.value} ${opt.field5?.label} ${opt.field5?.value} ${opt.label}${opt.value}`;\n return search.toLocaleUpperCase().includes(searchValue);\n });\n};\n\nconst renderOptionListItem = (\n { key, ...props }: React.HTMLAttributes<HTMLLIElement> & { key: string },\n option: Option,\n) => {\n return (\n <li key={key} {...props} style={{ display: 'block' }}>\n <ListItem option={option} />\n </li>\n );\n};\n\nconst AutocompleteDetailed = memo(\n forwardRef<unknown, AutocompleteDetailedProps>(\n (\n {\n name,\n label,\n value,\n options = [],\n loading,\n noOptionsText = 'Nenhum resultado encontrado.',\n loadingText = 'Carregando opções...',\n error,\n helperText,\n placeholder,\n onChange,\n groupBy,\n disabled,\n multiple,\n required,\n renderOption,\n tabIndex,\n onSearch,\n onInputChange,\n ...other\n },\n ref,\n ) => {\n const [inputValue, setInputValue] = useState<string>('');\n const [inputReason, setInputReason] = useState<\n 'input' | 'reset' | 'clear' | null\n >(null);\n const deferredInputValue = useDeferredValue(inputValue);\n\n const mdDown = useResponsive('down', 'md');\n\n const formattedValue = useMemo(() => {\n if (multiple) {\n const values = Array.isArray(value) ? value : [];\n\n return values.reduce<Option[]>((acc, curr) => {\n const item = options.find(\n opt => opt.value.toString() === curr.toString(),\n );\n\n if (item) return [...acc, item];\n\n return [...acc];\n }, []);\n }\n\n const item = options.find(\n opt => opt.value.toString() === value?.toString(),\n );\n\n return item || null;\n }, [options, value, multiple]);\n\n const optionHeight = useMemo(\n () =>\n mdDown && options[0]\n ? Object.keys(options[0]).length * 24\n : undefined,\n [mdDown, options],\n );\n\n const handleInputChange = useCallback(\n (\n event: React.SyntheticEvent,\n eventValue: string,\n reason: 'input' | 'reset' | 'clear',\n ) => {\n setInputReason(reason);\n if (onInputChange) onInputChange(event, eventValue, reason);\n\n if (reason === 'input') {\n if (onSearch) onSearch(eventValue);\n setInputValue(eventValue);\n\n return;\n }\n\n if (reason === 'reset') {\n setInputValue(eventValue);\n return;\n }\n\n if (reason === 'clear') {\n setInputValue('');\n }\n },\n [onInputChange, onSearch],\n );\n\n const handleChange = useCallback(\n (\n _: React.SyntheticEvent,\n option: Option | (string | Option)[] | string | null,\n ) => {\n if (!option) {\n onChange(multiple ? [] : null);\n return;\n }\n\n if (Array.isArray(option)) {\n onChange(option.map(getOptionValue));\n return;\n }\n\n onChange(\n typeof option === 'string'\n ? option.toString()\n : option.value.toString(),\n );\n },\n [onChange, multiple],\n );\n\n const listboxProps = useMemo(\n () =>\n ({\n 'data-item-height': optionHeight,\n }) as HTMLAttributes<HTMLUListElement>,\n [optionHeight],\n );\n\n const memoizedRenderInput = useCallback(\n (params: AutocompleteRenderInputParams) => (\n <AutocompleteDetailedInput\n params={params}\n name={name}\n placeholder={placeholder}\n error={error}\n helperText={helperText}\n label={label}\n required={required}\n loading={loading}\n tabIndex={tabIndex}\n />\n ),\n [\n name,\n placeholder,\n error,\n helperText,\n label,\n required,\n loading,\n tabIndex,\n ],\n );\n\n const filteredOptions = useMemo(() => {\n if (!deferredInputValue || inputReason === 'reset') return options;\n return filterOptions(options, { inputValue: deferredInputValue });\n }, [options, deferredInputValue, inputReason]);\n\n return (\n <MuiAutocomplete\n ref={ref}\n value={formattedValue}\n inputValue={inputValue}\n onInputChange={handleInputChange}\n options={filteredOptions}\n loading={loading}\n noOptionsText={noOptionsText}\n loadingText={loadingText}\n disabled={loading || disabled}\n disableListWrap\n PopperComponent={StyledPopper}\n ListboxProps={listboxProps}\n ListboxComponent={renderOption ? undefined : ListboxComponent}\n onChange={handleChange}\n renderOption={renderOptionListItem}\n renderGroup={renderGroup}\n groupBy={groupBy}\n multiple={multiple}\n renderInput={memoizedRenderInput}\n {...other}\n />\n );\n },\n ),\n);\n\nAutocompleteDetailed.displayName = 'Autocomplete';\n\nexport default AutocompleteDetailed;\n","import { memo } from 'react';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport TextField from '@mui/material/TextField';\n\nimport { AutocompleteDetailedInputProps } from './props';\n\nconst AutocompleteDetailedInput = memo(\n ({\n params,\n name,\n placeholder,\n error,\n helperText,\n label,\n required,\n loading,\n tabIndex,\n }: AutocompleteDetailedInputProps) => (\n <TextField\n {...params}\n name={name}\n placeholder={placeholder}\n fullWidth\n error={!!error}\n helperText={helperText}\n label={label}\n required={required}\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {loading ? <CircularProgress color=\"primary\" size={20} /> : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n inputProps={{\n ...params.inputProps,\n name,\n tabIndex,\n }}\n />\n ),\n);\n\nAutocompleteDetailedInput.displayName = 'AutocompleteDetailedInput';\n\nexport default AutocompleteDetailedInput;\n","import React, {\n forwardRef,\n HTMLAttributes,\n useCallback,\n useEffect,\n useMemo,\n} from 'react';\nimport { VariableSizeList } from 'react-window';\nimport { AutocompleteRenderGroupParams } from '@mui/material/Autocomplete';\n\nimport ListboxRow, { LISTBOX_PADDING } from './ListboxRow';\n\nconst OuterElementContext = React.createContext({});\n\nconst OuterElementType = forwardRef<HTMLDivElement>((props, ref) => {\n const outerProps = React.useContext(OuterElementContext);\n return <div ref={ref} {...props} {...outerProps} />;\n});\n\nOuterElementType.displayName = 'OuterElementType';\n\nconst useResetCache = (data: number) => {\n const ref = React.useRef<VariableSizeList>(null);\n\n useEffect(() => {\n if (ref.current != null) {\n ref.current.resetAfterIndex(0, true);\n }\n }, [data]);\n\n return ref;\n};\n\nconst ListboxComponent = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLElement>\n>(function ListboxComponent(props, ref) {\n const {\n children,\n // eslint-disable-next-line react/prop-types\n 'data-item-height': dataItemHeight,\n ...other\n } = props as { 'data-item-height': number } & HTMLAttributes<HTMLElement>;\n\n const itemData: (React.ReactElement | AutocompleteRenderGroupParams)[] =\n useMemo(() => {\n const data: (React.ReactElement | AutocompleteRenderGroupParams)[] = [];\n (\n children as (React.ReactElement | AutocompleteRenderGroupParams)[]\n ).forEach(item => {\n data.push(item);\n if (\n Object.prototype.hasOwnProperty.call(item, 'children') &&\n Array.isArray((item as AutocompleteRenderGroupParams).children)\n ) {\n data.push(\n ...((item as AutocompleteRenderGroupParams)\n .children as React.ReactElement[]),\n );\n }\n });\n return data;\n }, [children]);\n const itemCount = itemData.length;\n const itemSize = dataItemHeight > 112 ? dataItemHeight : 112;\n\n const getChildSize = useCallback(\n (child: React.ReactElement | AutocompleteRenderGroupParams) => {\n if (Object.prototype.hasOwnProperty.call(child, 'group')) {\n return 48;\n }\n\n return itemSize;\n },\n [itemSize],\n );\n\n const getHeight = useMemo(() => {\n if (itemCount > 8) {\n return 8 * itemSize;\n }\n return itemData.map(getChildSize).reduce((a, b) => a + b, 0);\n }, [itemCount, itemSize, itemData, getChildSize]);\n\n const gridRef = useResetCache(itemCount);\n\n const getItemSize = useCallback(\n (index: number) => {\n return getChildSize(itemData[index]);\n },\n [itemData, getChildSize],\n );\n\n return (\n <div ref={ref}>\n <OuterElementContext.Provider value={other}>\n <VariableSizeList\n itemData={itemData}\n height={getHeight + 2 * LISTBOX_PADDING}\n width=\"100%\"\n ref={gridRef}\n outerElementType={OuterElementType}\n innerElementType=\"ul\"\n itemSize={getItemSize}\n overscanCount={5}\n itemCount={itemCount}\n >\n {ListboxRow}\n </VariableSizeList>\n </OuterElementContext.Provider>\n </div>\n );\n});\n\nexport default ListboxComponent;\n","import { memo } from 'react';\nimport { ListChildComponentProps } from 'react-window';\nimport { AutocompleteRenderGroupParams } from '@mui/material/Autocomplete';\nimport ListSubheader from '@mui/material/ListSubheader';\nimport Typography from '@mui/material/Typography';\n\nimport ListItem from './ListItem';\nimport { ListItemProps } from './props';\n\nconst LISTBOX_PADDING = 8;\n\nconst ListboxRow = memo((props: ListChildComponentProps) => {\n const { data, index, style } = props;\n const dataSet = data[index] as\n | React.ReactElement\n | AutocompleteRenderGroupParams;\n\n const inlineStyle = {\n ...style,\n top: (style.top as number) + LISTBOX_PADDING,\n paddingTop: 8,\n display: 'block',\n };\n\n if (Object.prototype.hasOwnProperty.call(dataSet, 'group')) {\n const groupItem = dataSet as AutocompleteRenderGroupParams;\n return (\n <ListSubheader\n key={`list-box-item-group-${groupItem.group}`}\n component=\"div\"\n style={inlineStyle}\n >\n {groupItem.group}\n </ListSubheader>\n );\n }\n\n const element = dataSet as React.ReactElement;\n const listItemProps = element.props?.children?.props as ListItemProps;\n\n return (\n <Typography component=\"li\" {...element.props} noWrap style={inlineStyle}>\n <ListItem {...listItemProps} />\n </Typography>\n );\n});\n\nListboxRow.displayName = 'ListboxRow';\n\nexport { LISTBOX_PADDING };\nexport default ListboxRow;\n","import { memo, useMemo } from 'react';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport CustomAvatar from 'components/CustomAvatar';\n\nimport { ListItemProps } from './props';\nimport {\n DividerStyled,\n ImageContainer,\n OptionBox,\n OptionContent,\n} from './styles';\n\nconst AVATAR_SX = { width: 68, height: 68, borderRadius: 1 };\n\nconst ListItem = memo(({ option }: ListItemProps) => {\n const options = useMemo(\n () =>\n Object.keys(option)\n .filter(key => key.startsWith('field'))\n .map((key, index) => {\n const data = option[key];\n\n if (data && typeof data === 'object') {\n const label = ('label' in data ? data.label : null) as string;\n const value = ('value' in data ? data.value : null) as string;\n\n return (\n <Typography\n key={`${key}:${index}`}\n component=\"span\"\n variant=\"body2\"\n color=\"textPrimary\"\n noWrap\n >\n {label}: {value}\n </Typography>\n );\n }\n }),\n [option],\n );\n\n const image = useMemo(\n () =>\n option.image ? (\n <img alt=\"Imagem\" src={option.image} />\n ) : (\n <CustomAvatar\n alt={option.label || option.value.toString()}\n name={option.label || option.value.toString()}\n sx={AVATAR_SX}\n />\n ),\n [option],\n );\n\n return (\n <>\n <Stack direction=\"row\" gap={2} margin={2}>\n <ImageContainer>{image}</ImageContainer>\n\n <Stack flex={1} overflow=\"hidden\">\n <Typography variant=\"subtitle2\" color=\"textPrimary\" noWrap flex={1}>\n {option.value} - {option.label}\n </Typography>\n\n {options.length > 0 && (\n <OptionBox width={1}>\n <OptionContent>\n {options[0] ? options[0] : undefined}\n {options[1] ? options[1] : undefined}\n </OptionContent>\n\n {(options[2] || options[3]) && (\n <OptionContent>\n {options[2] ? options[2] : undefined}\n {options[3] ? options[3] : undefined}\n </OptionContent>\n )}\n </OptionBox>\n )}\n </Stack>\n </Stack>\n\n <DividerStyled className=\"border\" />\n </>\n );\n});\n\nListItem.displayName = 'ListItem';\n\nexport default ListItem;\n","import { autocompleteClasses } from '@mui/material/Autocomplete';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\n\nexport const StyledPopper = styled(Popper)({\n [`& .${autocompleteClasses.listbox}`]: {\n boxSizing: 'border-box',\n '& ul': {\n padding: 0,\n margin: 0,\n },\n },\n});\n\nexport const OptionBox = styled(Stack)(({ theme }) => ({\n flex: 1,\n width: '100%',\n gap: 6,\n\n [theme.breakpoints.down('md')]: {\n flexDirection: 'column',\n },\n\n [theme.breakpoints.up('md')]: {\n flexDirection: 'row',\n },\n}));\n\nexport const OptionContent = styled(Stack)(({ theme }) => ({\n flex: 1,\n maxWidth: '100%',\n gap: 6,\n\n [theme.breakpoints.up('md')]: {\n flex: '1 1 calc(50% - 8px)',\n width: 'calc(50% - 8px)',\n minWidth: 'calc(50% - 8px)',\n maxWidth: 'calc(50% - 8px)',\n },\n}));\n\nexport const ImageContainer = styled(Stack)(({ theme }) => ({\n position: 'relative',\n alignItems: 'center',\n justifyContent: 'center',\n width: 68,\n height: 68,\n borderRadius: 8,\n overflow: 'hidden',\n\n img: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n },\n\n [theme.breakpoints.down('sm')]: {\n display: 'none',\n },\n}));\n\nexport const DividerStyled = styled('hr')(({ theme }) => ({\n borderStyle: 'dashed',\n position: 'absolute',\n bottom: 0,\n width: '100%',\n margin: 0,\n borderColor: theme.palette.divider,\n borderWidth: '0 0 thin',\n}));\n"]}