@rpcbase/ui 0.237.0 → 0.238.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.
- package/dist/components/Notifications/NotificationsDrawer.d.ts.map +1 -1
- package/dist/index121.js +10 -10
- package/dist/index123.js +2 -2
- package/dist/index124.js +3 -3
- package/dist/index16.js +228 -196
- package/dist/index16.js.map +1 -1
- package/dist/index185.js +1 -1
- package/dist/index189.js +3 -3
- package/dist/index190.js +4 -4
- package/dist/index237.js +27 -14
- package/dist/index237.js.map +1 -1
- package/dist/index238.js +12 -7
- package/dist/index238.js.map +1 -1
- package/dist/index239.js +24 -9
- package/dist/index239.js.map +1 -1
- package/dist/index240.js +5 -10
- package/dist/index240.js.map +1 -1
- package/dist/index241.js +15 -20
- package/dist/index241.js.map +1 -1
- package/dist/index242.js +7 -10
- package/dist/index242.js.map +1 -1
- package/dist/index243.js +10 -9
- package/dist/index243.js.map +1 -1
- package/dist/index244.js +10 -9
- package/dist/index244.js.map +1 -1
- package/dist/index245.js +21 -4
- package/dist/index245.js.map +1 -1
- package/dist/index246.js +10 -5
- package/dist/index246.js.map +1 -1
- package/dist/index247.js +9 -16
- package/dist/index247.js.map +1 -1
- package/dist/index248.js +8 -8
- package/dist/index248.js.map +1 -1
- package/dist/index249.js +4 -18
- package/dist/index249.js.map +1 -1
- package/dist/index250.js +5 -15
- package/dist/index250.js.map +1 -1
- package/dist/index251.js +16 -12
- package/dist/index251.js.map +1 -1
- package/dist/index252.js +9 -29
- package/dist/index252.js.map +1 -1
- package/dist/index253.js +18 -12
- package/dist/index253.js.map +1 -1
- package/dist/index254.js +15 -25
- package/dist/index254.js.map +1 -1
- package/dist/index255.js +12 -5
- package/dist/index255.js.map +1 -1
- package/dist/index270.js +1 -1
- package/dist/index272.js +1 -1
- package/dist/index275.js +1 -1
- package/dist/index277.js +1 -1
- package/dist/index278.js +1 -1
- package/dist/index285.js +1 -1
- package/dist/index287.js +1 -1
- package/dist/index298.js +1 -1
- package/dist/index302.js +1 -1
- package/dist/index339.js +1 -1
- package/dist/index347.js +122 -5
- package/dist/index347.js.map +1 -1
- package/dist/index348.js +31 -121
- package/dist/index348.js.map +1 -1
- package/dist/index349.js +72 -31
- package/dist/index349.js.map +1 -1
- package/dist/index350.js +139 -70
- package/dist/index350.js.map +1 -1
- package/dist/index351.js +35 -116
- package/dist/index351.js.map +1 -1
- package/dist/index352.js +44 -56
- package/dist/index352.js.map +1 -1
- package/dist/index353.js +14 -49
- package/dist/index353.js.map +1 -1
- package/dist/index354.js +6 -15
- package/dist/index354.js.map +1 -1
- package/dist/index362.js +12 -4
- package/dist/index362.js.map +1 -1
- package/dist/index363.js +16 -11
- package/dist/index363.js.map +1 -1
- package/dist/index364.js +5 -16
- package/dist/index364.js.map +1 -1
- package/dist/index365.js +4 -6
- package/dist/index365.js.map +1 -1
- package/dist/index384.js +2 -2
- package/dist/index386.js +1 -1
- package/dist/index44.js +1 -1
- package/dist/index45.js +2 -2
- package/dist/index70.js +1 -1
- package/dist/index71.js +1 -1
- package/dist/index74.js +2 -6
- package/dist/index74.js.map +1 -1
- package/dist/index75.js +2 -8
- package/dist/index75.js.map +1 -1
- package/dist/index76.js +5 -5
- package/dist/index76.js.map +1 -1
- package/dist/index77.js +8 -2
- package/dist/index77.js.map +1 -1
- package/dist/index78.js +6 -2
- package/dist/index78.js.map +1 -1
- package/package.json +1 -1
package/dist/index16.js.map
CHANGED
|
@@ -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":"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"}
|
|
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/index185.js
CHANGED
package/dist/index189.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as t from "react";
|
|
2
|
-
import { useScrollLock as v } from "./
|
|
2
|
+
import { useScrollLock as v } from "./index347.js";
|
|
3
3
|
import { useOpenInteractionType as I } from "./index275.js";
|
|
4
4
|
import { createChangeEventDetails as A } from "./index175.js";
|
|
5
5
|
import { useImplicitActiveTrigger as M, useOpenStateTransitions as B } from "./index193.js";
|
|
6
|
-
import { useSyncedFloatingRootContext as F } from "./
|
|
7
|
-
import { useRole as H } from "./
|
|
6
|
+
import { useSyncedFloatingRootContext as F } from "./index348.js";
|
|
7
|
+
import { useRole as H } from "./index349.js";
|
|
8
8
|
import { useDismiss as K } from "./index279.js";
|
|
9
9
|
import { useInteractions as L } from "./index195.js";
|
|
10
10
|
import { getTarget as U, contains as V } from "./index291.js";
|
package/dist/index190.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i from "react";
|
|
2
2
|
import { useRefWithInit as d } from "./index258.js";
|
|
3
|
-
import { ReactStore as a } from "./
|
|
4
|
-
import { PopupTriggerMap as p } from "./
|
|
5
|
-
import { popupStoreSelectors as u, createInitialPopupStoreState as c } from "./
|
|
6
|
-
import { createSelector as n } from "./
|
|
3
|
+
import { ReactStore as a } from "./index350.js";
|
|
4
|
+
import { PopupTriggerMap as p } from "./index351.js";
|
|
5
|
+
import { popupStoreSelectors as u, createInitialPopupStoreState as c } from "./index352.js";
|
|
6
|
+
import { createSelector as n } from "./index353.js";
|
|
7
7
|
const m = {
|
|
8
8
|
...u,
|
|
9
9
|
modal: n((e) => e.modal),
|
package/dist/index237.js
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { defaultDateLib as D } from "./index106.js";
|
|
2
|
+
function w(f, g, n = 0, s = 0, l = !1, u = D) {
|
|
3
|
+
const { from: o, to: i } = g || {}, { isSameDay: r, isAfter: m, isBefore: c } = u;
|
|
4
|
+
let e;
|
|
5
|
+
if (!o && !i)
|
|
6
|
+
e = { from: f, to: n > 0 ? void 0 : f };
|
|
7
|
+
else if (o && !i)
|
|
8
|
+
r(o, f) ? n === 0 ? e = { from: o, to: f } : l ? e = { from: o, to: void 0 } : e = void 0 : c(f, o) ? e = { from: f, to: o } : e = { from: o, to: f };
|
|
9
|
+
else if (o && i)
|
|
10
|
+
if (r(o, f) && r(i, f))
|
|
11
|
+
l ? e = { from: o, to: i } : e = void 0;
|
|
12
|
+
else if (r(o, f))
|
|
13
|
+
e = { from: o, to: n > 0 ? void 0 : f };
|
|
14
|
+
else if (r(i, f))
|
|
15
|
+
e = { from: f, to: n > 0 ? void 0 : f };
|
|
16
|
+
else if (c(f, o))
|
|
17
|
+
e = { from: f, to: i };
|
|
18
|
+
else if (m(f, o))
|
|
19
|
+
e = { from: o, to: f };
|
|
20
|
+
else if (m(f, i))
|
|
21
|
+
e = { from: o, to: f };
|
|
22
|
+
else
|
|
23
|
+
throw new Error("Invalid range");
|
|
24
|
+
if (e?.from && e?.to) {
|
|
25
|
+
const t = u.differenceInCalendarDays(e.to, e.from);
|
|
26
|
+
s > 0 && t > s ? e = { from: f, to: void 0 } : n > 1 && t < n && (e = { from: f, to: void 0 });
|
|
14
27
|
}
|
|
15
28
|
return e;
|
|
16
29
|
}
|
|
17
30
|
export {
|
|
18
|
-
|
|
31
|
+
w as addToRange
|
|
19
32
|
};
|
|
20
33
|
//# sourceMappingURL=index237.js.map
|
package/dist/index237.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index237.js","sources":["../../../node_modules/react-day-picker/dist/esm/
|
|
1
|
+
{"version":3,"file":"index237.js","sources":["../../../node_modules/react-day-picker/dist/esm/utils/addToRange.js"],"sourcesContent":["import { defaultDateLib } from \"../classes/DateLib.js\";\n/**\n * Adds a date to an existing range, considering constraints like minimum and\n * maximum range size.\n *\n * @param date - The date to add to the range.\n * @param initialRange - The initial range to which the date will be added.\n * @param min - The minimum number of days in the range.\n * @param max - The maximum number of days in the range.\n * @param required - Whether the range must always include at least one date.\n * @param dateLib - The date utility library instance.\n * @returns The updated date range, or `undefined` if the range is cleared.\n * @group Utilities\n */\nexport function addToRange(date, initialRange, min = 0, max = 0, required = false, dateLib = defaultDateLib) {\n const { from, to } = initialRange || {};\n const { isSameDay, isAfter, isBefore } = dateLib;\n let range;\n if (!from && !to) {\n // the range is empty, add the date\n range = { from: date, to: min > 0 ? undefined : date };\n }\n else if (from && !to) {\n // adding date to an incomplete range\n if (isSameDay(from, date)) {\n // adding a date equal to the start of the range\n if (min === 0) {\n range = { from, to: date };\n }\n else if (required) {\n range = { from, to: undefined };\n }\n else {\n range = undefined;\n }\n }\n else if (isBefore(date, from)) {\n // adding a date before the start of the range\n range = { from: date, to: from };\n }\n else {\n // adding a date after the start of the range\n range = { from, to: date };\n }\n }\n else if (from && to) {\n // adding date to a complete range\n if (isSameDay(from, date) && isSameDay(to, date)) {\n // adding a date that is equal to both start and end of the range\n if (required) {\n range = { from, to };\n }\n else {\n range = undefined;\n }\n }\n else if (isSameDay(from, date)) {\n // adding a date equal to the the start of the range\n range = { from, to: min > 0 ? undefined : date };\n }\n else if (isSameDay(to, date)) {\n // adding a dare equal to the end of the range\n range = { from: date, to: min > 0 ? undefined : date };\n }\n else if (isBefore(date, from)) {\n // adding a date before the start of the range\n range = { from: date, to: to };\n }\n else if (isAfter(date, from)) {\n // adding a date after the start of the range\n range = { from, to: date };\n }\n else if (isAfter(date, to)) {\n // adding a date after the end of the range\n range = { from, to: date };\n }\n else {\n throw new Error(\"Invalid range\");\n }\n }\n // check for min / max\n if (range?.from && range?.to) {\n const diff = dateLib.differenceInCalendarDays(range.to, range.from);\n if (max > 0 && diff > max) {\n range = { from: date, to: undefined };\n }\n else if (min > 1 && diff < min) {\n range = { from: date, to: undefined };\n }\n }\n return range;\n}\n"],"names":["addToRange","date","initialRange","min","max","required","dateLib","defaultDateLib","from","to","isSameDay","isAfter","isBefore","range","diff"],"mappings":";AAcO,SAASA,EAAWC,GAAMC,GAAcC,IAAM,GAAGC,IAAM,GAAGC,IAAW,IAAOC,IAAUC,GAAgB;AACzG,QAAM,EAAE,MAAAC,GAAM,IAAAC,EAAE,IAAKP,KAAgB,CAAA,GAC/B,EAAE,WAAAQ,GAAW,SAAAC,GAAS,UAAAC,EAAQ,IAAKN;AACzC,MAAIO;AACJ,MAAI,CAACL,KAAQ,CAACC;AAEV,IAAAI,IAAQ,EAAE,MAAMZ,GAAM,IAAIE,IAAM,IAAI,SAAYF,EAAI;AAAA,WAE/CO,KAAQ,CAACC;AAEd,IAAIC,EAAUF,GAAMP,CAAI,IAEhBE,MAAQ,IACRU,IAAQ,EAAE,MAAAL,GAAM,IAAIP,EAAI,IAEnBI,IACLQ,IAAQ,EAAE,MAAAL,GAAM,IAAI,OAAS,IAG7BK,IAAQ,SAGPD,EAASX,GAAMO,CAAI,IAExBK,IAAQ,EAAE,MAAMZ,GAAM,IAAIO,EAAI,IAI9BK,IAAQ,EAAE,MAAAL,GAAM,IAAIP,EAAI;AAAA,WAGvBO,KAAQC;AAEb,QAAIC,EAAUF,GAAMP,CAAI,KAAKS,EAAUD,GAAIR,CAAI;AAE3C,MAAII,IACAQ,IAAQ,EAAE,MAAAL,GAAM,IAAAC,EAAE,IAGlBI,IAAQ;AAAA,aAGPH,EAAUF,GAAMP,CAAI;AAEzB,MAAAY,IAAQ,EAAE,MAAAL,GAAM,IAAIL,IAAM,IAAI,SAAYF,EAAI;AAAA,aAEzCS,EAAUD,GAAIR,CAAI;AAEvB,MAAAY,IAAQ,EAAE,MAAMZ,GAAM,IAAIE,IAAM,IAAI,SAAYF,EAAI;AAAA,aAE/CW,EAASX,GAAMO,CAAI;AAExB,MAAAK,IAAQ,EAAE,MAAMZ,GAAM,IAAIQ,EAAE;AAAA,aAEvBE,EAAQV,GAAMO,CAAI;AAEvB,MAAAK,IAAQ,EAAE,MAAAL,GAAM,IAAIP,EAAI;AAAA,aAEnBU,EAAQV,GAAMQ,CAAE;AAErB,MAAAI,IAAQ,EAAE,MAAAL,GAAM,IAAIP,EAAI;AAAA;AAGxB,YAAM,IAAI,MAAM,eAAe;AAIvC,MAAIY,GAAO,QAAQA,GAAO,IAAI;AAC1B,UAAMC,IAAOR,EAAQ,yBAAyBO,EAAM,IAAIA,EAAM,IAAI;AAClE,IAAIT,IAAM,KAAKU,IAAOV,IAClBS,IAAQ,EAAE,MAAMZ,GAAM,IAAI,OAAS,IAE9BE,IAAM,KAAKW,IAAOX,MACvBU,IAAQ,EAAE,MAAMZ,GAAM,IAAI,OAAS;AAAA,EAE3C;AACA,SAAOY;AACX;","x_google_ignoreList":[0]}
|
package/dist/index238.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { defaultDateLib as f } from "./index106.js";
|
|
2
|
+
function y(t, r, e = f) {
|
|
3
|
+
const n = Array.isArray(r) ? r : [r];
|
|
4
|
+
let a = t.from;
|
|
5
|
+
const i = e.differenceInCalendarDays(t.to, t.from), s = Math.min(i, 6);
|
|
6
|
+
for (let o = 0; o <= s; o++) {
|
|
7
|
+
if (n.includes(a.getDay()))
|
|
8
|
+
return !0;
|
|
9
|
+
a = e.addDays(a, 1);
|
|
10
|
+
}
|
|
11
|
+
return !1;
|
|
7
12
|
}
|
|
8
13
|
export {
|
|
9
|
-
|
|
14
|
+
y as rangeContainsDayOfWeek
|
|
10
15
|
};
|
|
11
16
|
//# sourceMappingURL=index238.js.map
|
package/dist/index238.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index238.js","sources":["../../../node_modules/react-day-picker/dist/esm/
|
|
1
|
+
{"version":3,"file":"index238.js","sources":["../../../node_modules/react-day-picker/dist/esm/utils/rangeContainsDayOfWeek.js"],"sourcesContent":["import { defaultDateLib } from \"../classes/DateLib.js\";\n/**\n * Checks if a date range contains one or more specified days of the week.\n *\n * @since 9.2.2\n * @param range - The date range to check.\n * @param dayOfWeek - The day(s) of the week to check for (`0-6`, where `0` is\n * Sunday).\n * @param dateLib - The date utility library instance.\n * @returns `true` if the range contains the specified day(s) of the week,\n * otherwise `false`.\n * @group Utilities\n */\nexport function rangeContainsDayOfWeek(range, dayOfWeek, dateLib = defaultDateLib) {\n const dayOfWeekArr = !Array.isArray(dayOfWeek) ? [dayOfWeek] : dayOfWeek;\n let date = range.from;\n const totalDays = dateLib.differenceInCalendarDays(range.to, range.from);\n // iterate at maximum one week or the total days if the range is shorter than one week\n const totalDaysLimit = Math.min(totalDays, 6);\n for (let i = 0; i <= totalDaysLimit; i++) {\n if (dayOfWeekArr.includes(date.getDay())) {\n return true;\n }\n date = dateLib.addDays(date, 1);\n }\n return false;\n}\n"],"names":["rangeContainsDayOfWeek","range","dayOfWeek","dateLib","defaultDateLib","dayOfWeekArr","date","totalDays","totalDaysLimit","i"],"mappings":";AAaO,SAASA,EAAuBC,GAAOC,GAAWC,IAAUC,GAAgB;AAC/E,QAAMC,IAAgB,MAAM,QAAQH,CAAS,IAAkBA,IAAd,CAACA,CAAS;AAC3D,MAAII,IAAOL,EAAM;AACjB,QAAMM,IAAYJ,EAAQ,yBAAyBF,EAAM,IAAIA,EAAM,IAAI,GAEjEO,IAAiB,KAAK,IAAID,GAAW,CAAC;AAC5C,WAASE,IAAI,GAAGA,KAAKD,GAAgBC,KAAK;AACtC,QAAIJ,EAAa,SAASC,EAAK,OAAM,CAAE;AACnC,aAAO;AAEX,IAAAA,IAAOH,EAAQ,QAAQG,GAAM,CAAC;AAAA,EAClC;AACA,SAAO;AACX;","x_google_ignoreList":[0]}
|
package/dist/index239.js
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { defaultDateLib as p } from "./index106.js";
|
|
2
|
+
import { dateMatchModifiers as s } from "./index32.js";
|
|
3
|
+
import { rangeContainsDayOfWeek as M } from "./index238.js";
|
|
4
|
+
import { rangeIncludesDate as l } from "./index126.js";
|
|
5
|
+
import { rangeOverlaps as y } from "./index240.js";
|
|
6
|
+
import { isDatesArray as a, isDateRange as A, isDayOfWeekType as C, isDateInterval as I, isDateAfterType as v, isDateBeforeType as F } from "./index128.js";
|
|
7
|
+
function d(n, t, f = p) {
|
|
8
|
+
const e = Array.isArray(t) ? t : [t];
|
|
9
|
+
if (e.filter((o) => typeof o != "function").some((o) => typeof o == "boolean" ? o : f.isDate(o) ? l(n, o, !1, f) : a(o, f) ? o.some((r) => l(n, r, !1, f)) : A(o) ? o.from && o.to ? y(n, { from: o.from, to: o.to }, f) : !1 : C(o) ? M(n, o.dayOfWeek, f) : I(o) ? f.isAfter(o.before, o.after) ? y(n, {
|
|
10
|
+
from: f.addDays(o.after, 1),
|
|
11
|
+
to: f.addDays(o.before, -1)
|
|
12
|
+
}, f) : s(n.from, o, f) || s(n.to, o, f) : v(o) || F(o) ? s(n.from, o, f) || s(n.to, o, f) : !1))
|
|
13
|
+
return !0;
|
|
14
|
+
const i = e.filter((o) => typeof o == "function");
|
|
15
|
+
if (i.length) {
|
|
16
|
+
let o = n.from;
|
|
17
|
+
const r = f.differenceInCalendarDays(n.to, n.from);
|
|
18
|
+
for (let u = 0; u <= r; u++) {
|
|
19
|
+
if (i.some((D) => D(o)))
|
|
20
|
+
return !0;
|
|
21
|
+
o = f.addDays(o, 1);
|
|
22
|
+
}
|
|
8
23
|
}
|
|
9
|
-
return
|
|
24
|
+
return !1;
|
|
10
25
|
}
|
|
11
26
|
export {
|
|
12
|
-
|
|
27
|
+
d as rangeContainsModifiers
|
|
13
28
|
};
|
|
14
29
|
//# sourceMappingURL=index239.js.map
|
package/dist/index239.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index239.js","sources":["../../../node_modules/react-day-picker/dist/esm/
|
|
1
|
+
{"version":3,"file":"index239.js","sources":["../../../node_modules/react-day-picker/dist/esm/utils/rangeContainsModifiers.js"],"sourcesContent":["import { defaultDateLib } from \"../classes/DateLib.js\";\nimport { dateMatchModifiers } from \"./dateMatchModifiers.js\";\nimport { rangeContainsDayOfWeek } from \"./rangeContainsDayOfWeek.js\";\nimport { rangeIncludesDate } from \"./rangeIncludesDate.js\";\nimport { rangeOverlaps } from \"./rangeOverlaps.js\";\nimport { isDateAfterType, isDateBeforeType, isDateInterval, isDateRange, isDatesArray, isDayOfWeekType, } from \"./typeguards.js\";\n/**\n * Checks if a date range contains dates that match the given modifiers.\n *\n * @since 9.2.2\n * @param range - The date range to check.\n * @param modifiers - The modifiers to match against.\n * @param dateLib - The date utility library instance.\n * @returns `true` if the range contains matching dates, otherwise `false`.\n * @group Utilities\n */\nexport function rangeContainsModifiers(range, modifiers, dateLib = defaultDateLib) {\n const matchers = Array.isArray(modifiers) ? modifiers : [modifiers];\n // Defer function matchers evaluation as they are the least performant.\n const nonFunctionMatchers = matchers.filter((matcher) => typeof matcher !== \"function\");\n const nonFunctionMatchersResult = nonFunctionMatchers.some((matcher) => {\n if (typeof matcher === \"boolean\")\n return matcher;\n if (dateLib.isDate(matcher)) {\n return rangeIncludesDate(range, matcher, false, dateLib);\n }\n if (isDatesArray(matcher, dateLib)) {\n return matcher.some((date) => rangeIncludesDate(range, date, false, dateLib));\n }\n if (isDateRange(matcher)) {\n if (matcher.from && matcher.to) {\n return rangeOverlaps(range, { from: matcher.from, to: matcher.to }, dateLib);\n }\n return false;\n }\n if (isDayOfWeekType(matcher)) {\n return rangeContainsDayOfWeek(range, matcher.dayOfWeek, dateLib);\n }\n if (isDateInterval(matcher)) {\n const isClosedInterval = dateLib.isAfter(matcher.before, matcher.after);\n if (isClosedInterval) {\n return rangeOverlaps(range, {\n from: dateLib.addDays(matcher.after, 1),\n to: dateLib.addDays(matcher.before, -1),\n }, dateLib);\n }\n return (dateMatchModifiers(range.from, matcher, dateLib) ||\n dateMatchModifiers(range.to, matcher, dateLib));\n }\n if (isDateAfterType(matcher) || isDateBeforeType(matcher)) {\n return (dateMatchModifiers(range.from, matcher, dateLib) ||\n dateMatchModifiers(range.to, matcher, dateLib));\n }\n return false;\n });\n if (nonFunctionMatchersResult) {\n return true;\n }\n const functionMatchers = matchers.filter((matcher) => typeof matcher === \"function\");\n if (functionMatchers.length) {\n let date = range.from;\n const totalDays = dateLib.differenceInCalendarDays(range.to, range.from);\n for (let i = 0; i <= totalDays; i++) {\n if (functionMatchers.some((matcher) => matcher(date))) {\n return true;\n }\n date = dateLib.addDays(date, 1);\n }\n }\n return false;\n}\n"],"names":["rangeContainsModifiers","range","modifiers","dateLib","defaultDateLib","matchers","matcher","rangeIncludesDate","isDatesArray","date","isDateRange","rangeOverlaps","isDayOfWeekType","rangeContainsDayOfWeek","isDateInterval","dateMatchModifiers","isDateAfterType","isDateBeforeType","functionMatchers","totalDays","i"],"mappings":";;;;;;AAgBO,SAASA,EAAuBC,GAAOC,GAAWC,IAAUC,GAAgB;AAC/E,QAAMC,IAAW,MAAM,QAAQH,CAAS,IAAIA,IAAY,CAACA,CAAS;AAsClE,MApC4BG,EAAS,OAAO,CAACC,MAAY,OAAOA,KAAY,UAAU,EAChC,KAAK,CAACA,MACpD,OAAOA,KAAY,YACZA,IACPH,EAAQ,OAAOG,CAAO,IACfC,EAAkBN,GAAOK,GAAS,IAAOH,CAAO,IAEvDK,EAAaF,GAASH,CAAO,IACtBG,EAAQ,KAAK,CAACG,MAASF,EAAkBN,GAAOQ,GAAM,IAAON,CAAO,CAAC,IAE5EO,EAAYJ,CAAO,IACfA,EAAQ,QAAQA,EAAQ,KACjBK,EAAcV,GAAO,EAAE,MAAMK,EAAQ,MAAM,IAAIA,EAAQ,GAAE,GAAIH,CAAO,IAExE,KAEPS,EAAgBN,CAAO,IAChBO,EAAuBZ,GAAOK,EAAQ,WAAWH,CAAO,IAE/DW,EAAeR,CAAO,IACGH,EAAQ,QAAQG,EAAQ,QAAQA,EAAQ,KAAK,IAE3DK,EAAcV,GAAO;AAAA,IACxB,MAAME,EAAQ,QAAQG,EAAQ,OAAO,CAAC;AAAA,IACtC,IAAIH,EAAQ,QAAQG,EAAQ,QAAQ,EAAE;AAAA,EAC1D,GAAmBH,CAAO,IAENY,EAAmBd,EAAM,MAAMK,GAASH,CAAO,KACnDY,EAAmBd,EAAM,IAAIK,GAASH,CAAO,IAEjDa,EAAgBV,CAAO,KAAKW,EAAiBX,CAAO,IAC5CS,EAAmBd,EAAM,MAAMK,GAASH,CAAO,KACnDY,EAAmBd,EAAM,IAAIK,GAASH,CAAO,IAE9C,EACV;AAEG,WAAO;AAEX,QAAMe,IAAmBb,EAAS,OAAO,CAACC,MAAY,OAAOA,KAAY,UAAU;AACnF,MAAIY,EAAiB,QAAQ;AACzB,QAAIT,IAAOR,EAAM;AACjB,UAAMkB,IAAYhB,EAAQ,yBAAyBF,EAAM,IAAIA,EAAM,IAAI;AACvE,aAASmB,IAAI,GAAGA,KAAKD,GAAWC,KAAK;AACjC,UAAIF,EAAiB,KAAK,CAACZ,MAAYA,EAAQG,CAAI,CAAC;AAChD,eAAO;AAEX,MAAAA,IAAON,EAAQ,QAAQM,GAAM,CAAC;AAAA,IAClC;AAAA,EACJ;AACA,SAAO;AACX;","x_google_ignoreList":[0]}
|
package/dist/index240.js
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (n && h(n, t) < f - 1) {
|
|
6
|
-
const d = -1 * (f - 1);
|
|
7
|
-
t = l(n, d);
|
|
8
|
-
}
|
|
9
|
-
return o && h(t, o) < 0 && (t = o), r(t);
|
|
1
|
+
import { rangeIncludesDate as m } from "./index126.js";
|
|
2
|
+
import { defaultDateLib as r } from "./index106.js";
|
|
3
|
+
function u(o, f, l = r) {
|
|
4
|
+
return m(o, f.from, !1, l) || m(o, f.to, !1, l) || m(f, o.from, !1, l) || m(f, o.to, !1, l);
|
|
10
5
|
}
|
|
11
6
|
export {
|
|
12
|
-
u as
|
|
7
|
+
u as rangeOverlaps
|
|
13
8
|
};
|
|
14
9
|
//# sourceMappingURL=index240.js.map
|
package/dist/index240.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index240.js","sources":["../../../node_modules/react-day-picker/dist/esm/
|
|
1
|
+
{"version":3,"file":"index240.js","sources":["../../../node_modules/react-day-picker/dist/esm/utils/rangeOverlaps.js"],"sourcesContent":["import { defaultDateLib } from \"../classes/index.js\";\nimport { rangeIncludesDate } from \"./rangeIncludesDate.js\";\n/**\n * Determines if two date ranges overlap.\n *\n * @since 9.2.2\n * @param rangeLeft - The first date range.\n * @param rangeRight - The second date range.\n * @param dateLib - The date utility library instance.\n * @returns `true` if the ranges overlap, otherwise `false`.\n * @group Utilities\n */\nexport function rangeOverlaps(rangeLeft, rangeRight, dateLib = defaultDateLib) {\n return (rangeIncludesDate(rangeLeft, rangeRight.from, false, dateLib) ||\n rangeIncludesDate(rangeLeft, rangeRight.to, false, dateLib) ||\n rangeIncludesDate(rangeRight, rangeLeft.from, false, dateLib) ||\n rangeIncludesDate(rangeRight, rangeLeft.to, false, dateLib));\n}\n"],"names":["rangeOverlaps","rangeLeft","rangeRight","dateLib","defaultDateLib","rangeIncludesDate"],"mappings":";;AAYO,SAASA,EAAcC,GAAWC,GAAYC,IAAUC,GAAgB;AAC3E,SAAQC,EAAkBJ,GAAWC,EAAW,MAAM,IAAOC,CAAO,KAChEE,EAAkBJ,GAAWC,EAAW,IAAI,IAAOC,CAAO,KAC1DE,EAAkBH,GAAYD,EAAU,MAAM,IAAOE,CAAO,KAC5DE,EAAkBH,GAAYD,EAAU,IAAI,IAAOE,CAAO;AAClE;","x_google_ignoreList":[0]}
|
package/dist/index241.js
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
function j(r, n, I, W) {
|
|
2
|
+
const s = r[0], o = r[r.length - 1], { ISOWeek: c, fixedWeeks: u, broadcastCalendar: a } = I ?? {}, { addDays: i, differenceInCalendarDays: M, differenceInCalendarMonths: C, endOfBroadcastWeek: O, endOfISOWeek: k, endOfMonth: h, endOfWeek: l, isAfter: E, startOfBroadcastWeek: F, startOfISOWeek: S, startOfWeek: p } = W, g = a ? F(s, W) : c ? S(s) : p(s), D = a ? O(o) : c ? k(h(o)) : l(h(o)), f = n && (a ? O(n) : c ? k(n) : l(n)), x = f && E(D, f) ? f : D, A = M(x, g), B = C(o, s) + 1, e = [];
|
|
3
|
+
for (let t = 0; t <= A; t++) {
|
|
4
|
+
const d = i(g, t);
|
|
5
|
+
e.push(d);
|
|
6
|
+
}
|
|
7
|
+
const y = (a ? 35 : 42) * B;
|
|
8
|
+
if (u && e.length < y) {
|
|
9
|
+
const t = y - e.length;
|
|
10
|
+
for (let d = 0; d < t; d++) {
|
|
11
|
+
const T = i(e[e.length - 1], 1);
|
|
12
|
+
e.push(T);
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return i ? i.days.push(u) : r.push(new N(s, [u])), r;
|
|
17
|
-
}, []), v = new P(t, b);
|
|
18
|
-
return W.push(v), W;
|
|
19
|
-
}, []);
|
|
20
|
-
return e.reverseMonths ? o.reverse() : o;
|
|
14
|
+
}
|
|
15
|
+
return e;
|
|
21
16
|
}
|
|
22
17
|
export {
|
|
23
|
-
j as
|
|
18
|
+
j as getDates
|
|
24
19
|
};
|
|
25
20
|
//# sourceMappingURL=index241.js.map
|
package/dist/index241.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index241.js","sources":["../../../node_modules/react-day-picker/dist/esm/helpers/
|
|
1
|
+
{"version":3,"file":"index241.js","sources":["../../../node_modules/react-day-picker/dist/esm/helpers/getDates.js"],"sourcesContent":["/**\n * Returns all the dates to display in the calendar.\n *\n * This function calculates the range of dates to display based on the provided\n * display months, constraints, and calendar configuration.\n *\n * @param displayMonths The months to display in the calendar.\n * @param maxDate The maximum date to include in the range.\n * @param props The DayPicker props, including calendar configuration options.\n * @param dateLib The date library to use for date manipulation.\n * @returns An array of dates to display in the calendar.\n */\nexport function getDates(displayMonths, maxDate, props, dateLib) {\n const firstMonth = displayMonths[0];\n const lastMonth = displayMonths[displayMonths.length - 1];\n const { ISOWeek, fixedWeeks, broadcastCalendar } = props ?? {};\n const { addDays, differenceInCalendarDays, differenceInCalendarMonths, endOfBroadcastWeek, endOfISOWeek, endOfMonth, endOfWeek, isAfter, startOfBroadcastWeek, startOfISOWeek, startOfWeek, } = dateLib;\n const startWeekFirstDate = broadcastCalendar\n ? startOfBroadcastWeek(firstMonth, dateLib)\n : ISOWeek\n ? startOfISOWeek(firstMonth)\n : startOfWeek(firstMonth);\n const displayMonthsWeekEnd = broadcastCalendar\n ? endOfBroadcastWeek(lastMonth)\n : ISOWeek\n ? endOfISOWeek(endOfMonth(lastMonth))\n : endOfWeek(endOfMonth(lastMonth));\n // If maxDate is set, clamp the grid to the end of that week.\n const constraintWeekEnd = maxDate &&\n (broadcastCalendar\n ? endOfBroadcastWeek(maxDate)\n : ISOWeek\n ? endOfISOWeek(maxDate)\n : endOfWeek(maxDate));\n // Pick the earliest week end between the displayed months and the constraint.\n const gridEndDate = constraintWeekEnd && isAfter(displayMonthsWeekEnd, constraintWeekEnd)\n ? constraintWeekEnd\n : displayMonthsWeekEnd;\n const nOfDays = differenceInCalendarDays(gridEndDate, startWeekFirstDate);\n const nOfMonths = differenceInCalendarMonths(lastMonth, firstMonth) + 1;\n const dates = [];\n for (let i = 0; i <= nOfDays; i++) {\n const date = addDays(startWeekFirstDate, i);\n dates.push(date);\n }\n // If fixed weeks is enabled, add the extra dates to the array\n const nrOfDaysWithFixedWeeks = broadcastCalendar ? 35 : 42;\n const extraDates = nrOfDaysWithFixedWeeks * nOfMonths;\n if (fixedWeeks && dates.length < extraDates) {\n const daysToAdd = extraDates - dates.length;\n for (let i = 0; i < daysToAdd; i++) {\n const date = addDays(dates[dates.length - 1], 1);\n dates.push(date);\n }\n }\n return dates;\n}\n"],"names":["getDates","displayMonths","maxDate","props","dateLib","firstMonth","lastMonth","ISOWeek","fixedWeeks","broadcastCalendar","addDays","differenceInCalendarDays","differenceInCalendarMonths","endOfBroadcastWeek","endOfISOWeek","endOfMonth","endOfWeek","isAfter","startOfBroadcastWeek","startOfISOWeek","startOfWeek","startWeekFirstDate","displayMonthsWeekEnd","constraintWeekEnd","gridEndDate","nOfDays","nOfMonths","dates","i","date","extraDates","daysToAdd"],"mappings":"AAYO,SAASA,EAASC,GAAeC,GAASC,GAAOC,GAAS;AAC7D,QAAMC,IAAaJ,EAAc,CAAC,GAC5BK,IAAYL,EAAcA,EAAc,SAAS,CAAC,GAClD,EAAE,SAAAM,GAAS,YAAAC,GAAY,mBAAAC,EAAiB,IAAKN,KAAS,CAAA,GACtD,EAAE,SAAAO,GAAS,0BAAAC,GAA0B,4BAAAC,GAA4B,oBAAAC,GAAoB,cAAAC,GAAc,YAAAC,GAAY,WAAAC,GAAW,SAAAC,GAAS,sBAAAC,GAAsB,gBAAAC,GAAgB,aAAAC,EAAW,IAAMhB,GAC1LiB,IAAqBZ,IACrBS,EAAqBb,GAAYD,CAAO,IACxCG,IACIY,EAAed,CAAU,IACzBe,EAAYf,CAAU,GAC1BiB,IAAuBb,IACvBI,EAAmBP,CAAS,IAC5BC,IACIO,EAAaC,EAAWT,CAAS,CAAC,IAClCU,EAAUD,EAAWT,CAAS,CAAC,GAEnCiB,IAAoBrB,MACrBO,IACKI,EAAmBX,CAAO,IAC1BK,IACIO,EAAaZ,CAAO,IACpBc,EAAUd,CAAO,IAEzBsB,IAAcD,KAAqBN,EAAQK,GAAsBC,CAAiB,IAClFA,IACAD,GACAG,IAAUd,EAAyBa,GAAaH,CAAkB,GAClEK,IAAYd,EAA2BN,GAAWD,CAAU,IAAI,GAChEsB,IAAQ,CAAA;AACd,WAASC,IAAI,GAAGA,KAAKH,GAASG,KAAK;AAC/B,UAAMC,IAAOnB,EAAQW,GAAoBO,CAAC;AAC1C,IAAAD,EAAM,KAAKE,CAAI;AAAA,EACnB;AAGA,QAAMC,KADyBrB,IAAoB,KAAK,MACZiB;AAC5C,MAAIlB,KAAcmB,EAAM,SAASG,GAAY;AACzC,UAAMC,IAAYD,IAAaH,EAAM;AACrC,aAASC,IAAI,GAAGA,IAAIG,GAAWH,KAAK;AAChC,YAAMC,IAAOnB,EAAQiB,EAAMA,EAAM,SAAS,CAAC,GAAG,CAAC;AAC/C,MAAAA,EAAM,KAAKE,CAAI;AAAA,IACnB;AAAA,EACJ;AACA,SAAOF;AACX;","x_google_ignoreList":[0]}
|