@rpcbase/ui 0.237.0 → 0.239.0

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 (234) hide show
  1. package/dist/components/AddressAutocompleteInput/index.d.ts.map +1 -1
  2. package/dist/components/Notifications/NotificationsDrawer.d.ts.map +1 -1
  3. package/dist/helpers/useMapsLibrary.d.ts.map +1 -1
  4. package/dist/index151.js +4 -4
  5. package/dist/index156.js +1 -1
  6. package/dist/index157.js +1 -1
  7. package/dist/index16.js +228 -196
  8. package/dist/index16.js.map +1 -1
  9. package/dist/index164.js +1 -1
  10. package/dist/index165.js +6 -6
  11. package/dist/index167.js +1 -1
  12. package/dist/index169.js +1 -1
  13. package/dist/index172.js +3 -3
  14. package/dist/index175.js +1 -1
  15. package/dist/index176.js +4 -4
  16. package/dist/index182.js +1 -1
  17. package/dist/index184.js +12 -12
  18. package/dist/index187.js +5 -5
  19. package/dist/index189.js +3 -3
  20. package/dist/index190.js +1 -1
  21. package/dist/index193.js +3 -3
  22. package/dist/index194.js +5 -5
  23. package/dist/index22.js.map +1 -1
  24. package/dist/index256.js +14 -20
  25. package/dist/index256.js.map +1 -1
  26. package/dist/index257.js +146 -58
  27. package/dist/index257.js.map +1 -1
  28. package/dist/index258.js +30 -6
  29. package/dist/index258.js.map +1 -1
  30. package/dist/index259.js +9 -11
  31. package/dist/index259.js.map +1 -1
  32. package/dist/index260.js +44 -46
  33. package/dist/index260.js.map +1 -1
  34. package/dist/index261.js +12 -4
  35. package/dist/index261.js.map +1 -1
  36. package/dist/index262.js +43 -28
  37. package/dist/index262.js.map +1 -1
  38. package/dist/index263.js +93 -14
  39. package/dist/index263.js.map +1 -1
  40. package/dist/index264.js +86 -5
  41. package/dist/index264.js.map +1 -1
  42. package/dist/index265.js +105 -21
  43. package/dist/index265.js.map +1 -1
  44. package/dist/index266.js +51 -50
  45. package/dist/index266.js.map +1 -1
  46. package/dist/index267.js +11 -25
  47. package/dist/index267.js.map +1 -1
  48. package/dist/index268.js +37 -41
  49. package/dist/index268.js.map +1 -1
  50. package/dist/index269.js +8 -39
  51. package/dist/index269.js.map +1 -1
  52. package/dist/index270.js +117 -45
  53. package/dist/index270.js.map +1 -1
  54. package/dist/index271.js +17 -20
  55. package/dist/index271.js.map +1 -1
  56. package/dist/index272.js +14 -69
  57. package/dist/index272.js.map +1 -1
  58. package/dist/index273.js +3 -17
  59. package/dist/index273.js.map +1 -1
  60. package/dist/index274.js +36 -11
  61. package/dist/index274.js.map +1 -1
  62. package/dist/index275.js +20 -27
  63. package/dist/index275.js.map +1 -1
  64. package/dist/index276.js +9 -13
  65. package/dist/index276.js.map +1 -1
  66. package/dist/index277.js +8 -18
  67. package/dist/index277.js.map +1 -1
  68. package/dist/index278.js +20 -37
  69. package/dist/index278.js.map +1 -1
  70. package/dist/index279.js +59 -255
  71. package/dist/index279.js.map +1 -1
  72. package/dist/index280.js +6 -278
  73. package/dist/index280.js.map +1 -1
  74. package/dist/index281.js +10 -67
  75. package/dist/index281.js.map +1 -1
  76. package/dist/index282.js +47 -96
  77. package/dist/index282.js.map +1 -1
  78. package/dist/index283.js +4 -84
  79. package/dist/index283.js.map +1 -1
  80. package/dist/index284.js +29 -3
  81. package/dist/index284.js.map +1 -1
  82. package/dist/index285.js +15 -28
  83. package/dist/index285.js.map +1 -1
  84. package/dist/index286.js +5 -16
  85. package/dist/index286.js.map +1 -1
  86. package/dist/index287.js +22 -35
  87. package/dist/index287.js.map +1 -1
  88. package/dist/index288.js +51 -16
  89. package/dist/index288.js.map +1 -1
  90. package/dist/index289.js +25 -3
  91. package/dist/index289.js.map +1 -1
  92. package/dist/index290.js +41 -26
  93. package/dist/index290.js.map +1 -1
  94. package/dist/index291.js +38 -27
  95. package/dist/index291.js.map +1 -1
  96. package/dist/index292.js +45 -4
  97. package/dist/index292.js.map +1 -1
  98. package/dist/index293.js +20 -78
  99. package/dist/index293.js.map +1 -1
  100. package/dist/index294.js +65 -264
  101. package/dist/index294.js.map +1 -1
  102. package/dist/index295.js +17 -11
  103. package/dist/index295.js.map +1 -1
  104. package/dist/index296.js +11 -10
  105. package/dist/index296.js.map +1 -1
  106. package/dist/index297.js +26 -24
  107. package/dist/index297.js.map +1 -1
  108. package/dist/index298.js +13 -16
  109. package/dist/index298.js.map +1 -1
  110. package/dist/index299.js +15 -122
  111. package/dist/index299.js.map +1 -1
  112. package/dist/index3.js.map +1 -1
  113. package/dist/index300.js +36 -5
  114. package/dist/index300.js.map +1 -1
  115. package/dist/index301.js +260 -38
  116. package/dist/index301.js.map +1 -1
  117. package/dist/index302.js +275 -62
  118. package/dist/index302.js.map +1 -1
  119. package/dist/index303.js +68 -13
  120. package/dist/index303.js.map +1 -1
  121. package/dist/index304.js +99 -7
  122. package/dist/index304.js.map +1 -1
  123. package/dist/index305.js +83 -5
  124. package/dist/index305.js.map +1 -1
  125. package/dist/index306.js +3 -3
  126. package/dist/index306.js.map +1 -1
  127. package/dist/index307.js +29 -10
  128. package/dist/index307.js.map +1 -1
  129. package/dist/index308.js +15 -6
  130. package/dist/index308.js.map +1 -1
  131. package/dist/index309.js +34 -133
  132. package/dist/index309.js.map +1 -1
  133. package/dist/index310.js +15 -398
  134. package/dist/index310.js.map +1 -1
  135. package/dist/index311.js +3 -52
  136. package/dist/index311.js.map +1 -1
  137. package/dist/index312.js +26 -11
  138. package/dist/index312.js.map +1 -1
  139. package/dist/index313.js +27 -10
  140. package/dist/index313.js.map +1 -1
  141. package/dist/index314.js +4 -14
  142. package/dist/index314.js.map +1 -1
  143. package/dist/index315.js +75 -151
  144. package/dist/index315.js.map +1 -1
  145. package/dist/index316.js +267 -28
  146. package/dist/index316.js.map +1 -1
  147. package/dist/index317.js +11 -9
  148. package/dist/index317.js.map +1 -1
  149. package/dist/index318.js +11 -49
  150. package/dist/index318.js.map +1 -1
  151. package/dist/index319.js +25 -11
  152. package/dist/index319.js.map +1 -1
  153. package/dist/index320.js +15 -43
  154. package/dist/index320.js.map +1 -1
  155. package/dist/index321.js +119 -89
  156. package/dist/index321.js.map +1 -1
  157. package/dist/index322.js +5 -86
  158. package/dist/index322.js.map +1 -1
  159. package/dist/index323.js +39 -104
  160. package/dist/index323.js.map +1 -1
  161. package/dist/index324.js +60 -47
  162. package/dist/index324.js.map +1 -1
  163. package/dist/index325.js +13 -11
  164. package/dist/index325.js.map +1 -1
  165. package/dist/index326.js +7 -37
  166. package/dist/index326.js.map +1 -1
  167. package/dist/index327.js +5 -8
  168. package/dist/index327.js.map +1 -1
  169. package/dist/index328.js +3 -116
  170. package/dist/index328.js.map +1 -1
  171. package/dist/index329.js +10 -17
  172. package/dist/index329.js.map +1 -1
  173. package/dist/index330.js +7 -15
  174. package/dist/index330.js.map +1 -1
  175. package/dist/index331.js +133 -3
  176. package/dist/index331.js.map +1 -1
  177. package/dist/index332.js +398 -35
  178. package/dist/index332.js.map +1 -1
  179. package/dist/index333.js +52 -20
  180. package/dist/index333.js.map +1 -1
  181. package/dist/index334.js +11 -9
  182. package/dist/index334.js.map +1 -1
  183. package/dist/index335.js +11 -8
  184. package/dist/index335.js.map +1 -1
  185. package/dist/index336.js +3 -3
  186. package/dist/index346.js +2 -2
  187. package/dist/index348.js +8 -8
  188. package/dist/index349.js +3 -3
  189. package/dist/index350.js +2 -2
  190. package/dist/index351.js +5 -5
  191. package/dist/index353.js +1 -1
  192. package/dist/index362.js +21 -4
  193. package/dist/index362.js.map +1 -1
  194. package/dist/index363.js +4 -12
  195. package/dist/index363.js.map +1 -1
  196. package/dist/index364.js +5 -16
  197. package/dist/index364.js.map +1 -1
  198. package/dist/index365.js +11 -5
  199. package/dist/index365.js.map +1 -1
  200. package/dist/index366.js +15 -19
  201. package/dist/index366.js.map +1 -1
  202. package/dist/index367.js +19 -43
  203. package/dist/index367.js.map +1 -1
  204. package/dist/index368.js +40 -13
  205. package/dist/index368.js.map +1 -1
  206. package/dist/index369.js +17 -4
  207. package/dist/index369.js.map +1 -1
  208. package/dist/index370.js +4 -200
  209. package/dist/index370.js.map +1 -1
  210. package/dist/index371.js +197 -74
  211. package/dist/index371.js.map +1 -1
  212. package/dist/index372.js +77 -20
  213. package/dist/index372.js.map +1 -1
  214. package/dist/index374.js +3 -3
  215. package/dist/index375.js +1 -1
  216. package/dist/index376.js +3 -3
  217. package/dist/index378.js +2 -2
  218. package/dist/index380.js +1 -1
  219. package/dist/index381.js +2 -2
  220. package/dist/index407.js +1 -1
  221. package/dist/index49.js +28 -28
  222. package/dist/index50.js +21 -21
  223. package/dist/index51.js +1 -1
  224. package/dist/index52.js +8 -8
  225. package/dist/index53.js +2 -2
  226. package/dist/index55.js +17 -17
  227. package/dist/index56.js +4 -4
  228. package/dist/index57.js +3 -3
  229. package/dist/index58.js +7 -7
  230. package/dist/index59.js +4 -4
  231. package/dist/index60.js +12 -12
  232. package/dist/index61.js +2 -2
  233. package/dist/index62.js +2 -2
  234. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index16.js","sources":["../src/components/Notifications/NotificationsDrawer.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type Context } from \"react\"\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\"\nimport { Loader2, MoreVertical, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { NotificationItem, NotificationsRealtimeState } from \"./types\"\n\n\ntype ListResponse = {\n ok?: boolean\n error?: string\n notifications?: NotificationItem[]\n unreadCount?: number\n unseenCount?: number\n}\n\ntype DayGroup = {\n key: string\n label: string\n items: NotificationItem[]\n}\n\ntype BrowserNotificationPermission = NotificationPermission | \"unsupported\"\n\nconst toMs = (iso: string): number => {\n const ms = Date.parse(iso)\n return Number.isFinite(ms) ? ms : 0\n}\n\nconst getDayKey = (iso: string): string => {\n const date = new Date(toMs(iso))\n if (!Number.isFinite(date.getTime())) return \"unknown\"\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n\n return `${year}-${month}-${day}`\n}\n\nconst formatDayLabel = (key: string): string => {\n if (key === \"unknown\") return \"Unknown date\"\n const [yearRaw, monthRaw, dayRaw] = key.split(\"-\")\n const year = Number(yearRaw)\n const month = Number(monthRaw)\n const day = Number(dayRaw)\n\n if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) return \"Unknown date\"\n\n const date = new Date(year, month - 1, day)\n if (!Number.isFinite(date.getTime())) return \"Unknown date\"\n\n const now = new Date()\n const includeYear = now.getFullYear() !== year\n return date.toLocaleDateString(undefined, includeYear\n ? { weekday: \"short\", month: \"short\", day: \"numeric\", year: \"numeric\" }\n : { weekday: \"short\", month: \"short\", day: \"numeric\" })\n}\n\nconst getWebpushLink = (item: NotificationItem): string => {\n const platformWebpush = item.platform?.webpush\n if (!platformWebpush || typeof platformWebpush !== \"object\" || Array.isArray(platformWebpush)) return \"\"\n const fcmOptions = (platformWebpush as { fcmOptions?: unknown }).fcmOptions\n if (!fcmOptions || typeof fcmOptions !== \"object\" || Array.isArray(fcmOptions)) return \"\"\n return typeof (fcmOptions as { link?: unknown }).link === \"string\" ? (fcmOptions as { link: string }).link : \"\"\n}\n\nconst groupByDay = (items: NotificationItem[]): DayGroup[] => {\n const groups: DayGroup[] = []\n let currentKey: string | null = null\n\n for (const item of items) {\n const key = getDayKey(item.createdAt)\n if (key !== currentKey) {\n currentKey = key\n groups.push({ key, label: formatDayLabel(key), items: [] })\n }\n groups[groups.length - 1]!.items.push(item)\n }\n\n return groups\n}\n\nconst getBrowserNotificationPermission = (): BrowserNotificationPermission => {\n if (typeof window === \"undefined\") return \"unsupported\"\n if (!(\"Notification\" in window)) return \"unsupported\"\n return window.Notification.permission\n}\n\nconst EmptyRealtimeContext = createContext<NotificationsRealtimeState | null>(null)\n\nexport function NotificationsDrawer({\n open,\n onOpenChange,\n className,\n limit = 50,\n defaultUnreadOnly = false,\n realtimeContext,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n className?: string\n limit?: number\n defaultUnreadOnly?: boolean\n realtimeContext?: Context<NotificationsRealtimeState | null>\n}) {\n const realtime = useContext(realtimeContext ?? EmptyRealtimeContext)\n\n const [items, setItems] = useState<NotificationItem[]>([])\n const [unreadCount, setUnreadCount] = useState<number>(0)\n const [unseenCount, setUnseenCount] = useState<number>(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [unreadOnly, setUnreadOnly] = useState<boolean>(defaultUnreadOnly)\n const [browserNotificationPermission, setBrowserNotificationPermission] = useState<BrowserNotificationPermission>(() =>\n getBrowserNotificationPermission(),\n )\n const [browserNotificationPermissionRequesting, setBrowserNotificationPermissionRequesting] = useState(false)\n\n const mergedItems = realtime?.notifications ?? items\n const mergedUnreadCount = realtime?.unreadCount ?? unreadCount\n const mergedUnseenCount = realtime?.unseenCount ?? unseenCount\n const mergedLoading = realtime?.loading ?? loading\n const mergedError = realtime?.error\n ? (realtime.error instanceof Error ? realtime.error.message : String(realtime.error))\n : error\n\n const visibleItems = useMemo(() => mergedItems.slice(0, limit), [limit, mergedItems])\n\n const unread = useMemo(() => visibleItems.filter((n) => !n.readAt), [visibleItems])\n const read = useMemo(() => visibleItems.filter((n) => Boolean(n.readAt)), [visibleItems])\n const unreadGroups = useMemo(() => groupByDay(unread), [unread])\n const readGroups = useMemo(() => groupByDay(read), [read])\n\n const refresh = useCallback(async ({ unreadOnly, markSeen }: { unreadOnly: boolean; markSeen: boolean }) => {\n setLoading(true)\n setError(null)\n\n try {\n const res = await fetch(\"/api/rb/notifications\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ limit, unreadOnly, markSeen }),\n })\n\n const json = (await res.json().catch(() => null)) as ListResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to load notifications.\")\n return\n }\n\n const nextItems = Array.isArray(json.notifications) ? json.notifications : []\n setItems(nextItems)\n setUnreadCount(Number.isFinite(json.unreadCount) ? Math.max(0, Math.floor(json.unreadCount ?? 0)) : 0)\n setUnseenCount(Number.isFinite(json.unseenCount) ? Math.max(0, Math.floor(json.unseenCount ?? 0)) : 0)\n } catch {\n setError(\"Unable to load notifications.\")\n } finally {\n setLoading(false)\n }\n }, [limit])\n\n useEffect(() => {\n if (!open) return\n if (realtime) {\n void (async () => {\n try {\n await fetch(\"/api/rb/notifications\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n keepalive: true,\n body: JSON.stringify({ limit: 1, markSeen: true }),\n })\n } catch {\n return\n }\n })()\n return\n }\n void refresh({ unreadOnly, markSeen: true })\n }, [open, realtime, refresh, unreadOnly])\n\n useEffect(() => {\n if (!open) return\n if (realtime) return\n void refresh({ unreadOnly, markSeen: false })\n }, [open, realtime, refresh, unreadOnly])\n\n useEffect(() => {\n if (!open) return\n\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n\n if (typeof navigator === \"undefined\" || !navigator.permissions?.query) return\n\n let permissionStatus: PermissionStatus | null = null\n let disposed = false\n const syncPermission = () => {\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n }\n\n try {\n void navigator.permissions.query({ name: \"notifications\" as PermissionName }).then((status) => {\n if (disposed) return\n permissionStatus = status\n syncPermission()\n status.addEventListener(\"change\", syncPermission)\n }).catch(() => {\n // Notifications are not exposed through the Permissions API in every browser.\n })\n } catch {\n return\n }\n\n return () => {\n disposed = true\n permissionStatus?.removeEventListener(\"change\", syncPermission)\n }\n }, [open])\n\n const requestBrowserNotificationPermission = async () => {\n if (typeof window === \"undefined\" || !(\"Notification\" in window)) {\n setBrowserNotificationPermission(\"unsupported\")\n return\n }\n\n setBrowserNotificationPermissionRequesting(true)\n try {\n const nextPermission = await window.Notification.requestPermission()\n setBrowserNotificationPermission(nextPermission)\n } catch {\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n } finally {\n setBrowserNotificationPermissionRequesting(false)\n }\n }\n\n const markAsRead = async (id: string) => {\n try {\n const res = await fetch(`/api/rb/notifications/${encodeURIComponent(id)}/read`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n keepalive: true,\n body: \"{}\",\n })\n\n const json = (await res.json().catch(() => null)) as { ok?: boolean } | null\n if (!res.ok || !json?.ok) return\n\n const nowIso = new Date().toISOString()\n if (realtime) return\n setItems((current) => {\n const target = current.find((n) => n.id === id)\n if (target && !target.readAt) {\n setUnreadCount((count) => Math.max(0, count - 1))\n }\n if (target && !target.seenAt) {\n setUnseenCount((count) => Math.max(0, count - 1))\n }\n return current.map((n) => (n.id === id && !n.readAt ? { ...n, readAt: nowIso, ...(n.seenAt ? {} : { seenAt: nowIso }) } : n))\n })\n } catch {\n return\n }\n }\n\n const archive = async (id: string) => {\n try {\n const res = await fetch(`/api/rb/notifications/${encodeURIComponent(id)}/archive`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: \"{}\",\n })\n\n const json = (await res.json().catch(() => null)) as { ok?: boolean } | null\n if (!res.ok || !json?.ok) return\n\n if (realtime) return\n setItems((current) => {\n const target = current.find((n) => n.id === id)\n if (target && !target.readAt) {\n setUnreadCount((count) => Math.max(0, count - 1))\n }\n if (target && !target.seenAt) {\n setUnseenCount((count) => Math.max(0, count - 1))\n }\n return current.filter((n) => n.id !== id)\n })\n } catch {\n return\n }\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop className=\"fixed inset-0 z-50 bg-black/50\" />\n <DialogPrimitive.Popup\n className={cn(\n \"fixed right-0 top-0 z-50 flex h-full w-full max-w-md flex-col border-l bg-background shadow-xl outline-none\",\n className,\n )}\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-4 py-3\">\n <div className=\"flex min-w-0 flex-col\">\n <DialogPrimitive.Title className=\"text-sm font-semibold\">Notifications</DialogPrimitive.Title>\n <span className=\"text-xs text-muted-foreground\">\n {mergedUnreadCount > 0 ? `${mergedUnreadCount} unread` : mergedUnseenCount > 0 ? `${mergedUnseenCount} new` : \"All caught up\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setUnreadOnly((v) => !v)}\n className={cn(\n \"rounded-md border px-2 py-1 text-xs\",\n unreadOnly ? \"bg-accent text-foreground\" : \"bg-background text-muted-foreground hover:bg-accent\",\n )}\n >\n {unreadOnly ? \"Unread\" : \"All\"}\n </button>\n <DialogPrimitive.Close\n render={<button type=\"button\" className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\" />}\n >\n <X className=\"h-4 w-4\" />\n </DialogPrimitive.Close>\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto px-4 pb-3\">\n <BrowserNotificationPermissionNotice\n permission={browserNotificationPermission}\n requesting={browserNotificationPermissionRequesting}\n onEnable={requestBrowserNotificationPermission}\n />\n {mergedLoading ? (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n ) : mergedError ? (\n <div className=\"py-10 text-center text-sm text-muted-foreground\">{mergedError}</div>\n ) : visibleItems.length === 0 ? (\n <div className=\"py-10 text-center text-sm text-muted-foreground\">No notifications.</div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div>\n <div className=\"sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground\">\n Unread notifications\n </div>\n {unreadGroups.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">No unread notifications.</div>\n ) : (\n unreadGroups.map((group) => (\n <div key={`unread:${group.key}`}>\n <div className=\"sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"-mx-4 flex flex-col divide-y divide-border\">\n {group.items.map((n) => (\n <NotificationRow\n key={n.id}\n notification={n}\n onMarkRead={markAsRead}\n onArchive={archive}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n\n {unreadOnly ? null : (\n <div>\n <div className=\"sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground\">\n Previous notifications\n </div>\n {readGroups.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">No previous notifications.</div>\n ) : (\n readGroups.map((group) => (\n <div key={`previous:${group.key}`}>\n <div className=\"sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"-mx-4 flex flex-col divide-y divide-border\">\n {group.items.map((n) => (\n <NotificationRow\n key={n.id}\n notification={n}\n onMarkRead={markAsRead}\n onArchive={archive}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nfunction BrowserNotificationPermissionNotice({\n permission,\n requesting,\n onEnable,\n}: {\n permission: BrowserNotificationPermission\n requesting: boolean\n onEnable: () => void\n}) {\n if (permission === \"granted\") return null\n\n if (permission === \"unsupported\") {\n return (\n <div className=\"mt-3 rounded-md border bg-muted/40 p-3 text-sm text-muted-foreground\">\n Browser notifications are not supported by this browser.\n </div>\n )\n }\n\n const isDenied = permission === \"denied\"\n\n return (\n <div className=\"mt-3 rounded-md border bg-muted/40 p-3\">\n <div className=\"text-sm font-medium\">\n {isDenied ? \"Browser notifications are blocked.\" : \"Browser notifications are not enabled.\"}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {isDenied\n ? \"Enable notifications for this site in your browser settings, then click again.\"\n : \"Enable browser notifications to receive important alerts.\"}\n </div>\n <button\n type=\"button\"\n className=\"mt-3 inline-flex h-8 items-center rounded-md border bg-background px-2.5 text-xs font-medium hover:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n disabled={requesting}\n onClick={onEnable}\n >\n {requesting ? \"Enabling...\" : \"Enable browser notifications\"}\n </button>\n </div>\n )\n}\n\nfunction NotificationRow({\n notification,\n onMarkRead,\n onArchive,\n}: {\n notification: NotificationItem\n onMarkRead: (id: string) => void\n onArchive: (id: string) => void\n}) {\n const [menuOpen, setMenuOpen] = useState(false)\n const menuRef = useRef<HTMLDivElement | null>(null)\n const menuButtonRef = useRef<HTMLButtonElement | null>(null)\n const isUnread = !notification.readAt\n const link = getWebpushLink(notification)\n const createdAtLabel = (() => {\n const date = new Date(toMs(notification.createdAt))\n if (!Number.isFinite(date.getTime())) return \"\"\n return date.toLocaleString()\n })()\n\n useEffect(() => {\n if (!menuOpen) return\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) return\n if (menuRef.current?.contains(target) || menuButtonRef.current?.contains(target)) return\n setMenuOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n setMenuOpen(false)\n menuButtonRef.current?.focus()\n }\n\n document.addEventListener(\"pointerdown\", handlePointerDown)\n document.addEventListener(\"keydown\", handleKeyDown)\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown)\n document.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [menuOpen])\n\n return (\n <div\n className={cn(\n \"group flex w-full gap-3 px-4 py-3 hover:bg-accent/40\",\n isUnread ? \"bg-primary/5\" : \"bg-background\",\n )}\n >\n <button\n type=\"button\"\n className=\"min-w-0 flex-1 text-left\"\n onClick={() => {\n if (isUnread) {\n void onMarkRead(notification.id)\n }\n if (link) {\n window.location.href = link\n }\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold\">{notification.title}</div>\n {notification.body ? (\n <div className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">{notification.body}</div>\n ) : null}\n </div>\n {link ? <div className=\"mt-2 truncate text-xs text-primary\">{link}</div> : null}\n {createdAtLabel ? (\n <div className=\"mt-2 text-[11px] text-muted-foreground\">{createdAtLabel}</div>\n ) : null}\n </button>\n <div className=\"relative flex items-start\">\n <button\n ref={menuButtonRef}\n type=\"button\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\"\n aria-label=\"Notification options\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => {\n setMenuOpen((open) => !open)\n }}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n {menuOpen ? (\n <div\n ref={menuRef}\n role=\"menu\"\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-[10rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"animate-in fade-in-0 zoom-in-95\",\n )}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground\"\n onClick={() => {\n setMenuOpen(false)\n onArchive(notification.id)\n }}\n >\n Archive\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n disabled={!isUnread}\n onClick={() => {\n setMenuOpen(false)\n onMarkRead(notification.id)\n }}\n >\n Mark as read\n </button>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n"],"names":["toMs","iso","ms","Date","parse","Number","isFinite","getDayKey","date","getTime","year","getFullYear","month","String","getMonth","padStart","day","getDate","formatDayLabel","key","yearRaw","monthRaw","dayRaw","split","includeYear","toLocaleDateString","undefined","weekday","getWebpushLink","item","platformWebpush","platform","webpush","Array","isArray","fcmOptions","link","groupByDay","items","groups","currentKey","createdAt","push","label","length","getBrowserNotificationPermission","window","Notification","permission","EmptyRealtimeContext","createContext","NotificationsDrawer","open","onOpenChange","className","limit","defaultUnreadOnly","realtimeContext","realtime","useContext","setItems","useState","unreadCount","setUnreadCount","unseenCount","setUnseenCount","loading","setLoading","error","setError","unreadOnly","setUnreadOnly","browserNotificationPermission","setBrowserNotificationPermission","browserNotificationPermissionRequesting","setBrowserNotificationPermissionRequesting","mergedItems","notifications","mergedUnreadCount","mergedUnseenCount","mergedLoading","mergedError","Error","message","visibleItems","useMemo","slice","unread","filter","n","readAt","read","Boolean","unreadGroups","readGroups","refresh","useCallback","markSeen","res","fetch","method","headers","credentials","body","JSON","stringify","json","catch","ok","nextItems","Math","max","floor","useEffect","keepalive","navigator","permissions","query","permissionStatus","disposed","syncPermission","name","then","status","addEventListener","removeEventListener","requestBrowserNotificationPermission","nextPermission","requestPermission","markAsRead","id","encodeURIComponent","nowIso","toISOString","current","target","find","count","seenAt","map","archive","jsx","DialogPrimitive.Root","jsxs","DialogPrimitive.Portal","DialogPrimitive.Backdrop","DialogPrimitive.Popup","cn","DialogPrimitive.Title","v","DialogPrimitive.Close","X","BrowserNotificationPermissionNotice","Loader2","group","NotificationRow","t0","$","_c","requesting","onEnable","t1","Symbol","for","isDenied","t2","t3","t4","t5","t6","t7","notification","onMarkRead","onArchive","menuOpen","setMenuOpen","menuRef","useRef","menuButtonRef","isUnread","bb0","toLocaleString","createdAtLabel","handlePointerDown","event","Node","contains","handleKeyDown","event_0","focus","document","location","href","t8","title","t9","t10","t11","t12","t13","t14","t15","_temp","MoreVertical","t16","t17","t18","t19"],"mappings":";;;;;;;;;;;AAyBA,MAAMA,KAAOA,CAACC,MAAwB;AACpC,QAAMC,IAAKC,KAAKC,MAAMH,CAAG;AACzB,SAAOI,OAAOC,SAASJ,CAAE,IAAIA,IAAK;AACpC,GAEMK,KAAYA,CAACN,MAAwB;AACzC,QAAMO,IAAO,IAAIL,KAAKH,GAAKC,CAAG,CAAC;AAC/B,MAAI,CAACI,OAAOC,SAASE,EAAKC,QAAAA,CAAS,EAAG,QAAO;AAE7C,QAAMC,IAAOF,EAAKG,YAAAA,GACZC,IAAQC,OAAOL,EAAKM,SAAAA,IAAa,CAAC,EAAEC,SAAS,GAAG,GAAG,GACnDC,IAAMH,OAAOL,EAAKS,QAAAA,CAAS,EAAEF,SAAS,GAAG,GAAG;AAElD,SAAO,GAAGL,CAAI,IAAIE,CAAK,IAAII,CAAG;AAChC,GAEME,KAAiBA,CAACC,MAAwB;AAC9C,MAAIA,MAAQ,UAAW,QAAO;AAC9B,QAAM,CAACC,GAASC,GAAUC,CAAM,IAAIH,EAAII,MAAM,GAAG,GAC3Cb,IAAOL,OAAOe,CAAO,GACrBR,IAAQP,OAAOgB,CAAQ,GACvBL,IAAMX,OAAOiB,CAAM;AAEzB,MAAI,CAACjB,OAAOC,SAASI,CAAI,KAAK,CAACL,OAAOC,SAASM,CAAK,KAAK,CAACP,OAAOC,SAASU,CAAG,EAAG,QAAO;AAEvF,QAAMR,IAAO,IAAIL,KAAKO,GAAME,IAAQ,GAAGI,CAAG;AAC1C,MAAI,CAACX,OAAOC,SAASE,EAAKC,QAAAA,CAAS,EAAG,QAAO;AAG7C,QAAMe,yBADUrB,KAAAA,GACQQ,YAAAA,MAAkBD;AAC1C,SAAOF,EAAKiB,mBAAmBC,QAAWF,IACtC;AAAA,IAAEG,SAAS;AAAA,IAASf,OAAO;AAAA,IAASI,KAAK;AAAA,IAAWN,MAAM;AAAA,EAAA,IAC1D;AAAA,IAAEiB,SAAS;AAAA,IAASf,OAAO;AAAA,IAASI,KAAK;AAAA,EAAA,CAAW;AAC1D,GAEMY,KAAiBA,CAACC,MAAmC;AACzD,QAAMC,IAAkBD,EAAKE,UAAUC;AACvC,MAAI,CAACF,KAAmB,OAAOA,KAAoB,YAAYG,MAAMC,QAAQJ,CAAe,EAAG,QAAO;AACtG,QAAMK,IAAcL,EAA6CK;AACjE,SAAI,CAACA,KAAc,OAAOA,KAAe,YAAYF,MAAMC,QAAQC,CAAU,IAAU,KAChF,OAAQA,EAAkCC,QAAS,WAAYD,EAAgCC,OAAO;AAC/G,GAEMC,IAAaA,CAACC,MAA0C;AAC5D,QAAMC,IAAqB,CAAA;AAC3B,MAAIC,IAA4B;AAEhC,aAAWX,KAAQS,GAAO;AACxB,UAAMnB,IAAMZ,GAAUsB,EAAKY,SAAS;AACpC,IAAItB,MAAQqB,MACVA,IAAarB,GACboB,EAAOG,KAAK;AAAA,MAAEvB,KAAAA;AAAAA,MAAKwB,OAAOzB,GAAeC,CAAG;AAAA,MAAGmB,OAAO,CAAA;AAAA,IAAA,CAAI,IAE5DC,EAAOA,EAAOK,SAAS,CAAC,EAAGN,MAAMI,KAAKb,CAAI;AAAA,EAC5C;AAEA,SAAOU;AACT,GAEMM,IAAmCA,MACnC,OAAOC,SAAW,OAClB,EAAE,kBAAkBA,UAAgB,gBACjCA,OAAOC,aAAaC,YAGvBC,KAAuBC,GAAiD,IAAI;AAE3E,SAASC,GAAoB;AAAA,EAClCC,MAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,OAAAA,IAAQ;AAAA,EACRC,mBAAAA,IAAoB;AAAA,EACpBC,iBAAAA;AAQF,GAAG;AACD,QAAMC,IAAWC,GAAWF,KAAmBR,EAAoB,GAE7D,CAACX,GAAOsB,CAAQ,IAAIC,EAA6B,CAAA,CAAE,GACnD,CAACC,GAAaC,CAAc,IAAIF,EAAiB,CAAC,GAClD,CAACG,GAAaC,CAAc,IAAIJ,EAAiB,CAAC,GAClD,CAACK,GAASC,CAAU,IAAIN,EAAS,EAAK,GACtC,CAACO,GAAOC,CAAQ,IAAIR,EAAwB,IAAI,GAChD,CAACS,GAAYC,CAAa,IAAIV,EAAkBL,CAAiB,GACjE,CAACgB,GAA+BC,CAAgC,IAAIZ,EAAwC,MAChHhB,GACF,GACM,CAAC6B,GAAyCC,CAA0C,IAAId,EAAS,EAAK,GAEtGe,IAAclB,GAAUmB,iBAAiBvC,GACzCwC,IAAoBpB,GAAUI,eAAeA,GAC7CiB,IAAoBrB,GAAUM,eAAeA,GAC7CgB,IAAgBtB,GAAUQ,WAAWA,GACrCe,IAAcvB,GAAUU,QACzBV,EAASU,iBAAiBc,QAAQxB,EAASU,MAAMe,UAAUtE,OAAO6C,EAASU,KAAK,IACjFA,GAEEgB,IAAeC,EAAQ,MAAMT,EAAYU,MAAM,GAAG/B,CAAK,GAAG,CAACA,GAAOqB,CAAW,CAAC,GAE9EW,IAASF,EAAQ,MAAMD,EAAaI,OAAQC,CAAAA,MAAM,CAACA,EAAEC,MAAM,GAAG,CAACN,CAAY,CAAC,GAC5EO,IAAON,EAAQ,MAAMD,EAAaI,OAAQC,CAAAA,MAAMG,EAAQH,EAAEC,MAAO,GAAG,CAACN,CAAY,CAAC,GAClFS,IAAeR,EAAQ,MAAMhD,EAAWkD,CAAM,GAAG,CAACA,CAAM,CAAC,GACzDO,IAAaT,EAAQ,MAAMhD,EAAWsD,CAAI,GAAG,CAACA,CAAI,CAAC,GAEnDI,IAAUC,GAAY,OAAO;AAAA,IAAE1B,YAAAA;AAAAA,IAAY2B,UAAAA;AAAAA,EAAAA,MAA2D;AAC1G9B,IAAAA,EAAW,EAAI,GACfE,EAAS,IAAI;AAEb,QAAI;AACF,YAAM6B,IAAM,MAAMC,MAAM,yBAAyB;AAAA,QAC/CC,QAAQ;AAAA,QACRC,SAAS;AAAA,UAAE,gBAAgB;AAAA,QAAA;AAAA,QAC3BC,aAAa;AAAA,QACbC,MAAMC,KAAKC,UAAU;AAAA,UAAElD,OAAAA;AAAAA,UAAOe,YAAAA;AAAAA,UAAY2B,UAAAA;AAAAA,QAAAA,CAAU;AAAA,MAAA,CACrD,GAEKS,IAAQ,MAAMR,EAAIQ,OAAOC,MAAM,MAAM,IAAI;AAC/C,UAAI,CAACT,EAAIU,MAAM,CAACF,GAAME,IAAI;AACxBvC,QAAAA,EAASqC,GAAMtC,SAAS,+BAA+B;AACvD;AAAA,MACF;AAEA,YAAMyC,IAAY5E,MAAMC,QAAQwE,EAAK7B,aAAa,IAAI6B,EAAK7B,gBAAgB,CAAA;AAC3EjB,MAAAA,EAASiD,CAAS,GAClB9C,EAAe1D,OAAOC,SAASoG,EAAK5C,WAAW,IAAIgD,KAAKC,IAAI,GAAGD,KAAKE,MAAMN,EAAK5C,eAAe,CAAC,CAAC,IAAI,CAAC,GACrGG,EAAe5D,OAAOC,SAASoG,EAAK1C,WAAW,IAAI8C,KAAKC,IAAI,GAAGD,KAAKE,MAAMN,EAAK1C,eAAe,CAAC,CAAC,IAAI,CAAC;AAAA,IACvG,QAAQ;AACNK,MAAAA,EAAS,+BAA+B;AAAA,IAC1C,UAAA;AACEF,MAAAA,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACZ,CAAK,CAAC;AAEV0D,EAAAA,EAAU,MAAM;AACd,QAAK7D,GACL;AAAA,UAAIM,GAAU;AACZ,SAAM,YAAY;AAChB,cAAI;AACF,kBAAMyC,MAAM,yBAAyB;AAAA,cACnCC,QAAQ;AAAA,cACRC,SAAS;AAAA,gBAAE,gBAAgB;AAAA,cAAA;AAAA,cAC3BC,aAAa;AAAA,cACbY,WAAW;AAAA,cACXX,MAAMC,KAAKC,UAAU;AAAA,gBAAElD,OAAO;AAAA,gBAAG0C,UAAU;AAAA,cAAA,CAAM;AAAA,YAAA,CAClD;AAAA,UACH,QAAQ;AACN;AAAA,UACF;AAAA,QACF,GAAA;AACA;AAAA,MACF;AACA,MAAKF,EAAQ;AAAA,QAAEzB,YAAAA;AAAAA,QAAY2B,UAAU;AAAA,MAAA,CAAM;AAAA;AAAA,EAC7C,GAAG,CAAC7C,GAAMM,GAAUqC,GAASzB,CAAU,CAAC,GAExC2C,EAAU,MAAM;AACd,IAAK7D,MACDM,KACCqC,EAAQ;AAAA,MAAEzB,YAAAA;AAAAA,MAAY2B,UAAU;AAAA,IAAA,CAAO;AAAA,EAC9C,GAAG,CAAC7C,GAAMM,GAAUqC,GAASzB,CAAU,CAAC,GAExC2C,EAAU,MAAM;AAKd,QAJI,CAAC7D,MAELqB,EAAiC5B,GAAkC,GAE/D,OAAOsE,YAAc,OAAe,CAACA,UAAUC,aAAaC,OAAO;AAEvE,QAAIC,IAA4C,MAC5CC,IAAW;AACf,UAAMC,IAAiBA,MAAM;AAC3B/C,MAAAA,EAAiC5B,GAAkC;AAAA,IACrE;AAEA,QAAI;AACF,MAAKsE,UAAUC,YAAYC,MAAM;AAAA,QAAEI,MAAM;AAAA,MAAA,CAAmC,EAAEC,KAAMC,CAAAA,MAAW;AAC7F,QAAIJ,MACJD,IAAmBK,GACnBH,EAAAA,GACAG,EAAOC,iBAAiB,UAAUJ,CAAc;AAAA,MAClD,CAAC,EAAEb,MAAM,MAAM;AAAA,MACb,CACD;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAEA,WAAO,MAAM;AACXY,MAAAA,IAAW,IACXD,GAAkBO,oBAAoB,UAAUL,CAAc;AAAA,IAChE;AAAA,EACF,GAAG,CAACpE,CAAI,CAAC;AAET,QAAM0E,IAAuC,YAAY;AACvD,QAAI,OAAOhF,SAAW,OAAe,EAAE,kBAAkBA,SAAS;AAChE2B,MAAAA,EAAiC,aAAa;AAC9C;AAAA,IACF;AAEAE,IAAAA,EAA2C,EAAI;AAC/C,QAAI;AACF,YAAMoD,IAAiB,MAAMjF,OAAOC,aAAaiF,kBAAAA;AACjDvD,MAAAA,EAAiCsD,CAAc;AAAA,IACjD,QAAQ;AACNtD,MAAAA,EAAiC5B,GAAkC;AAAA,IACrE,UAAA;AACE8B,MAAAA,EAA2C,EAAK;AAAA,IAClD;AAAA,EACF,GAEMsD,IAAa,OAAOC,MAAe;AACvC,QAAI;AACF,YAAMhC,IAAM,MAAMC,MAAM,yBAAyBgC,mBAAmBD,CAAE,CAAC,SAAS;AAAA,QAC9E9B,QAAQ;AAAA,QACRC,SAAS;AAAA,UAAE,gBAAgB;AAAA,QAAA;AAAA,QAC3BC,aAAa;AAAA,QACbY,WAAW;AAAA,QACXX,MAAM;AAAA,MAAA,CACP,GAEKG,IAAQ,MAAMR,EAAIQ,OAAOC,MAAM,MAAM,IAAI;AAC/C,UAAI,CAACT,EAAIU,MAAM,CAACF,GAAME,GAAI;AAE1B,YAAMwB,KAAS,oBAAIjI,KAAAA,GAAOkI,YAAAA;AAC1B,UAAI3E,EAAU;AACdE,MAAAA,EAAU0E,CAAAA,MAAY;AACpB,cAAMC,IAASD,EAAQE,KAAM/C,CAAAA,MAAMA,EAAEyC,OAAOA,CAAE;AAC9C,eAAIK,KAAU,CAACA,EAAO7C,UACpB3B,EAAgB0E,OAAU3B,KAAKC,IAAI,GAAG0B,IAAQ,CAAC,CAAC,GAE9CF,KAAU,CAACA,EAAOG,UACpBzE,EAAgBwE,OAAU3B,KAAKC,IAAI,GAAG0B,IAAQ,CAAC,CAAC,GAE3CH,EAAQK,IAAKlD,CAAAA,MAAOA,EAAEyC,OAAOA,KAAM,CAACzC,EAAEC,SAAS;AAAA,UAAE,GAAGD;AAAAA,UAAGC,QAAQ0C;AAAAA,UAAQ,GAAI3C,EAAEiD,SAAS,KAAK;AAAA,YAAEA,QAAQN;AAAAA,UAAAA;AAAAA,QAAO,IAAO3C,CAAE;AAAA,MAC9H,CAAC;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAAA,EACF,GAEMmD,IAAU,OAAOV,MAAe;AACpC,QAAI;AACF,YAAMhC,IAAM,MAAMC,MAAM,yBAAyBgC,mBAAmBD,CAAE,CAAC,YAAY;AAAA,QACjF9B,QAAQ;AAAA,QACRC,SAAS;AAAA,UAAE,gBAAgB;AAAA,QAAA;AAAA,QAC3BC,aAAa;AAAA,QACbC,MAAM;AAAA,MAAA,CACP,GAEKG,IAAQ,MAAMR,EAAIQ,OAAOC,MAAM,MAAM,IAAI;AAG/C,UAFI,CAACT,EAAIU,MAAM,CAACF,GAAME,MAElBlD,EAAU;AACdE,MAAAA,EAAU0E,CAAAA,MAAY;AACpB,cAAMC,IAASD,EAAQE,KAAM/C,CAAAA,MAAMA,EAAEyC,OAAOA,CAAE;AAC9C,eAAIK,KAAU,CAACA,EAAO7C,UACpB3B,EAAgB0E,OAAU3B,KAAKC,IAAI,GAAG0B,IAAQ,CAAC,CAAC,GAE9CF,KAAU,CAACA,EAAOG,UACpBzE,EAAgBwE,OAAU3B,KAAKC,IAAI,GAAG0B,IAAQ,CAAC,CAAC,GAE3CH,EAAQ9C,OAAQC,CAAAA,MAAMA,EAAEyC,OAAOA,CAAE;AAAA,MAC1C,CAAC;AAAA,IACH,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SACEW,gBAAAA,EAAAA,IAACC,IAAA,EAAqB,MAAA1F,GAAY,cAAAC,GAChC,UAAA0F,gBAAAA,EAAAA,KAACC,IAAA,EACC,UAAA;AAAA,IAAAH,gBAAAA,EAAAA,IAACI,IAAA,EAAyB,WAAU,iCAAA,CAAgC;AAAA,IACpEF,gBAAAA,EAAAA,KAACG,IAAA,EACC,WAAWC,EACT,+GACA7F,CACF,GAEA,UAAA;AAAA,MAAAyF,gBAAAA,EAAAA,KAAC,UAAA,EAAO,WAAU,8DAChB,UAAA;AAAA,QAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,UAAAF,gBAAAA,EAAAA,IAACO,IAAA,EAAsB,WAAU,yBAAwB,UAAA,iBAAa;AAAA,UACtEP,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,iCACb/D,cAAoB,IAAI,GAAGA,CAAiB,YAAYC,IAAoB,IAAI,GAAGA,CAAiB,SAAS,gBAAA,CAChH;AAAA,QAAA,GACF;AAAA,QACAgE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAAF,gBAAAA,MAAC,YACC,MAAK,UACL,SAAS,MAAMtE,EAAe8E,OAAM,CAACA,CAAC,GACtC,WAAWF,EACT,uCACA7E,IAAa,8BAA8B,qDAC7C,GAECA,UAAAA,IAAa,WAAW,OAC3B;AAAA,gCACCgF,IAAA,EACC,8BAAS,UAAA,EAAO,MAAK,UAAS,WAAU,iFAExC,UAAAT,gBAAAA,EAAAA,IAACU,IAAA,EAAE,WAAU,WAAS,EAAA,CACxB;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEAR,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,QAAAF,gBAAAA,MAACW,MACC,YAAYhF,GACZ,YAAYE,GACZ,UAAUoD,GAAqC;AAAA,QAEhD9C,IACC6D,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,gEACb,UAAAA,gBAAAA,EAAAA,IAACY,IAAA,EAAQ,WAAU,uBAAA,CAAsB,EAAA,CAC3C,IACExE,0BACD,OAAA,EAAI,WAAU,mDAAmDA,UAAAA,EAAAA,CAAY,IAC5EG,EAAaxC,WAAW,IAC1BiG,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,mDAAkD,UAAA,oBAAA,CAAiB,IAElFE,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,UAAAA,gBAAAA,OAAC,OAAA,EACC,UAAA;AAAA,YAAAF,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,yHAAuH,UAAA,wBAEtI;AAAA,YACChD,EAAajD,WAAW,IACvBiG,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,kDAAiD,UAAA,2BAAA,CAAwB,IAExFhD,EAAa8C,IAAKe,CAAAA,6BACf,OAAA,EACC,UAAA;AAAA,cAAAb,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oHACZa,UAAAA,EAAM/G,OACT;AAAA,oCACC,OAAA,EAAI,WAAU,8CACZ+G,UAAAA,EAAMpH,MAAMqG,IAAKlD,CAAAA,MAChBoD,gBAAAA,EAAAA,IAACc,KAEC,cAAclE,GACd,YAAYwC,GACZ,WAAWW,KAHNnD,EAAEyC,GAKV,EAAA,CACH;AAAA,YAAA,EAAA,GAbQ,UAAUwB,EAAMvI,GAAG,EAc7B,CACD;AAAA,UAAA,GAEL;AAAA,UAECmD,IAAa,OACZyE,gBAAAA,EAAAA,KAAC,OAAA,EACC,UAAA;AAAA,YAAAF,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,yHAAuH,UAAA,0BAEtI;AAAA,YACC/C,EAAWlD,WAAW,IACrBiG,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,kDAAiD,UAAA,6BAAA,CAA0B,IAE1F/C,EAAW6C,IAAKe,CAAAA,6BACb,OAAA,EACC,UAAA;AAAA,cAAAb,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,oHACZa,UAAAA,EAAM/G,OACT;AAAA,oCACC,OAAA,EAAI,WAAU,8CACZ+G,UAAAA,EAAMpH,MAAMqG,IAAKlD,CAAAA,MAChBoD,gBAAAA,EAAAA,IAACc,KAEC,cAAclE,GACd,YAAYwC,GACZ,WAAWW,KAHNnD,EAAEyC,GAKV,EAAA,CACH;AAAA,YAAA,EAAA,GAbQ,YAAYwB,EAAMvI,GAAG,EAc/B,CACD;AAAA,UAAA,EAAA,CAEL;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAEA,SAAAqI,GAAAI,GAAA;AAAA,QAAAC,IAAAC,EAAAA,EAAA,EAAA,GAA6C;AAAA,IAAA9G,YAAAA;AAAAA,IAAA+G,YAAAA;AAAAA,IAAAC,UAAAA;AAAAA,EAAAA,IAAAJ;AAS3C,MAAI5G,MAAe;AAAS,WAAS;AAErC,MAAIA,MAAe,eAAa;AAAA,QAAAiH;AAAA,WAAAJ,EAAA,CAAA,MAAAK,uBAAAC,IAAA,2BAAA,KAE5BF,IAAApB,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,wEAAuE,UAAA,4DAEtF,GAAMgB,OAAAI,KAAAA,IAAAJ,EAAA,CAAA,GAFNI;AAAAA,EAEM;AAIV,QAAAG,IAAiBpH,MAAe,UAKzBiH,IAAAG,IAAA,uCAAA;AAA0F,MAAAC;AAAA,EAAAR,SAAAI,KAD7FI,IAAAxB,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,uBACZoB,UAAAA,GACH,GAAMJ,OAAAI,GAAAJ,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAEH,QAAAS,IAAAF,IAAA,mFAAA;AAE8D,MAAAG;AAAA,EAAAV,SAAAS,KAHjEC,IAAA1B,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,sCACZyB,UAAAA,GAGH,GAAMT,OAAAS,GAAAT,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAOH,QAAAW,IAAAT,IAAA,gBAAA;AAA2D,MAAAU;AAAA,EAAAZ,EAAA,CAAA,MAAAG,KAAAH,SAAAE,KAAAF,EAAA,CAAA,MAAAW,KAN9DC,IAAA5B,gBAAAA,EAAAA,IAAA,UAAA,EACO,MAAA,UACK,WAAA,iKACAkB,aACDC,SAAAA,GAERQ,UAAAA,EAAAA,CACH,GAASX,OAAAG,GAAAH,OAAAE,GAAAF,OAAAW,GAAAX,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,EAAA,CAAA,MAAAQ,KAAAR,UAAAU,KAAAV,EAAA,EAAA,MAAAY,KAhBXC,oCAAe,WAAA,0CACbL,UAAAA;AAAAA,IAAAA;AAAAA,IAGAE;AAAAA,IAKAE;AAAAA,EAAAA,GAQF,GAAMZ,OAAAQ,GAAAR,QAAAU,GAAAV,QAAAY,GAAAZ,QAAAa,KAAAA,IAAAb,EAAA,EAAA,GAjBNa;AAiBM;AAIV,SAAAf,EAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAAA,EAAA,EAAA,GAAyB;AAAA,IAAAa,cAAAA;AAAAA,IAAAC,YAAAA;AAAAA,IAAAC,WAAAA;AAAAA,EAAAA,IAAAjB,GASvB,CAAAkB,GAAAC,CAAA,IAAgClH,EAAS,EAAK,GAC9CmH,IAAgBC,EAA8B,IAAI,GAClDC,IAAsBD,EAAiC,IAAI,GAC3DE,IAAiB,CAACR,EAAYjF;AAAO,MAAAuE;AAAA,EAAAJ,SAAAc,KACxBV,IAAArI,GAAe+I,CAAY,GAACd,OAAAc,GAAAd,OAAAI,KAAAA,IAAAJ,EAAA,CAAA;AAAzC,QAAAzH,IAAa6H;AAA4B,MAAAI;AAAA,MAAAR,EAAA,CAAA,MAAAc,EAAAlI,WAAA;AAAA2I,IAAAA,GAAA;AAEvC,YAAA5K,IAAa,IAAIL,KAAKH,GAAK2K,EAAYlI,SAAU,CAAC;AAClD,UAAI,CAACpC,OAAMC,SAAUE,EAAIC,QAAAA,CAAU,GAAC;AAAE4J,QAAAA,IAAO;AAAP,cAAAe;AAAAA,MAAS;AAC/Cf,MAAAA,IAAO7J,EAAI6K,eAAAA;AAAAA,IAAiB;AAAAxB,IAAAA,EAAA,CAAA,IAAAc,EAAAlI,WAAAoH,OAAAQ;AAAAA,EAAA;AAAAA,IAAAA,IAAAR,EAAA,CAAA;AAH9B,QAAAyB,IAAuBjB;AAInB,MAAAC,GAAAC;AAAA,EAAAV,SAAAiB,KAEMR,IAAAA,MAAA;AACR,QAAI,CAACQ;AAAQ;AAEb,UAAAS,IAA0BC,CAAAA,MAAA;AACxB,YAAAjD,IAAeiD,EAAKjD;AACpB,MAAMA,aAAkBkD,SACpBT,EAAO1C,SAAkBoD,SAACnD,CAAiD,KAAtC2C,EAAa5C,SAAkBoD,SAACnD,CAAM,KAC/EwC,EAAY,EAAK;AAAA,IAAC,GAGpBY,IAAsBC,CAAAA,MAAA;AACpB,MAAIJ,EAAKrK,QAAS,aAClB4J,EAAY,EAAK,GACjBG,EAAa5C,SAAeuD,MAAAA;AAAAA,IAAE;AAGhCC,oBAAQlE,iBAAkB,eAAe2D,CAAiB,GAC1DO,SAAQlE,iBAAkB,WAAW+D,CAAa,GAE3C,MAAA;AACLG,eAAQjE,oBAAqB,eAAe0D,CAAiB,GAC7DO,SAAQjE,oBAAqB,WAAW8D,CAAa;AAAA,IAAC;AAAA,EACvD,GACApB,IAAA,CAACO,CAAQ,GAACjB,OAAAiB,GAAAjB,OAAAS,GAAAT,OAAAU,MAAAD,IAAAT,EAAA,CAAA,GAAAU,IAAAV,EAAA,CAAA,IAvBb5C,EAAUqD,GAuBPC,CAAU;AAMP,QAAAC,IAAAW,IAAA,iBAAA;AAA2C,MAAAV;AAAA,EAAAZ,SAAAW,KAFlCC,IAAAtB,EACT,wDACAqB,CACF,GAACX,OAAAW,GAAAX,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AAAA,MAAAa;AAAA,EAAAb,EAAA,CAAA,MAAAsB,KAAAtB,UAAAzH,KAAAyH,EAAA,EAAA,MAAAc,EAAAzC,MAAA2B,UAAAe,KAKUF,IAAAA,MAAA;AACP,IAAIS,KACGP,EAAWD,EAAYzC,EAAG,GAE7B9F,MACFU,OAAMiJ,SAASC,OAAQ5J;AAAAA,EACxB,GACFyH,OAAAsB,GAAAtB,QAAAzH,GAAAyH,EAAA,EAAA,IAAAc,EAAAzC,IAAA2B,QAAAe,GAAAf,QAAAa,KAAAA,IAAAb,EAAA,EAAA;AAAA,MAAAoC;AAAA,EAAApC,EAAA,EAAA,MAAAc,EAAAuB,SAGCD,IAAApD,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,kCAAkC8B,YAAYuB,OAAO,GAAMrC,EAAA,EAAA,IAAAc,EAAAuB,OAAArC,QAAAoC,KAAAA,IAAApC,EAAA,EAAA;AAAA,MAAAsC;AAAA,EAAAtC,EAAA,EAAA,MAAAc,EAAApE,QACzE4F,IAAAxB,EAAYpE,OACXsC,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,qDAAqD8B,UAAAA,EAAYpE,MAAM,IADvF,MAEOsD,EAAA,EAAA,IAAAc,EAAApE,MAAAsD,QAAAsC,KAAAA,IAAAtC,EAAA,EAAA;AAAA,MAAAuC;AAAA,EAAAvC,EAAA,EAAA,MAAAoC,KAAApC,UAAAsC,KAJVC,IAAArD,gBAAAA,EAAAA,KAAA,OAAA,EAAe,WAAA,WACbkD,UAAAA;AAAAA,IAAAA;AAAAA,IACCE;AAAAA,EAAAA,GAGH,GAAMtC,QAAAoC,GAAApC,QAAAsC,GAAAtC,QAAAuC,KAAAA,IAAAvC,EAAA,EAAA;AAAA,MAAAwC;AAAA,EAAAxC,UAAAzH,KACLiK,IAAAjK,IAAOyG,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,mDAA2C,IAAjE,MAA8EgB,QAAAzH,GAAAyH,QAAAwC,KAAAA,IAAAxC,EAAA,EAAA;AAAA,MAAAyC;AAAA,EAAAzC,UAAAyB,KAC9EgB,IAAAhB,IACCzC,gBAAAA,EAAAA,IAAA,OAAA,EAAe,WAAA,uDAAyD,IADzE,MAEOgB,QAAAyB,GAAAzB,QAAAyC,KAAAA,IAAAzC,EAAA,EAAA;AAAA,MAAA0C;AAAA,EAAA1C,EAAA,EAAA,MAAAuC,KAAAvC,EAAA,EAAA,MAAAwC,KAAAxC,EAAA,EAAA,MAAAyC,KAAAzC,UAAAa,KArBV6B,2BAAA,UAAA,EACO,MAAA,UACK,WAAA,4BACD,SAAA7B,GAST0B,UAAAA;AAAAA,IAAAA;AAAAA,IAMCC;AAAAA,IACAC;AAAAA,EAAAA,GAGH,GAASzC,QAAAuC,GAAAvC,QAAAwC,GAAAxC,QAAAyC,GAAAzC,QAAAa,GAAAb,QAAA0C,KAAAA,IAAA1C,EAAA,EAAA;AAAA,MAAA2C,GAAAC;AAAA,EAAA5C,EAAA,EAAA,MAAAK,uBAAAC,IAAA,2BAAA,KASIqC,IAAAA,MAAA;AACPzB,IAAAA,EAAY2B,EAAe;AAAA,EAAC,GAG9BD,0BAACE,IAAA,EAAuB,WAAA,UAAA,CAAS,GAAG9C,QAAA2C,GAAA3C,QAAA4C,MAAAD,IAAA3C,EAAA,EAAA,GAAA4C,IAAA5C,EAAA,EAAA;AAAA,MAAA+C;AAAA,EAAA/C,UAAAiB,KAXtC8B,sCACO1B,KAAAA,GACA,MAAA,UACK,WAAA,8EACC,cAAA,wBACG,iBAAA,QACCJ,iBAAAA,GACN,SAAA0B,GAITC,UAAAA,GACF,GAAS5C,QAAAiB,GAAAjB,QAAA+C,KAAAA,IAAA/C,EAAA,EAAA;AAAA,MAAAgD;AAAA,EAAAhD,UAAAsB,KAAAtB,EAAA,EAAA,MAAAiB,KAAAjB,EAAA,EAAA,MAAAc,EAAAzC,MAAA2B,EAAA,EAAA,MAAAgB,KAAAhB,UAAAe,KACRiC,IAAA/B,IACC/B,gBAAAA,EAAAA,KAAA,OAAA,EACOiC,KAAAA,GACA,MAAA,QACM,WAAA7B,EACT,wIACA,iCACF,GAEA,UAAA;AAAA,IAAAN,gBAAAA,kBACO,MAAA,UACA,MAAA,YACK,WAAA,2MACD,SAAA,MAAA;AACPkC,MAAAA,EAAY,EAAK,GACjBF,EAAUF,EAAYzC,EAAG;AAAA,IAAC,GAE7B,UAAA,WAED;AAAA,IACAW,gBAAAA,EAAAA,IAAA,UAAA,EACO,MAAA,UACA,MAAA,YACK,WAAA,4PACA,UAAA,CAACsC,GACF,SAAA,MAAA;AACPJ,MAAAA,EAAY,EAAK,GACjBH,EAAWD,EAAYzC,EAAG;AAAA,IAAC,GAE9B,UAAA,eAAA,CAED;AAAA,EAAA,EAAA,CACF,IAhCD,MAiCO2B,QAAAsB,GAAAtB,QAAAiB,GAAAjB,EAAA,EAAA,IAAAc,EAAAzC,IAAA2B,QAAAgB,GAAAhB,QAAAe,GAAAf,QAAAgD,KAAAA,IAAAhD,EAAA,EAAA;AAAA,MAAAiD;AAAA,EAAAjD,EAAA,EAAA,MAAA+C,KAAA/C,UAAAgD,KA/CVC,IAAA/D,gBAAAA,EAAAA,KAAA,OAAA,EAAe,WAAA,6BACb6D,UAAAA;AAAAA,IAAAA;AAAAA,IAaCC;AAAAA,EAAAA,GAkCH,GAAMhD,QAAA+C,GAAA/C,QAAAgD,GAAAhD,QAAAiD,KAAAA,IAAAjD,EAAA,EAAA;AAAA,MAAAkD;AAAA,SAAAlD,EAAA,EAAA,MAAA0C,KAAA1C,UAAAiD,KAAAjD,EAAA,EAAA,MAAAY,KA7ERsC,IAAAhE,gBAAAA,EAAAA,KAAA,OAAA,EACa,WAAA0B,GAKX8B,UAAAA;AAAAA,IAAAA;AAAAA,IAuBAO;AAAAA,EAAAA,GAiDF,GAAMjD,QAAA0C,GAAA1C,QAAAiD,GAAAjD,QAAAY,GAAAZ,QAAAkD,KAAAA,IAAAlD,EAAA,EAAA,GA9ENkD;AA8EM;AA5HV,SAAAL,GAAAtJ,GAAA;AAAA,SAoFkC,CAACA;AAAI;"}
1
+ {"version":3,"file":"index16.js","sources":["../src/components/Notifications/NotificationsDrawer.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type Context } from \"react\"\nimport { Dialog as DialogPrimitive, type DialogRoot } from \"@base-ui/react/dialog\"\nimport { Loader2, MoreVertical, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { NotificationItem, NotificationsRealtimeState } from \"./types\"\n\n\ntype ListResponse = {\n ok?: boolean\n error?: string\n notifications?: NotificationItem[]\n unreadCount?: number\n unseenCount?: number\n}\n\ntype DayGroup = {\n key: string\n label: string\n items: NotificationItem[]\n}\n\ntype BrowserNotificationPermission = NotificationPermission | \"unsupported\"\ntype NotificationActionMode = \"navigate\" | \"merge_current_search\"\n\ntype NotificationAction = {\n link: string\n mode: NotificationActionMode\n}\n\nconst toMs = (iso: string): number => {\n const ms = Date.parse(iso)\n return Number.isFinite(ms) ? ms : 0\n}\n\nconst getDayKey = (iso: string): string => {\n const date = new Date(toMs(iso))\n if (!Number.isFinite(date.getTime())) return \"unknown\"\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n\n return `${year}-${month}-${day}`\n}\n\nconst formatDayLabel = (key: string): string => {\n if (key === \"unknown\") return \"Unknown date\"\n const [yearRaw, monthRaw, dayRaw] = key.split(\"-\")\n const year = Number(yearRaw)\n const month = Number(monthRaw)\n const day = Number(dayRaw)\n\n if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) return \"Unknown date\"\n\n const date = new Date(year, month - 1, day)\n if (!Number.isFinite(date.getTime())) return \"Unknown date\"\n\n const now = new Date()\n const includeYear = now.getFullYear() !== year\n return date.toLocaleDateString(undefined, includeYear\n ? { weekday: \"short\", month: \"short\", day: \"numeric\", year: \"numeric\" }\n : { weekday: \"short\", month: \"short\", day: \"numeric\" })\n}\n\nconst getNotificationLink = (item: NotificationItem): string => {\n const dataLink = item.data?.link?.trim()\n if (dataLink) return dataLink\n\n const platformWebpush = item.platform?.webpush\n if (!platformWebpush || typeof platformWebpush !== \"object\" || Array.isArray(platformWebpush)) return \"\"\n const fcmOptions = (platformWebpush as { fcmOptions?: unknown }).fcmOptions\n if (!fcmOptions || typeof fcmOptions !== \"object\" || Array.isArray(fcmOptions)) return \"\"\n const link = (fcmOptions as { link?: unknown }).link\n return typeof link === \"string\" ? link.trim() : \"\"\n}\n\nconst getNotificationActionMode = (item: NotificationItem): NotificationActionMode => {\n return item.data?.linkMode === \"merge_current_search\" ? \"merge_current_search\" : \"navigate\"\n}\n\nconst getNotificationAction = (item: NotificationItem): NotificationAction | null => {\n const link = getNotificationLink(item)\n if (!link) return null\n return {\n link,\n mode: getNotificationActionMode(item),\n }\n}\n\nconst pushUrlWithoutReload = (url: string): void => {\n window.history.pushState(window.history.state, \"\", url)\n window.dispatchEvent(new PopStateEvent(\"popstate\", { state: window.history.state }))\n}\n\nconst applyNotificationAction = (action: NotificationAction): void => {\n if (action.mode === \"merge_current_search\") {\n const currentUrl = new URL(window.location.href)\n const actionUrl = new URL(action.link, currentUrl)\n\n actionUrl.searchParams.forEach((value, key) => {\n currentUrl.searchParams.set(key, value)\n })\n if (actionUrl.hash) {\n currentUrl.hash = actionUrl.hash\n }\n\n pushUrlWithoutReload(`${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`)\n return\n }\n\n window.location.href = action.link\n}\n\nconst groupByDay = (items: NotificationItem[]): DayGroup[] => {\n const groups: DayGroup[] = []\n let currentKey: string | null = null\n\n for (const item of items) {\n const key = getDayKey(item.createdAt)\n if (key !== currentKey) {\n currentKey = key\n groups.push({ key, label: formatDayLabel(key), items: [] })\n }\n groups[groups.length - 1]!.items.push(item)\n }\n\n return groups\n}\n\nconst getBrowserNotificationPermission = (): BrowserNotificationPermission => {\n if (typeof window === \"undefined\") return \"unsupported\"\n if (!(\"Notification\" in window)) return \"unsupported\"\n return window.Notification.permission\n}\n\nconst EmptyRealtimeContext = createContext<NotificationsRealtimeState | null>(null)\n\nexport function NotificationsDrawer({\n open,\n onOpenChange,\n className,\n limit = 50,\n defaultUnreadOnly = false,\n realtimeContext,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n className?: string\n limit?: number\n defaultUnreadOnly?: boolean\n realtimeContext?: Context<NotificationsRealtimeState | null>\n}) {\n const realtime = useContext(realtimeContext ?? EmptyRealtimeContext)\n\n const [items, setItems] = useState<NotificationItem[]>([])\n const [unreadCount, setUnreadCount] = useState<number>(0)\n const [unseenCount, setUnseenCount] = useState<number>(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [unreadOnly, setUnreadOnly] = useState<boolean>(defaultUnreadOnly)\n const [browserNotificationPermission, setBrowserNotificationPermission] = useState<BrowserNotificationPermission>(() =>\n getBrowserNotificationPermission(),\n )\n const [browserNotificationPermissionRequesting, setBrowserNotificationPermissionRequesting] = useState(false)\n const dialogActionsRef = useRef<DialogRoot.Actions | null>(null)\n\n const mergedItems = realtime?.notifications ?? items\n const mergedUnreadCount = realtime?.unreadCount ?? unreadCount\n const mergedUnseenCount = realtime?.unseenCount ?? unseenCount\n const mergedLoading = realtime?.loading ?? loading\n const mergedError = realtime?.error\n ? (realtime.error instanceof Error ? realtime.error.message : String(realtime.error))\n : error\n\n const visibleItems = useMemo(() => mergedItems.slice(0, limit), [limit, mergedItems])\n\n const unread = useMemo(() => visibleItems.filter((n) => !n.readAt), [visibleItems])\n const read = useMemo(() => visibleItems.filter((n) => Boolean(n.readAt)), [visibleItems])\n const unreadGroups = useMemo(() => groupByDay(unread), [unread])\n const readGroups = useMemo(() => groupByDay(read), [read])\n\n const refresh = useCallback(async ({ unreadOnly, markSeen }: { unreadOnly: boolean; markSeen: boolean }) => {\n setLoading(true)\n setError(null)\n\n try {\n const res = await fetch(\"/api/rb/notifications\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ limit, unreadOnly, markSeen }),\n })\n\n const json = (await res.json().catch(() => null)) as ListResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to load notifications.\")\n return\n }\n\n const nextItems = Array.isArray(json.notifications) ? json.notifications : []\n setItems(nextItems)\n setUnreadCount(Number.isFinite(json.unreadCount) ? Math.max(0, Math.floor(json.unreadCount ?? 0)) : 0)\n setUnseenCount(Number.isFinite(json.unseenCount) ? Math.max(0, Math.floor(json.unseenCount ?? 0)) : 0)\n } catch {\n setError(\"Unable to load notifications.\")\n } finally {\n setLoading(false)\n }\n }, [limit])\n\n useEffect(() => {\n if (!open) return\n if (realtime) {\n void (async () => {\n try {\n await fetch(\"/api/rb/notifications\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n keepalive: true,\n body: JSON.stringify({ limit: 1, markSeen: true }),\n })\n } catch {\n return\n }\n })()\n return\n }\n void refresh({ unreadOnly, markSeen: true })\n }, [open, realtime, refresh, unreadOnly])\n\n useEffect(() => {\n if (!open) return\n if (realtime) return\n void refresh({ unreadOnly, markSeen: false })\n }, [open, realtime, refresh, unreadOnly])\n\n useEffect(() => {\n if (!open) return\n\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n\n if (typeof navigator === \"undefined\" || !navigator.permissions?.query) return\n\n let permissionStatus: PermissionStatus | null = null\n let disposed = false\n const syncPermission = () => {\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n }\n\n try {\n void navigator.permissions.query({ name: \"notifications\" as PermissionName }).then((status) => {\n if (disposed) return\n permissionStatus = status\n syncPermission()\n status.addEventListener(\"change\", syncPermission)\n }).catch(() => {\n // Notifications are not exposed through the Permissions API in every browser.\n })\n } catch {\n return\n }\n\n return () => {\n disposed = true\n permissionStatus?.removeEventListener(\"change\", syncPermission)\n }\n }, [open])\n\n const requestBrowserNotificationPermission = async () => {\n if (typeof window === \"undefined\" || !(\"Notification\" in window)) {\n setBrowserNotificationPermission(\"unsupported\")\n return\n }\n\n setBrowserNotificationPermissionRequesting(true)\n try {\n const nextPermission = await window.Notification.requestPermission()\n setBrowserNotificationPermission(nextPermission)\n } catch {\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n } finally {\n setBrowserNotificationPermissionRequesting(false)\n }\n }\n\n const markAsRead = async (id: string) => {\n try {\n const res = await fetch(`/api/rb/notifications/${encodeURIComponent(id)}/read`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n keepalive: true,\n body: \"{}\",\n })\n\n const json = (await res.json().catch(() => null)) as { ok?: boolean } | null\n if (!res.ok || !json?.ok) return\n\n const nowIso = new Date().toISOString()\n if (realtime) return\n setItems((current) => {\n const target = current.find((n) => n.id === id)\n if (target && !target.readAt) {\n setUnreadCount((count) => Math.max(0, count - 1))\n }\n if (target && !target.seenAt) {\n setUnseenCount((count) => Math.max(0, count - 1))\n }\n return current.map((n) => (n.id === id && !n.readAt ? { ...n, readAt: nowIso, ...(n.seenAt ? {} : { seenAt: nowIso }) } : n))\n })\n } catch {\n return\n }\n }\n\n const archive = async (id: string) => {\n try {\n const res = await fetch(`/api/rb/notifications/${encodeURIComponent(id)}/archive`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: \"{}\",\n })\n\n const json = (await res.json().catch(() => null)) as { ok?: boolean } | null\n if (!res.ok || !json?.ok) return\n\n if (realtime) return\n setItems((current) => {\n const target = current.find((n) => n.id === id)\n if (target && !target.readAt) {\n setUnreadCount((count) => Math.max(0, count - 1))\n }\n if (target && !target.seenAt) {\n setUnseenCount((count) => Math.max(0, count - 1))\n }\n return current.filter((n) => n.id !== id)\n })\n } catch {\n return\n }\n }\n\n const closeImmediately = () => {\n onOpenChange(false)\n dialogActionsRef.current?.unmount()\n }\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (nextOpen) {\n onOpenChange(true)\n return\n }\n\n closeImmediately()\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={handleOpenChange} actionsRef={dialogActionsRef}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop className=\"fixed inset-0 z-50 bg-black/50\" />\n <DialogPrimitive.Popup\n className={cn(\n \"fixed right-0 top-0 z-50 flex h-full w-full max-w-md flex-col border-l bg-background shadow-xl outline-none\",\n className,\n )}\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-4 py-3\">\n <div className=\"flex min-w-0 flex-col\">\n <DialogPrimitive.Title className=\"text-sm font-semibold\">Notifications</DialogPrimitive.Title>\n <span className=\"text-xs text-muted-foreground\">\n {mergedUnreadCount > 0 ? `${mergedUnreadCount} unread` : mergedUnseenCount > 0 ? `${mergedUnseenCount} new` : \"All caught up\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setUnreadOnly((v) => !v)}\n className={cn(\n \"rounded-md border px-2 py-1 text-xs\",\n unreadOnly ? \"bg-accent text-foreground\" : \"bg-background text-muted-foreground hover:bg-accent\",\n )}\n >\n {unreadOnly ? \"Unread\" : \"All\"}\n </button>\n <DialogPrimitive.Close\n render={<button type=\"button\" className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\" />}\n >\n <X className=\"h-4 w-4\" />\n </DialogPrimitive.Close>\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto px-4 pb-3\">\n <BrowserNotificationPermissionNotice\n permission={browserNotificationPermission}\n requesting={browserNotificationPermissionRequesting}\n onEnable={requestBrowserNotificationPermission}\n />\n {mergedLoading ? (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n ) : mergedError ? (\n <div className=\"py-10 text-center text-sm text-muted-foreground\">{mergedError}</div>\n ) : visibleItems.length === 0 ? (\n <div className=\"py-10 text-center text-sm text-muted-foreground\">No notifications.</div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div>\n <div className=\"sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground\">\n Unread notifications\n </div>\n {unreadGroups.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">No unread notifications.</div>\n ) : (\n unreadGroups.map((group) => (\n <div key={`unread:${group.key}`}>\n <div className=\"sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"-mx-4 flex flex-col divide-y divide-border\">\n {group.items.map((n) => (\n <NotificationRow\n key={n.id}\n notification={n}\n onMarkRead={markAsRead}\n onArchive={archive}\n onAction={closeImmediately}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n\n {unreadOnly ? null : (\n <div>\n <div className=\"sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground\">\n Previous notifications\n </div>\n {readGroups.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">No previous notifications.</div>\n ) : (\n readGroups.map((group) => (\n <div key={`previous:${group.key}`}>\n <div className=\"sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"-mx-4 flex flex-col divide-y divide-border\">\n {group.items.map((n) => (\n <NotificationRow\n key={n.id}\n notification={n}\n onMarkRead={markAsRead}\n onArchive={archive}\n onAction={closeImmediately}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nfunction BrowserNotificationPermissionNotice({\n permission,\n requesting,\n onEnable,\n}: {\n permission: BrowserNotificationPermission\n requesting: boolean\n onEnable: () => void\n}) {\n if (permission === \"granted\") return null\n\n if (permission === \"unsupported\") {\n return (\n <div className=\"mt-3 rounded-md border bg-muted/40 p-3 text-sm text-muted-foreground\">\n Browser notifications are not supported by this browser.\n </div>\n )\n }\n\n const isDenied = permission === \"denied\"\n\n return (\n <div className=\"mt-3 rounded-md border bg-muted/40 p-3\">\n <div className=\"text-sm font-medium\">\n {isDenied ? \"Browser notifications are blocked.\" : \"Browser notifications are not enabled.\"}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {isDenied\n ? \"Enable notifications for this site in your browser settings, then click again.\"\n : \"Enable browser notifications to receive important alerts.\"}\n </div>\n <button\n type=\"button\"\n className=\"mt-3 inline-flex h-8 items-center rounded-md border bg-background px-2.5 text-xs font-medium hover:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n disabled={requesting}\n onClick={onEnable}\n >\n {requesting ? \"Enabling...\" : \"Enable browser notifications\"}\n </button>\n </div>\n )\n}\n\nfunction NotificationRow({\n notification,\n onMarkRead,\n onArchive,\n onAction,\n}: {\n notification: NotificationItem\n onMarkRead: (id: string) => void\n onArchive: (id: string) => void\n onAction: () => void\n}) {\n const [menuOpen, setMenuOpen] = useState(false)\n const menuRef = useRef<HTMLDivElement | null>(null)\n const menuButtonRef = useRef<HTMLButtonElement | null>(null)\n const isUnread = !notification.readAt\n const action = getNotificationAction(notification)\n const link = action?.link ?? \"\"\n const createdAtLabel = (() => {\n const date = new Date(toMs(notification.createdAt))\n if (!Number.isFinite(date.getTime())) return \"\"\n return date.toLocaleString()\n })()\n\n useEffect(() => {\n if (!menuOpen) return\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) return\n if (menuRef.current?.contains(target) || menuButtonRef.current?.contains(target)) return\n setMenuOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n setMenuOpen(false)\n menuButtonRef.current?.focus()\n }\n\n document.addEventListener(\"pointerdown\", handlePointerDown)\n document.addEventListener(\"keydown\", handleKeyDown)\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown)\n document.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [menuOpen])\n\n return (\n <div\n className={cn(\n \"group flex w-full gap-3 px-4 py-3 hover:bg-accent/40\",\n isUnread ? \"bg-primary/5\" : \"bg-background\",\n )}\n >\n <button\n type=\"button\"\n className=\"min-w-0 flex-1 text-left\"\n onClick={() => {\n if (isUnread) {\n void onMarkRead(notification.id)\n }\n if (action) {\n onAction()\n applyNotificationAction(action)\n }\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold\">{notification.title}</div>\n {notification.body ? (\n <div className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">{notification.body}</div>\n ) : null}\n </div>\n {link ? <div className=\"mt-2 truncate text-xs text-primary\">{link}</div> : null}\n {createdAtLabel ? (\n <div className=\"mt-2 text-[11px] text-muted-foreground\">{createdAtLabel}</div>\n ) : null}\n </button>\n <div className=\"relative flex items-start\">\n <button\n ref={menuButtonRef}\n type=\"button\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\"\n aria-label=\"Notification options\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => {\n setMenuOpen((open) => !open)\n }}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n {menuOpen ? (\n <div\n ref={menuRef}\n role=\"menu\"\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-[10rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"animate-in fade-in-0 zoom-in-95\",\n )}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground\"\n onClick={() => {\n setMenuOpen(false)\n onArchive(notification.id)\n }}\n >\n Archive\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n disabled={!isUnread}\n onClick={() => {\n setMenuOpen(false)\n onMarkRead(notification.id)\n }}\n >\n Mark as read\n </button>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n"],"names":["toMs","iso","ms","Date","parse","Number","isFinite","getDayKey","date","getTime","year","getFullYear","month","String","getMonth","padStart","day","getDate","formatDayLabel","key","yearRaw","monthRaw","dayRaw","split","includeYear","toLocaleDateString","undefined","weekday","getNotificationLink","item","dataLink","data","link","trim","platformWebpush","platform","webpush","Array","isArray","fcmOptions","getNotificationActionMode","linkMode","getNotificationAction","mode","pushUrlWithoutReload","url","window","history","pushState","state","dispatchEvent","PopStateEvent","applyNotificationAction","action","currentUrl","URL","location","href","actionUrl","searchParams","forEach","value","set","hash","pathname","search","groupByDay","items","groups","currentKey","createdAt","push","label","length","getBrowserNotificationPermission","Notification","permission","EmptyRealtimeContext","createContext","NotificationsDrawer","open","onOpenChange","className","limit","defaultUnreadOnly","realtimeContext","realtime","useContext","setItems","useState","unreadCount","setUnreadCount","unseenCount","setUnseenCount","loading","setLoading","error","setError","unreadOnly","setUnreadOnly","browserNotificationPermission","setBrowserNotificationPermission","browserNotificationPermissionRequesting","setBrowserNotificationPermissionRequesting","dialogActionsRef","useRef","mergedItems","notifications","mergedUnreadCount","mergedUnseenCount","mergedLoading","mergedError","Error","message","visibleItems","useMemo","slice","unread","filter","n","readAt","read","Boolean","unreadGroups","readGroups","refresh","useCallback","markSeen","res","fetch","method","headers","credentials","body","JSON","stringify","json","catch","ok","nextItems","Math","max","floor","useEffect","keepalive","navigator","permissions","query","permissionStatus","disposed","syncPermission","name","then","status","addEventListener","removeEventListener","requestBrowserNotificationPermission","nextPermission","requestPermission","markAsRead","id","encodeURIComponent","nowIso","toISOString","current","target","find","count","seenAt","map","archive","closeImmediately","unmount","handleOpenChange","nextOpen","jsx","DialogPrimitive.Root","jsxs","DialogPrimitive.Portal","DialogPrimitive.Backdrop","DialogPrimitive.Popup","cn","DialogPrimitive.Title","v","DialogPrimitive.Close","X","BrowserNotificationPermissionNotice","Loader2","group","NotificationRow","t0","$","_c","requesting","onEnable","t1","Symbol","for","isDenied","t2","t3","t4","t5","t6","t7","notification","onMarkRead","onArchive","onAction","menuOpen","setMenuOpen","menuRef","menuButtonRef","isUnread","bb0","toLocaleString","createdAtLabel","handlePointerDown","event","Node","contains","handleKeyDown","event_0","focus","document","t8","title","t9","t10","t11","t12","t13","t14","t15","_temp","MoreVertical","t16","t17","t18","t19"],"mappings":"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"}
package/dist/index164.js CHANGED
@@ -1,4 +1,4 @@
1
- import f from "./index325.js";
1
+ import f from "./index267.js";
2
2
  import l from "./index170.js";
3
3
  function a(n) {
4
4
  "@babel/helpers - typeof";
package/dist/index165.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import l, { validateMetadata as h } from "./index164.js";
2
- import d from "./index316.js";
3
- import v from "./index317.js";
4
- import w from "./index318.js";
5
- import P from "./index319.js";
6
- import C from "./index320.js";
2
+ import d from "./index258.js";
3
+ import v from "./index259.js";
4
+ import w from "./index260.js";
5
+ import P from "./index261.js";
6
+ import C from "./index262.js";
7
7
  import s from "./index170.js";
8
- import E from "./index321.js";
8
+ import E from "./index263.js";
9
9
  function o(r) {
10
10
  "@babel/helpers - typeof";
11
11
  return o = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(t) {
package/dist/index167.js CHANGED
@@ -1,4 +1,4 @@
1
- import b from "./index320.js";
1
+ import b from "./index262.js";
2
2
  import y from "./index336.js";
3
3
  import m from "./index337.js";
4
4
  import C from "./index338.js";
package/dist/index169.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import l from "./index164.js";
2
- import f from "./index318.js";
2
+ import f from "./index260.js";
3
3
  function d(e, r) {
4
4
  var t = typeof Symbol < "u" && e[Symbol.iterator] || e["@@iterator"];
5
5
  if (t) return (t = t.call(e)).next.bind(t);
package/dist/index172.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import b from "./index191.js";
2
2
  import * as c from "react";
3
3
  import { createElement as p } from "react";
4
- import { useMergedRefs as E, useMergedRefsN as g } from "./index257.js";
4
+ import { useMergedRefs as E, useMergedRefsN as g } from "./index279.js";
5
5
  import { getReactElementRef as y } from "./index339.js";
6
6
  import { mergeObjects as R } from "./index340.js";
7
7
  import { warn as v } from "./index341.js";
8
- import { EMPTY_OBJECT as f } from "./index264.js";
8
+ import { EMPTY_OBJECT as f } from "./index286.js";
9
9
  import { getStateAttributesProps as w } from "./index342.js";
10
10
  import { resolveClassName as C } from "./index343.js";
11
11
  import { resolveStyle as T } from "./index344.js";
12
- import { mergeClassNames as _, mergeProps as h, mergePropsN as k } from "./index282.js";
12
+ import { mergeClassNames as _, mergeProps as h, mergePropsN as k } from "./index304.js";
13
13
  function q(r, e, t = {}) {
14
14
  const a = e.render, s = I(e, t);
15
15
  if (t.enabled === !1)
package/dist/index175.js CHANGED
@@ -1,4 +1,4 @@
1
- import { EMPTY_OBJECT as l } from "./index264.js";
1
+ import { EMPTY_OBJECT as l } from "./index286.js";
2
2
  function u(a, n, o, s) {
3
3
  let e = !1, t = !1;
4
4
  const r = l;
package/dist/index176.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import * as l from "react";
2
- import { isHTMLElement as M } from "./index309.js";
3
- import { useStableCallback as H } from "./index262.js";
2
+ import { isHTMLElement as M } from "./index331.js";
3
+ import { useStableCallback as H } from "./index284.js";
4
4
  import { error as y } from "./index355.js";
5
5
  import { SafeReact as B } from "./index356.js";
6
- import { useIsoLayoutEffect as A } from "./index261.js";
6
+ import { useIsoLayoutEffect as A } from "./index283.js";
7
7
  import { useCompositeRootContext as L } from "./index357.js";
8
8
  import { useFocusableWhenDisabled as W } from "./index358.js";
9
- import { mergeProps as $, makeEventPreventable as x } from "./index282.js";
9
+ import { mergeProps as $, makeEventPreventable as x } from "./index304.js";
10
10
  function Y(a = {}) {
11
11
  const {
12
12
  disabled: o = !1,
package/dist/index182.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as l from "react";
2
- import { useStableCallback as m } from "./index262.js";
2
+ import { useStableCallback as m } from "./index284.js";
3
3
  import { useAnimationsFinished as f } from "./index346.js";
4
4
  function c(a) {
5
5
  const {
package/dist/index184.js CHANGED
@@ -1,17 +1,17 @@
1
1
  import * as p from "react";
2
- import { isHTMLElement as G, getNodeName as We, getWindow as _e } from "./index309.js";
3
- import { addEventListener as I } from "./index300.js";
2
+ import { isHTMLElement as G, getNodeName as We, getWindow as _e } from "./index331.js";
3
+ import { addEventListener as I } from "./index322.js";
4
4
  import { mergeCleanups as Te } from "./index373.js";
5
- import { useMergedRefs as Fe } from "./index257.js";
6
- import { useValueAsRef as te } from "./index263.js";
7
- import { useStableCallback as ne } from "./index262.js";
8
- import { useIsoLayoutEffect as _ } from "./index261.js";
9
- import { useTimeout as ye } from "./index285.js";
10
- import { isWebKit as Ue } from "./index301.js";
11
- import { useAnimationFrame as $e } from "./index302.js";
12
- import { ownerDocument as O } from "./index284.js";
5
+ import { useMergedRefs as Fe } from "./index279.js";
6
+ import { useValueAsRef as te } from "./index285.js";
7
+ import { useStableCallback as ne } from "./index284.js";
8
+ import { useIsoLayoutEffect as _ } from "./index283.js";
9
+ import { useTimeout as ye } from "./index307.js";
10
+ import { isWebKit as Ue } from "./index323.js";
11
+ import { useAnimationFrame as $e } from "./index324.js";
12
+ import { ownerDocument as O } from "./index306.js";
13
13
  import { FocusGuard as xe } from "./index374.js";
14
- import { isTypeableCombobox as Ie, getFloatingFocusElement as he, isTypeableElement as Be } from "./index290.js";
14
+ import { isTypeableCombobox as Ie, getFloatingFocusElement as he, isTypeableElement as Be } from "./index312.js";
15
15
  import { isVirtualClick as ze, isVirtualPointerEvent as Je, stopEvent as Qe } from "./index375.js";
16
16
  import { isOutsideEvent as ve, getNextTabbable as Xe, getPreviousTabbable as Ye, tabbable as Se, isTabbable as ue, focusable as Ze } from "./index376.js";
17
17
  import { getNodeAncestors as Ce, getNodeChildren as ke } from "./index377.js";
@@ -25,7 +25,7 @@ import { useFloatingTree as rt } from "./index382.js";
25
25
  import { CLICK_TRIGGER_IDENTIFIER as ot } from "./index192.js";
26
26
  import { resolveRef as w } from "./index383.js";
27
27
  import { j as oe } from "./index30.js";
28
- import { activeElement as V, contains as a, getTarget as B } from "./index291.js";
28
+ import { activeElement as V, contains as a, getTarget as B } from "./index313.js";
29
29
  import { triggerHover as st, outsidePress as ut, focusOut as it } from "./index177.js";
30
30
  function ct(t, h) {
31
31
  const D = _e(B(t));
package/dist/index187.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import * as o from "react";
2
2
  import * as I from "react-dom";
3
- import { isNode as V } from "./index309.js";
4
- import { addEventListener as O } from "./index300.js";
3
+ import { isNode as V } from "./index331.js";
4
+ import { addEventListener as O } from "./index322.js";
5
5
  import { mergeCleanups as w } from "./index373.js";
6
6
  import { useId as G } from "./index345.js";
7
- import { useIsoLayoutEffect as _ } from "./index261.js";
8
- import { useStableCallback as L } from "./index262.js";
9
- import { EMPTY_OBJECT as k } from "./index264.js";
7
+ import { useIsoLayoutEffect as _ } from "./index283.js";
8
+ import { useStableCallback as L } from "./index284.js";
9
+ import { EMPTY_OBJECT as k } from "./index286.js";
10
10
  import { FocusGuard as S } from "./index374.js";
11
11
  import { enableFocusInside as T, isOutsideEvent as C, getPreviousTabbable as q, getNextTabbable as A, disableFocusInside as B } from "./index376.js";
12
12
  import { createChangeEventDetails as H } from "./index175.js";
package/dist/index189.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import * as t from "react";
2
2
  import { useScrollLock as v } from "./index348.js";
3
- import { useOpenInteractionType as I } from "./index275.js";
3
+ import { useOpenInteractionType as I } from "./index297.js";
4
4
  import { createChangeEventDetails as A } from "./index175.js";
5
5
  import { useImplicitActiveTrigger as M, useOpenStateTransitions as B } from "./index193.js";
6
6
  import { useSyncedFloatingRootContext as F } from "./index349.js";
7
7
  import { useRole as H } from "./index350.js";
8
- import { useDismiss as K } from "./index279.js";
8
+ import { useDismiss as K } from "./index301.js";
9
9
  import { useInteractions as L } from "./index195.js";
10
- import { getTarget as U, contains as V } from "./index291.js";
10
+ import { getTarget as U, contains as V } from "./index313.js";
11
11
  import { imperativeAction as j } from "./index177.js";
12
12
  function $(P) {
13
13
  const {
package/dist/index190.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as i from "react";
2
- import { useRefWithInit as d } from "./index258.js";
2
+ import { useRefWithInit as d } from "./index280.js";
3
3
  import { ReactStore as a } from "./index351.js";
4
4
  import { PopupTriggerMap as p } from "./index352.js";
5
5
  import { popupStoreSelectors as u, createInitialPopupStoreState as c } from "./index353.js";
package/dist/index193.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as l from "react";
2
- import { useStableCallback as a } from "./index262.js";
3
- import { useIsoLayoutEffect as s } from "./index261.js";
4
- import { useTransitionStatus as f } from "./index269.js";
2
+ import { useStableCallback as a } from "./index284.js";
3
+ import { useIsoLayoutEffect as s } from "./index283.js";
4
+ import { useTransitionStatus as f } from "./index291.js";
5
5
  import { useOpenChangeComplete as m } from "./index182.js";
6
6
  function d(e, n) {
7
7
  const t = l.useRef(null), r = l.useRef(null);
package/dist/index194.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import * as k from "react";
2
- import { useAnimationFrame as b } from "./index302.js";
3
- import { useTimeout as I } from "./index285.js";
4
- import { EMPTY_OBJECT as x } from "./index264.js";
5
- import { isTypeableElement as L } from "./index290.js";
2
+ import { useAnimationFrame as b } from "./index324.js";
3
+ import { useTimeout as I } from "./index307.js";
4
+ import { EMPTY_OBJECT as x } from "./index286.js";
5
+ import { isTypeableElement as L } from "./index312.js";
6
6
  import { isMouseLikePointerType as M, isClickLikeEvent as S } from "./index375.js";
7
7
  import { createChangeEventDetails as y } from "./index175.js";
8
- import { getTarget as q } from "./index291.js";
8
+ import { getTarget as q } from "./index313.js";
9
9
  import { triggerPress as A } from "./index177.js";
10
10
  function G(T, D = {}) {
11
11
  const e = "rootStore" in T ? T.rootStore : T, g = e.context.dataRef, {
@@ -1 +1 @@
1
- {"version":3,"file":"index22.js","sources":["../src/helpers/useMapsLibrary.ts"],"sourcesContent":["import { useEffect, useState } from \"react\"\nimport { setOptions, importLibrary } from \"@googlemaps/js-api-loader\"\n\n\ntype GoogleMapsLibraryName =\n | \"core\"\n | \"maps\"\n | \"maps3d\"\n | \"routes\"\n | \"geometry\"\n | \"elevation\"\n | \"streetView\"\n | \"journeySharing\"\n | \"drawing\"\n | \"visualization\"\n | \"marker\"\n | \"places\"\n | \"geocoding\"\n | (string & {})\n\ntype GoogleMapsLibraryModule<T extends GoogleMapsLibraryName> =\n T extends \"core\" ? google.maps.CoreLibrary\n : T extends \"maps\" ? google.maps.MapsLibrary\n : T extends \"maps3d\" ? google.maps.Maps3DLibrary\n : T extends \"routes\" ? google.maps.RoutesLibrary\n : T extends \"geometry\" ? google.maps.GeometryLibrary\n : T extends \"elevation\" ? google.maps.ElevationLibrary\n : T extends \"streetView\" ? google.maps.StreetViewLibrary\n : T extends \"journeySharing\" ? google.maps.JourneySharingLibrary\n : T extends \"drawing\" ? google.maps.DrawingLibrary\n : T extends \"visualization\" ? google.maps.VisualizationLibrary\n : T extends \"marker\" ? google.maps.MarkerLibrary\n : T extends \"places\" ? google.maps.PlacesLibrary\n : T extends \"geocoding\" ? google.maps.GeocodingLibrary\n : unknown\n\n\nlet initPromise: Promise<void> | null = null\nlet configuredKey: string | null = null\n\nconst libraryPromises = new Map<string, Promise<unknown>>()\n\nconst ensureGoogle = (apiKey?: string) => {\n if (!apiKey) {\n const error = new Error(\"useMapsLibrary: missing Google Maps API key\")\n console.error(error.message)\n return Promise.reject(error)\n }\n\n if (!initPromise) {\n configuredKey = apiKey\n setOptions({\n key: apiKey,\n v: \"weekly\",\n })\n initPromise = importLibrary(\"core\")\n .then(() => {})\n .catch(error => {\n initPromise = null\n throw error\n })\n } else if (configuredKey !== apiKey) {\n console.warn(\n \"useMapsLibrary: ignoring attempt to re-initialize Google Maps with a different API key than the one already in use.\"\n )\n }\n\n return initPromise\n}\n\nconst loadLibrary = <T extends GoogleMapsLibraryName>(\n library: T,\n apiKey?: string\n) => {\n const cacheKey = String(library)\n const cached = libraryPromises.get(cacheKey)\n if (cached) {\n return cached as Promise<GoogleMapsLibraryModule<T>>\n }\n\n const promise = ensureGoogle(apiKey)\n .then(() => {\n if (typeof window === \"undefined\" || !window.google?.maps?.importLibrary) {\n throw new Error(\"useMapsLibrary: google.maps.importLibrary is not available.\")\n }\n return window.google.maps.importLibrary(cacheKey)\n })\n .then(module => module as GoogleMapsLibraryModule<T>)\n .catch(error => {\n libraryPromises.delete(cacheKey)\n throw error\n })\n\n libraryPromises.set(cacheKey, promise as Promise<unknown>)\n return promise\n}\n\nexport const useMapsLibrary = <T extends GoogleMapsLibraryName>(\n library: T,\n apiKey?: string\n) => {\n const [module, setModule] =\n useState<GoogleMapsLibraryModule<T> | null>(null)\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n let cancelled = false\n\n loadLibrary(library, apiKey)\n .then(loadedModule => {\n if (!cancelled) {\n setModule(loadedModule)\n }\n })\n .catch(error => {\n if (!cancelled) {\n console.error(`useMapsLibrary: failed to load ${String(library)} library`, error)\n setModule(null)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [library, apiKey])\n\n return module\n}\n\nexport type { GoogleMapsLibraryName, GoogleMapsLibraryModule }\n"],"names":["initPromise","configuredKey","libraryPromises","Map","ensureGoogle","apiKey","error","Error","console","message","Promise","reject","warn","setOptions","key","v","importLibrary","then","catch","loadLibrary","library","cacheKey","String","cached","get","promise","window","google","maps","module","delete","set","useMapsLibrary","$","_c","setModule","useState","t0","t1","cancelled","loadedModule","useEffect"],"mappings":";;;AAqCA,IAAIA,IAAoC,MACpCC,IAA+B;AAEnC,MAAMC,wBAAsBC,IAAAA,GAEtBC,IAAeA,CAACC,MAAoB;AACxC,MAAI,CAACA,GAAQ;AACX,UAAMC,IAAQ,IAAIC,MAAM,6CAA6C;AACrEC,mBAAQF,MAAMA,EAAMG,OAAO,GACpBC,QAAQC,OAAOL,CAAK;AAAA,EAC7B;AAEA,SAAKN,IAYMC,MAAkBI,KAC3BG,QAAQI,KACN,qHACF,KAdAX,IAAgBI,GAChBQ,EAAW;AAAA,IACTC,KAAKT;AAAAA,IACLU,GAAG;AAAA,EAAA,CACJ,GACDf,IAAcgB,EAAc,MAAM,EAC/BC,KAAK,MAAM;AAAA,EAAC,CAAC,EACbC,MAAMZ,CAAAA,MAAS;AACdN,UAAAA,IAAc,MACRM;AAAAA,EACR,CAAC,IAOEN;AACT,GAEMmB,IAAc,CAClBC,GACAf,MACG;AACH,QAAMgB,IAAWC,OAAOF,CAAO,GACzBG,IAASrB,EAAgBsB,IAAIH,CAAQ;AAC3C,MAAIE;AACF,WAAOA;AAGT,QAAME,IAAUrB,EAAaC,CAAM,EAChCY,KAAK,MAAM;AACV,QAAI,OAAOS,SAAW,OAAe,CAACA,OAAOC,QAAQC,MAAMZ;AACzD,YAAM,IAAIT,MAAM,6DAA6D;AAE/E,WAAOmB,OAAOC,OAAOC,KAAKZ,cAAcK,CAAQ;AAAA,EAClD,CAAC,EACAJ,KAAKY,OAAUA,CAAoC,EACnDX,MAAMZ,CAAAA,MAAS;AACdJ,UAAAA,EAAgB4B,OAAOT,CAAQ,GACzBf;AAAAA,EACR,CAAC;AAEHJ,SAAAA,EAAgB6B,IAAIV,GAAUI,CAA2B,GAClDA;AACT,GAEaO,IAAiBA,CAAAZ,GAAAf,MAAA;AAAA,QAAA4B,IAAAC,EAAAA,EAAA,CAAA,GAI5B,CAAAL,GAAAM,CAAA,IACEC,EAA4C,IAAI;AAAC,MAAAC,GAAAC;AAAA,SAAAL,EAAA,CAAA,MAAA5B,KAAA4B,SAAAb,KAEzCiB,IAAAA,MAAA;AACR,QAAI,OAAOX,SAAW;AAAW;AAIjC,QAAAa,IAAgB;AAEhBpB,WAAAA,EAAYC,GAASf,CAAM,EAACY,KACpBuB,CAAAA,MAAA;AACJ,MAAKD,KACHJ,EAAUK,CAAY;AAAA,IACvB,CACF,EAACtB,MACKZ,CAAAA,MAAA;AACL,MAAKiC,MACH/B,QAAOF,MAAO,kCAAkCgB,OAAOF,CAAO,CAAC,YAAYd,CAAK,GAChF6B,EAAU,IAAI;AAAA,IACf,CACF,GAEI,MAAA;AACLI,MAAAA,IAAYA;AAAAA,IAAH;AAAA,EACV,GACAD,IAAA,CAAClB,GAASf,CAAM,GAAC4B,OAAA5B,GAAA4B,OAAAb,GAAAa,OAAAI,GAAAJ,OAAAK,MAAAD,IAAAJ,EAAA,CAAA,GAAAK,IAAAL,EAAA,CAAA,IAvBpBQ,EAAUJ,GAuBPC,CAAiB,GAEbT;AAAM;"}
1
+ {"version":3,"file":"index22.js","sources":["../src/helpers/useMapsLibrary.ts"],"sourcesContent":["/// <reference types=\"google.maps\" />\n\nimport { useEffect, useState } from \"react\"\nimport { setOptions, importLibrary } from \"@googlemaps/js-api-loader\"\n\n\ntype GoogleMapsLibraryName =\n | \"core\"\n | \"maps\"\n | \"maps3d\"\n | \"routes\"\n | \"geometry\"\n | \"elevation\"\n | \"streetView\"\n | \"journeySharing\"\n | \"drawing\"\n | \"visualization\"\n | \"marker\"\n | \"places\"\n | \"geocoding\"\n | (string & {})\n\ntype GoogleMapsLibraryModule<T extends GoogleMapsLibraryName> =\n T extends \"core\" ? google.maps.CoreLibrary\n : T extends \"maps\" ? google.maps.MapsLibrary\n : T extends \"maps3d\" ? google.maps.Maps3DLibrary\n : T extends \"routes\" ? google.maps.RoutesLibrary\n : T extends \"geometry\" ? google.maps.GeometryLibrary\n : T extends \"elevation\" ? google.maps.ElevationLibrary\n : T extends \"streetView\" ? google.maps.StreetViewLibrary\n : T extends \"journeySharing\" ? google.maps.JourneySharingLibrary\n : T extends \"drawing\" ? google.maps.DrawingLibrary\n : T extends \"visualization\" ? google.maps.VisualizationLibrary\n : T extends \"marker\" ? google.maps.MarkerLibrary\n : T extends \"places\" ? google.maps.PlacesLibrary\n : T extends \"geocoding\" ? google.maps.GeocodingLibrary\n : unknown\n\n\nlet initPromise: Promise<void> | null = null\nlet configuredKey: string | null = null\n\nconst libraryPromises = new Map<string, Promise<unknown>>()\n\nconst ensureGoogle = (apiKey?: string) => {\n if (!apiKey) {\n const error = new Error(\"useMapsLibrary: missing Google Maps API key\")\n console.error(error.message)\n return Promise.reject(error)\n }\n\n if (!initPromise) {\n configuredKey = apiKey\n setOptions({\n key: apiKey,\n v: \"weekly\",\n })\n initPromise = importLibrary(\"core\")\n .then(() => {})\n .catch(error => {\n initPromise = null\n throw error\n })\n } else if (configuredKey !== apiKey) {\n console.warn(\n \"useMapsLibrary: ignoring attempt to re-initialize Google Maps with a different API key than the one already in use.\"\n )\n }\n\n return initPromise\n}\n\nconst loadLibrary = <T extends GoogleMapsLibraryName>(\n library: T,\n apiKey?: string\n) => {\n const cacheKey = String(library)\n const cached = libraryPromises.get(cacheKey)\n if (cached) {\n return cached as Promise<GoogleMapsLibraryModule<T>>\n }\n\n const promise = ensureGoogle(apiKey)\n .then(() => {\n if (typeof window === \"undefined\" || !window.google?.maps?.importLibrary) {\n throw new Error(\"useMapsLibrary: google.maps.importLibrary is not available.\")\n }\n return window.google.maps.importLibrary(cacheKey)\n })\n .then(module => module as GoogleMapsLibraryModule<T>)\n .catch(error => {\n libraryPromises.delete(cacheKey)\n throw error\n })\n\n libraryPromises.set(cacheKey, promise as Promise<unknown>)\n return promise\n}\n\nexport const useMapsLibrary = <T extends GoogleMapsLibraryName>(\n library: T,\n apiKey?: string\n) => {\n const [module, setModule] =\n useState<GoogleMapsLibraryModule<T> | null>(null)\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return\n }\n\n let cancelled = false\n\n loadLibrary(library, apiKey)\n .then(loadedModule => {\n if (!cancelled) {\n setModule(loadedModule)\n }\n })\n .catch(error => {\n if (!cancelled) {\n console.error(`useMapsLibrary: failed to load ${String(library)} library`, error)\n setModule(null)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [library, apiKey])\n\n return module\n}\n\nexport type { GoogleMapsLibraryName, GoogleMapsLibraryModule }\n"],"names":["initPromise","configuredKey","libraryPromises","Map","ensureGoogle","apiKey","error","Error","console","message","Promise","reject","warn","setOptions","key","v","importLibrary","then","catch","loadLibrary","library","cacheKey","String","cached","get","promise","window","google","maps","module","delete","set","useMapsLibrary","$","_c","setModule","useState","t0","t1","cancelled","loadedModule","useEffect"],"mappings":";;;AAuCA,IAAIA,IAAoC,MACpCC,IAA+B;AAEnC,MAAMC,wBAAsBC,IAAAA,GAEtBC,IAAeA,CAACC,MAAoB;AACxC,MAAI,CAACA,GAAQ;AACX,UAAMC,IAAQ,IAAIC,MAAM,6CAA6C;AACrEC,mBAAQF,MAAMA,EAAMG,OAAO,GACpBC,QAAQC,OAAOL,CAAK;AAAA,EAC7B;AAEA,SAAKN,IAYMC,MAAkBI,KAC3BG,QAAQI,KACN,qHACF,KAdAX,IAAgBI,GAChBQ,EAAW;AAAA,IACTC,KAAKT;AAAAA,IACLU,GAAG;AAAA,EAAA,CACJ,GACDf,IAAcgB,EAAc,MAAM,EAC/BC,KAAK,MAAM;AAAA,EAAC,CAAC,EACbC,MAAMZ,CAAAA,MAAS;AACdN,UAAAA,IAAc,MACRM;AAAAA,EACR,CAAC,IAOEN;AACT,GAEMmB,IAAc,CAClBC,GACAf,MACG;AACH,QAAMgB,IAAWC,OAAOF,CAAO,GACzBG,IAASrB,EAAgBsB,IAAIH,CAAQ;AAC3C,MAAIE;AACF,WAAOA;AAGT,QAAME,IAAUrB,EAAaC,CAAM,EAChCY,KAAK,MAAM;AACV,QAAI,OAAOS,SAAW,OAAe,CAACA,OAAOC,QAAQC,MAAMZ;AACzD,YAAM,IAAIT,MAAM,6DAA6D;AAE/E,WAAOmB,OAAOC,OAAOC,KAAKZ,cAAcK,CAAQ;AAAA,EAClD,CAAC,EACAJ,KAAKY,OAAUA,CAAoC,EACnDX,MAAMZ,CAAAA,MAAS;AACdJ,UAAAA,EAAgB4B,OAAOT,CAAQ,GACzBf;AAAAA,EACR,CAAC;AAEHJ,SAAAA,EAAgB6B,IAAIV,GAAUI,CAA2B,GAClDA;AACT,GAEaO,IAAiBA,CAAAZ,GAAAf,MAAA;AAAA,QAAA4B,IAAAC,EAAAA,EAAA,CAAA,GAI5B,CAAAL,GAAAM,CAAA,IACEC,EAA4C,IAAI;AAAC,MAAAC,GAAAC;AAAA,SAAAL,EAAA,CAAA,MAAA5B,KAAA4B,SAAAb,KAEzCiB,IAAAA,MAAA;AACR,QAAI,OAAOX,SAAW;AAAW;AAIjC,QAAAa,IAAgB;AAEhBpB,WAAAA,EAAYC,GAASf,CAAM,EAACY,KACpBuB,CAAAA,MAAA;AACJ,MAAKD,KACHJ,EAAUK,CAAY;AAAA,IACvB,CACF,EAACtB,MACKZ,CAAAA,MAAA;AACL,MAAKiC,MACH/B,QAAOF,MAAO,kCAAkCgB,OAAOF,CAAO,CAAC,YAAYd,CAAK,GAChF6B,EAAU,IAAI;AAAA,IACf,CACF,GAEI,MAAA;AACLI,MAAAA,IAAYA;AAAAA,IAAH;AAAA,EACV,GACAD,IAAA,CAAClB,GAASf,CAAM,GAAC4B,OAAA5B,GAAA4B,OAAAb,GAAAa,OAAAI,GAAAJ,OAAAK,MAAAD,IAAAJ,EAAA,CAAA,GAAAK,IAAAL,EAAA,CAAA,IAvBpBQ,EAAUJ,GAuBPC,CAAiB,GAEbT;AAAM;"}
package/dist/index256.js CHANGED
@@ -1,23 +1,17 @@
1
- const i = {
2
- clipPath: "inset(50%)",
3
- overflow: "hidden",
4
- whiteSpace: "nowrap",
5
- border: 0,
6
- padding: 0,
7
- width: 1,
8
- height: 1,
9
- margin: -1
10
- }, e = {
11
- ...i,
12
- position: "fixed",
13
- top: 0,
14
- left: 0
15
- }, t = {
16
- ...i,
17
- position: "absolute"
18
- };
1
+ import h from "./index164.js";
2
+ function L(i, r, u) {
3
+ return s(i, r, void 0, u);
4
+ }
5
+ function s(i, r, u, e) {
6
+ r && (e = new h(e.metadata), e.selectNumberingPlan(r));
7
+ var f = e.type(u), n = f && f.possibleLengths() || e.possibleLengths();
8
+ if (!n)
9
+ return "IS_POSSIBLE";
10
+ var t = i.length, l = n[0];
11
+ return l === t ? "IS_POSSIBLE" : l > t ? "TOO_SHORT" : n[n.length - 1] < t ? "TOO_LONG" : n.indexOf(t, 1) >= 0 ? "IS_POSSIBLE" : "INVALID_LENGTH";
12
+ }
19
13
  export {
20
- e as visuallyHidden,
21
- t as visuallyHiddenInput
14
+ s as checkNumberLengthForType,
15
+ L as default
22
16
  };
23
17
  //# sourceMappingURL=index256.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index256.js","sources":["../../../node_modules/@base-ui/utils/esm/visuallyHidden.js"],"sourcesContent":["const visuallyHiddenBase = {\n clipPath: 'inset(50%)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n border: 0,\n padding: 0,\n width: 1,\n height: 1,\n margin: -1\n};\nexport const visuallyHidden = {\n ...visuallyHiddenBase,\n position: 'fixed',\n top: 0,\n left: 0\n};\nexport const visuallyHiddenInput = {\n ...visuallyHiddenBase,\n position: 'absolute'\n};"],"names":["visuallyHiddenBase","visuallyHidden","visuallyHiddenInput"],"mappings":"AAAA,MAAMA,IAAqB;AAAA,EACzB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV,GACaC,IAAiB;AAAA,EAC5B,GAAGD;AAAA,EACH,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AACR,GACaE,IAAsB;AAAA,EACjC,GAAGF;AAAA,EACH,UAAU;AACZ;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index256.js","sources":["../../../node_modules/libphonenumber-js/es6/helpers/checkNumberLength.js"],"sourcesContent":["import Metadata from '../metadata.js';\nimport mergeArrays from './mergeArrays.js';\nexport default function checkNumberLength(nationalNumber, country, metadata) {\n return checkNumberLengthForType(nationalNumber, country, undefined, metadata);\n}\n\n// Checks whether a number is possible for a certain `country` based on the number length.\n//\n// This function is not supported by metadata generated with ancient versions of\n// `libphonenumber-js` (before version `1.0.18`) which didn't include \"possible lengths\".\n//\n// There was also a known issue with `checkNumberLength()` function:\n// if a number is possible only in a certain `country` among several `countries`\n// that share the same \"country calling code\", that function would check\n// the possibility of the phone number only in the \"main\" `country` for the \"country calling code\"\n// and would not check if it's actually be possible in the speciifc `country`.\n//\n// For example, \"+1310xxxx\" numbers are valid in Canada.\n// However, they are not possible in the US due to being too short.\n// Since Canada and the US share the same country calling code — \"+1\" —\n// `checkNumberLength()` function used to return not \"IS_POSSIBLE\" for \"+1310xxxx\" numbers.\n//\n// In such cases, when using \"/max\" metadata, `isValid()` could output `true`\n// but at the same time `isPossible()` could output `false`, which was contradictory.\n//\n// See https://issuetracker.google.com/issues/335892662 for the discusson in Google's issues.\n//\n// The solution suggested by Google was implemented: an optional `country` argument\n// was added to `checkNumberLength()` function. If present, that `country` will be used\n// to check phone number length for that specific `country` rather than the \"main\" country\n// for the shared \"country calling code\".\n//\nexport function checkNumberLengthForType(nationalNumber, country, type, metadata) {\n // If the exact `country` is specified, it's no necessarily already selected in `metadata`.\n // Most likely, in cases when there're multiple countries corresponding to the same\n // \"country calling code\", the \"main\" country for that \"country calling code\" will be selected.\n if (country) {\n metadata = new Metadata(metadata.metadata);\n metadata.selectNumberingPlan(country);\n }\n var type_info = metadata.type(type);\n\n // There should always be \"<possiblePengths/>\" set for every type element.\n // This is declared in the XML schema.\n // For size efficiency, where a sub-description (e.g. fixed-line)\n // has the same \"<possiblePengths/>\" as the \"general description\", this is missing,\n // so we fall back to the \"general description\". Where no numbers of the type\n // exist at all, there is one possible length (-1) which is guaranteed\n // not to match the length of any real phone number.\n var possible_lengths = type_info && type_info.possibleLengths() || metadata.possibleLengths();\n // let local_lengths = type_info && type.possibleLengthsLocal() || metadata.possibleLengthsLocal()\n\n // Metadata before version `1.0.18` didn't contain `possible_lengths`.\n if (!possible_lengths) {\n return 'IS_POSSIBLE';\n }\n if (type === 'FIXED_LINE_OR_MOBILE') {\n // No such country in metadata.\n /* istanbul ignore next */\n if (!metadata.type('FIXED_LINE')) {\n // The rare case has been encountered where no fixedLine data is available\n // (true for some non-geographic entities), so we just check mobile.\n return checkNumberLengthForType(nationalNumber, country, 'MOBILE', metadata);\n }\n var mobile_type = metadata.type('MOBILE');\n if (mobile_type) {\n // Merge the mobile data in if there was any. \"Concat\" creates a new\n // array, it doesn't edit possible_lengths in place, so we don't need a copy.\n // Note that when adding the possible lengths from mobile, we have\n // to again check they aren't empty since if they are this indicates\n // they are the same as the general desc and should be obtained from there.\n possible_lengths = mergeArrays(possible_lengths, mobile_type.possibleLengths());\n // The current list is sorted; we need to merge in the new list and\n // re-sort (duplicates are okay). Sorting isn't so expensive because\n // the lists are very small.\n\n // if (local_lengths) {\n // \tlocal_lengths = mergeArrays(local_lengths, mobile_type.possibleLengthsLocal())\n // } else {\n // \tlocal_lengths = mobile_type.possibleLengthsLocal()\n // }\n }\n }\n // If the type doesn't exist then return 'INVALID_LENGTH'.\n else if (type && !type_info) {\n return 'INVALID_LENGTH';\n }\n var actual_length = nationalNumber.length;\n\n // In `libphonenumber-js` all \"local-only\" formats are dropped for simplicity.\n // // This is safe because there is never an overlap beween the possible lengths\n // // and the local-only lengths; this is checked at build time.\n // if (local_lengths && local_lengths.indexOf(nationalNumber.length) >= 0)\n // {\n // \treturn 'IS_POSSIBLE_LOCAL_ONLY'\n // }\n\n var minimum_length = possible_lengths[0];\n if (minimum_length === actual_length) {\n return 'IS_POSSIBLE';\n }\n if (minimum_length > actual_length) {\n return 'TOO_SHORT';\n }\n if (possible_lengths[possible_lengths.length - 1] < actual_length) {\n return 'TOO_LONG';\n }\n\n // We skip the first element since we've already checked it.\n return possible_lengths.indexOf(actual_length, 1) >= 0 ? 'IS_POSSIBLE' : 'INVALID_LENGTH';\n}\n//# sourceMappingURL=checkNumberLength.js.map"],"names":["checkNumberLength","nationalNumber","country","metadata","checkNumberLengthForType","type","Metadata","type_info","possible_lengths","actual_length","minimum_length"],"mappings":";AAEe,SAASA,EAAkBC,GAAgBC,GAASC,GAAU;AAC3E,SAAOC,EAAyBH,GAAgBC,GAAS,QAAWC,CAAQ;AAC9E;AA4BO,SAASC,EAAyBH,GAAgBC,GAASG,GAAMF,GAAU;AAIhF,EAAID,MACFC,IAAW,IAAIG,EAASH,EAAS,QAAQ,GACzCA,EAAS,oBAAoBD,CAAO;AAEtC,MAAIK,IAAYJ,EAAS,KAAKE,CAAI,GAS9BG,IAAmBD,KAAaA,EAAU,gBAAe,KAAMJ,EAAS,gBAAe;AAI3F,MAAI,CAACK;AACH,WAAO;AAiCT,MAAIC,IAAgBR,EAAe,QAU/BS,IAAiBF,EAAiB,CAAC;AACvC,SAAIE,MAAmBD,IACd,gBAELC,IAAiBD,IACZ,cAELD,EAAiBA,EAAiB,SAAS,CAAC,IAAIC,IAC3C,aAIFD,EAAiB,QAAQC,GAAe,CAAC,KAAK,IAAI,gBAAgB;AAC3E;","x_google_ignoreList":[0]}