@rpcbase/ui 0.260.0 → 0.262.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/assets/sha256.worker-BEf4_Y9w.js.map +1 -0
- package/dist/components/FilesUploadField/index.d.ts +19 -6
- package/dist/components/FilesUploadField/index.d.ts.map +1 -1
- package/dist/components/FilesUploadField/sha256.d.ts +5 -0
- package/dist/components/FilesUploadField/sha256.d.ts.map +1 -0
- package/dist/components/FilesUploadField/sha256.worker.d.ts +4 -0
- package/dist/components/FilesUploadField/sha256.worker.d.ts.map +1 -0
- package/dist/components/ImagesField/index.d.ts +4 -2
- package/dist/components/ImagesField/index.d.ts.map +1 -1
- package/dist/index.js +10 -10
- package/dist/index298.js +11 -803
- package/dist/index298.js.map +1 -1
- package/dist/index299.js +865 -28
- package/dist/index299.js.map +1 -1
- package/dist/index300.js +26 -510
- package/dist/index300.js.map +1 -1
- package/dist/index301.js +481 -755
- package/dist/index301.js.map +1 -1
- package/dist/index302.js +786 -7428
- package/dist/index302.js.map +1 -1
- package/dist/index303.js +7429 -7
- package/dist/index303.js.map +1 -1
- package/dist/index304.js +6 -12
- package/dist/index304.js.map +1 -1
- package/dist/index305.js +12 -5
- package/dist/index305.js.map +1 -1
- package/dist/index306.js +3 -3
- package/dist/index306.js.map +1 -1
- package/dist/index307.js +5 -469
- package/dist/index307.js.map +1 -1
- package/dist/index308.js +464 -32
- package/dist/index308.js.map +1 -1
- package/dist/index309.js +36 -18
- package/dist/index309.js.map +1 -1
- package/dist/index310.js +17 -28
- package/dist/index310.js.map +1 -1
- package/dist/index311.js +30 -4
- package/dist/index311.js.map +1 -1
- package/dist/index312.js +4 -59
- package/dist/index312.js.map +1 -1
- package/dist/index313.js +59 -9
- package/dist/index313.js.map +1 -1
- package/dist/index314.js +9 -5
- package/dist/index314.js.map +1 -1
- package/dist/index315.js +5 -9
- package/dist/index315.js.map +1 -1
- package/dist/index316.js +9 -12
- package/dist/index316.js.map +1 -1
- package/dist/index317.js +13 -3
- package/dist/index317.js.map +1 -1
- package/dist/index318.js +3 -17
- package/dist/index318.js.map +1 -1
- package/dist/index319.js +14 -23
- package/dist/index319.js.map +1 -1
- package/dist/index320.js +23 -39
- package/dist/index320.js.map +1 -1
- package/dist/index321.js +41 -5
- package/dist/index321.js.map +1 -1
- package/dist/index322.js +5 -25
- package/dist/index322.js.map +1 -1
- package/dist/index323.js +24 -18
- package/dist/index323.js.map +1 -1
- package/dist/index324.js +17 -32
- package/dist/index324.js.map +1 -1
- package/dist/index325.js +34 -5
- package/dist/index325.js.map +1 -1
- package/dist/index326.js +5 -9
- package/dist/index326.js.map +1 -1
- package/dist/index327.js +8 -7
- package/dist/index327.js.map +1 -1
- package/dist/index328.js +8 -9
- package/dist/index328.js.map +1 -1
- package/dist/index329.js +9 -10
- package/dist/index329.js.map +1 -1
- package/dist/index330.js +10 -7
- package/dist/index330.js.map +1 -1
- package/dist/index331.js +7 -75
- package/dist/index331.js.map +1 -1
- package/dist/index332.js +66 -153
- package/dist/index332.js.map +1 -1
- package/dist/index333.js +147 -99
- package/dist/index333.js.map +1 -1
- package/dist/index334.js +113 -13
- package/dist/index334.js.map +1 -1
- package/dist/index335.js +12 -78
- package/dist/index335.js.map +1 -1
- package/dist/index336.js +57 -23
- package/dist/index336.js.map +1 -1
- package/dist/index337.js +45 -12
- package/dist/index337.js.map +1 -1
- package/dist/index338.js +13 -16
- package/dist/index338.js.map +1 -1
- package/dist/index339.js +15 -100
- package/dist/index339.js.map +1 -1
- package/dist/index340.js +95 -50
- package/dist/index340.js.map +1 -1
- package/dist/index341.js +5 -57
- package/dist/index341.js.map +1 -1
- package/dist/index342.js +78 -41
- package/dist/index342.js.map +1 -1
- package/dist/index343.js +58 -100
- package/dist/index343.js.map +1 -1
- package/dist/index344.js +104 -46
- package/dist/index344.js.map +1 -1
- package/dist/index345.js +51 -39
- package/dist/index345.js.map +1 -1
- package/dist/index346.js +42 -142
- package/dist/index346.js.map +1 -1
- package/dist/index347.js +123 -120
- package/dist/index347.js.map +1 -1
- package/dist/index348.js +108 -224
- package/dist/index348.js.map +1 -1
- package/dist/index349.js +174 -158
- package/dist/index349.js.map +1 -1
- package/dist/index350.js +144 -213
- package/dist/index350.js.map +1 -1
- package/dist/index351.js +309 -5
- package/dist/index351.js.map +1 -1
- package/dist/index352.js +5 -6
- package/dist/index352.js.map +1 -1
- package/dist/index353.js +6 -7
- package/dist/index353.js.map +1 -1
- package/dist/index354.js +5 -4
- package/dist/index354.js.map +1 -1
- package/dist/index355.js +4 -4
- package/dist/index355.js.map +1 -1
- package/dist/index356.js +6 -21
- package/dist/index356.js.map +1 -1
- package/dist/index357.js +21 -10
- package/dist/index357.js.map +1 -1
- package/dist/index358.js +10 -128
- package/dist/index358.js.map +1 -1
- package/dist/index359.js +122 -36
- package/dist/index359.js.map +1 -1
- package/dist/index360.js +38 -64
- package/dist/index360.js.map +1 -1
- package/dist/index361.js +66 -115
- package/dist/index361.js.map +1 -1
- package/dist/index362.js +112 -485
- package/dist/index362.js.map +1 -1
- package/dist/index363.js +490 -13
- package/dist/index363.js.map +1 -1
- package/dist/index364.js +13 -4
- package/dist/index364.js.map +1 -1
- package/dist/index365.js +4 -47
- package/dist/index365.js.map +1 -1
- package/dist/index366.js +44 -15
- package/dist/index366.js.map +1 -1
- package/dist/index367.js +19 -5
- package/dist/index367.js.map +1 -1
- package/dist/index368.js +5 -27
- package/dist/index368.js.map +1 -1
- package/dist/index369.js +27 -48
- package/dist/index369.js.map +1 -1
- package/dist/index370.js +46 -27
- package/dist/index370.js.map +1 -1
- package/dist/index371.js +27 -16
- package/dist/index371.js.map +1 -1
- package/dist/index372.js +16 -41
- package/dist/index372.js.map +1 -1
- package/dist/index373.js +42 -14
- package/dist/index373.js.map +1 -1
- package/dist/index374.js +14 -10
- package/dist/index374.js.map +1 -1
- package/dist/index375.js +9 -51
- package/dist/index375.js.map +1 -1
- package/dist/index376.js +53 -43
- package/dist/index376.js.map +1 -1
- package/dist/index377.js +43 -16
- package/dist/index377.js.map +1 -1
- package/dist/index378.js +15 -4
- package/dist/index378.js.map +1 -1
- package/dist/index379.js +4 -4
- package/dist/index379.js.map +1 -1
- package/dist/index380.js +4 -9
- package/dist/index380.js.map +1 -1
- package/dist/index381.js +9 -340
- package/dist/index381.js.map +1 -1
- package/dist/index382.js +339 -4
- package/dist/index382.js.map +1 -1
- package/dist/index383.js +5 -16
- package/dist/index383.js.map +1 -1
- package/dist/index384.js +16 -111
- package/dist/index384.js.map +1 -1
- package/dist/index385.js +109 -19
- package/dist/index385.js.map +1 -1
- package/dist/index386.js +18 -18
- package/dist/index386.js.map +1 -1
- package/dist/index387.js +21 -5
- package/dist/index387.js.map +1 -1
- package/dist/index388.js +5 -20
- package/dist/index388.js.map +1 -1
- package/dist/index389.js +19 -13
- package/dist/index389.js.map +1 -1
- package/dist/index390.js +13 -84
- package/dist/index390.js.map +1 -1
- package/dist/index391.js +84 -7
- package/dist/index391.js.map +1 -1
- package/dist/index392.js +9 -29
- package/dist/index392.js.map +1 -1
- package/dist/index393.js +28 -9
- package/dist/index393.js.map +1 -1
- package/dist/index394.js +9 -5
- package/dist/index394.js.map +1 -1
- package/dist/index395.js +6 -252
- package/dist/index395.js.map +1 -1
- package/dist/index396.js +250 -10
- package/dist/index396.js.map +1 -1
- package/dist/index397.js +11 -10
- package/dist/index397.js.map +1 -1
- package/dist/index398.js +10 -6
- package/dist/index398.js.map +1 -1
- package/dist/index399.js +6 -22
- package/dist/index399.js.map +1 -1
- package/dist/index400.js +21 -21
- package/dist/index400.js.map +1 -1
- package/dist/index401.js +21 -107
- package/dist/index401.js.map +1 -1
- package/dist/index402.js +109 -15
- package/dist/index402.js.map +1 -1
- package/dist/index403.js +15 -12
- package/dist/index403.js.map +1 -1
- package/dist/index404.js +10 -8
- package/dist/index404.js.map +1 -1
- package/dist/index405.js +8 -242
- package/dist/index405.js.map +1 -1
- package/dist/index406.js +238 -25
- package/dist/index406.js.map +1 -1
- package/dist/index407.js +29 -51
- package/dist/index407.js.map +1 -1
- package/dist/index408.js +51 -10
- package/dist/index408.js.map +1 -1
- package/dist/index409.js +11 -128
- package/dist/index409.js.map +1 -1
- package/dist/index410.js +124 -35
- package/dist/index410.js.map +1 -1
- package/dist/index411.js +36 -23
- package/dist/index411.js.map +1 -1
- package/dist/index412.js +26 -11
- package/dist/index412.js.map +1 -1
- package/dist/index413.js +11 -23
- package/dist/index413.js.map +1 -1
- package/dist/index414.js +19 -13
- package/dist/index414.js.map +1 -1
- package/dist/index415.js +14 -13
- package/dist/index415.js.map +1 -1
- package/dist/index416.js +14 -322
- package/dist/index416.js.map +1 -1
- package/dist/index417.js +323 -61
- package/dist/index417.js.map +1 -1
- package/dist/index418.js +63 -4
- package/dist/index418.js.map +1 -1
- package/dist/index419.js +4 -28
- package/dist/index419.js.map +1 -1
- package/dist/index420.js +25 -468
- package/dist/index420.js.map +1 -1
- package/dist/index421.js +452 -250
- package/dist/index421.js.map +1 -1
- package/dist/index422.js +272 -0
- package/dist/index422.js.map +1 -0
- package/package.json +2 -1
package/dist/index421.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index421.js","names":["useEffect","useMemo","useState","Loader2","cn","NotificationDigestFrequency","NotificationSettings","NotificationTopicCatalogItem","NotificationTopicPreference","SettingsResponse","ok","error","settings","digestValues","Array","value","label","normalizeSettings","digestFrequency","frequency","topicPreferences","isArray","map","pref","topic","trim","inApp","emailDigest","push","filter","length","lastDigestSentAt","normalizeTopics","topics","seen","Set","title","description","undefined","has","add","applyTopicsToSettings","defaults","byTopic","Map","existing","get","NotificationsSettings","className","loading","setLoading","saving","setSaving","setError","setSettings","normalizedTopics","loadSettings","res","fetch","method","credentials","json","catch","normalized","saveSettings","next","headers","body","JSON","stringify","current","updatePreference","update","p","hasExisting","some","nextPrefs","e","target","opt","meta","find","checked"],"sources":["../src/components/Notifications/NotificationsSettings.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { NotificationDigestFrequency, NotificationSettings, NotificationTopicCatalogItem, NotificationTopicPreference } from \"./types\"\n\n\ntype SettingsResponse = {\n ok?: boolean\n error?: string\n settings?: NotificationSettings\n}\n\nconst digestValues: Array<{ value: NotificationDigestFrequency; label: string }> = [\n { value: \"off\", label: \"Off\" },\n { value: \"daily\", label: \"Daily\" },\n { value: \"weekly\", label: \"Weekly\" },\n]\n\nconst normalizeSettings = (settings: NotificationSettings | undefined): NotificationSettings => {\n const digestFrequency = settings?.digestFrequency\n const frequency: NotificationDigestFrequency =\n digestFrequency === \"off\" || digestFrequency === \"daily\" || digestFrequency === \"weekly\"\n ? digestFrequency\n : \"weekly\"\n\n const topicPreferences = Array.isArray(settings?.topicPreferences)\n ? settings!.topicPreferences\n .map((pref) => ({\n topic: typeof pref.topic === \"string\" ? pref.topic.trim() : \"\",\n inApp: pref.inApp === true,\n emailDigest: pref.emailDigest === true,\n push: pref.push === true,\n }))\n .filter((pref) => pref.topic.length > 0)\n : []\n\n return {\n digestFrequency: frequency,\n topicPreferences,\n ...(typeof settings?.lastDigestSentAt === \"string\" ? { lastDigestSentAt: settings.lastDigestSentAt } : {}),\n }\n}\n\nconst normalizeTopics = (topics: NotificationTopicCatalogItem[] | undefined): NotificationTopicCatalogItem[] => {\n if (!Array.isArray(topics)) return []\n\n const seen = new Set<string>()\n return topics\n .map((topic) => ({\n topic: typeof topic.topic === \"string\" ? topic.topic.trim() : \"\",\n title: typeof topic.title === \"string\" ? topic.title.trim() : \"\",\n description: typeof topic.description === \"string\" ? topic.description.trim() : undefined,\n }))\n .filter((topic) => topic.topic.length > 0)\n .filter((topic) => {\n if (seen.has(topic.topic)) return false\n seen.add(topic.topic)\n return true\n })\n}\n\nconst applyTopicsToSettings = (\n settings: NotificationSettings,\n topics: NotificationTopicCatalogItem[],\n): NotificationSettings => {\n const defaults: NotificationTopicPreference = {\n topic: \"\",\n inApp: true,\n emailDigest: true,\n push: false,\n }\n\n const byTopic = new Map(settings.topicPreferences.map((pref) => [pref.topic, pref]))\n return {\n ...settings,\n topicPreferences: topics.map((topic) => {\n const existing = byTopic.get(topic.topic)\n return existing\n ? {\n topic: topic.topic,\n inApp: existing.inApp === true,\n emailDigest: existing.emailDigest === true,\n push: existing.push === true,\n }\n : {\n ...defaults,\n topic: topic.topic,\n }\n }),\n }\n}\n\nexport function NotificationsSettings({\n className,\n topics,\n}: {\n className?: string\n topics?: NotificationTopicCatalogItem[]\n}) {\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [settings, setSettings] = useState<NotificationSettings>(() =>\n normalizeSettings({ digestFrequency: \"weekly\", topicPreferences: [] }),\n )\n\n const normalizedTopics = useMemo(() => normalizeTopics(topics), [topics])\n\n const loadSettings = async () => {\n setLoading(true)\n setError(null)\n try {\n const res = await fetch(\"/api/rb/notifications/settings\", {\n method: \"GET\",\n credentials: \"include\",\n })\n const json = (await res.json().catch(() => null)) as SettingsResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to load notification settings.\")\n return\n }\n const normalized = normalizeSettings(json.settings)\n setSettings(normalizedTopics.length > 0 ? applyTopicsToSettings(normalized, normalizedTopics) : normalized)\n } catch {\n setError(\"Unable to load notification settings.\")\n } finally {\n setLoading(false)\n }\n }\n\n const saveSettings = async (next: NotificationSettings) => {\n setSaving(true)\n setError(null)\n try {\n const res = await fetch(\"/api/rb/notifications/settings\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({\n digestFrequency: next.digestFrequency,\n topicPreferences: next.topicPreferences,\n }),\n })\n const json = (await res.json().catch(() => null)) as SettingsResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to save notification settings.\")\n return\n }\n const normalized = normalizeSettings(json.settings)\n setSettings(normalizedTopics.length > 0 ? applyTopicsToSettings(normalized, normalizedTopics) : normalized)\n } catch {\n setError(\"Unable to save notification settings.\")\n } finally {\n setSaving(false)\n }\n }\n\n useEffect(() => {\n void loadSettings()\n }, [])\n\n useEffect(() => {\n if (normalizedTopics.length === 0) return\n setSettings((current) => applyTopicsToSettings(current, normalizedTopics))\n }, [normalizedTopics])\n\n const updatePreference = (topic: string, update: (p: NotificationTopicPreference) => NotificationTopicPreference) => {\n const hasExisting = settings.topicPreferences.some((p) => p.topic === topic)\n const nextPrefs = hasExisting\n ? settings.topicPreferences.map((p) => (p.topic === topic ? update(p) : p))\n : [...settings.topicPreferences, update({ topic, inApp: true, emailDigest: true, push: false })]\n const next = normalizeSettings({ ...settings, topicPreferences: nextPrefs })\n setSettings(next)\n void saveSettings(next)\n }\n\n if (loading) {\n return (\n <div className={cn(\"flex items-center justify-center py-10 text-muted-foreground\", className)}>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )\n }\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n <div className=\"rounded-md border bg-background p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-semibold\">Email digest</div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Choose how often we email you a summary.</div>\n </div>\n <select\n value={settings.digestFrequency}\n onChange={(e) => {\n const value = e.target.value as NotificationDigestFrequency\n const next = normalizeSettings({ ...settings, digestFrequency: value })\n setSettings(next)\n void saveSettings(next)\n }}\n className=\"h-9 rounded-md border bg-background px-2 text-sm\"\n >\n {digestValues.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"rounded-md border bg-background p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-semibold\">Topics</div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Choose where you receive each topic.</div>\n </div>\n </div>\n\n {normalizedTopics.length === 0 ? (\n <div className=\"mt-4 text-sm text-muted-foreground\">No topics configured.</div>\n ) : (\n <div className=\"mt-4 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-muted-foreground\">\n <th className=\"py-2 pr-4 font-medium\">Topic</th>\n <th className=\"py-2 pr-4 font-medium\">In-app</th>\n <th className=\"py-2 pr-4 font-medium\">Email digest</th>\n <th className=\"py-2 pr-4 font-medium\">Push</th>\n </tr>\n </thead>\n <tbody>\n {settings.topicPreferences.map((pref) => {\n const meta = normalizedTopics.find((topic) => topic.topic === pref.topic)\n return (\n <tr key={pref.topic} className=\"border-t align-top\">\n <td className=\"py-3 pr-4\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"font-medium\">{meta?.title || pref.topic}</span>\n {meta?.description ? (\n <span className=\"text-xs text-muted-foreground\">{meta.description}</span>\n ) : null}\n <span className=\"text-[11px] text-muted-foreground\">{pref.topic}</span>\n </div>\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.inApp}\n onChange={(e) =>\n updatePreference(pref.topic, (p) => ({ ...p, inApp: e.target.checked }))\n }\n />\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.emailDigest}\n onChange={(e) =>\n updatePreference(pref.topic, (p) => ({ ...p, emailDigest: e.target.checked }))\n }\n />\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.push}\n disabled\n className=\"opacity-50\"\n aria-label=\"Push notifications (coming soon)\"\n />\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {error ? (\n <div className=\"mt-3 text-sm text-destructive\">{error}</div>\n ) : saving ? (\n <div className=\"mt-3 text-xs text-muted-foreground\">Saving…</div>\n ) : null}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index421.js","names":["createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","Context","Dialog","DialogPrimitive","Loader2","MoreVertical","X","cn","NotificationItem","NotificationsRealtimeState","ListResponse","ok","error","notifications","unreadCount","unseenCount","DayGroup","key","label","items","BrowserNotificationPermission","NotificationPermission","NotificationActionMode","NotificationAction","link","mode","toMs","iso","ms","Date","parse","Number","isFinite","getDayKey","date","getTime","year","getFullYear","month","String","getMonth","padStart","day","getDate","formatDayLabel","yearRaw","monthRaw","dayRaw","split","now","includeYear","toLocaleDateString","undefined","weekday","getNotificationLink","item","dataLink","data","trim","platformWebpush","platform","webpush","Array","isArray","fcmOptions","getNotificationActionMode","linkMode","getNotificationAction","getNotificationActionLabel","action","pushUrlWithoutReload","url","window","history","pushState","state","dispatchEvent","PopStateEvent","applyNotificationAction","currentUrl","URL","location","href","actionUrl","searchParams","forEach","value","set","hash","pathname","search","groupByDay","groups","currentKey","createdAt","push","length","getBrowserNotificationPermission","Notification","permission","EmptyRealtimeContext","NotificationsDrawer","open","onOpenChange","className","limit","defaultUnreadOnly","realtimeContext","realtime","setItems","setUnreadCount","setUnseenCount","loading","setLoading","setError","unreadOnly","setUnreadOnly","browserNotificationPermission","setBrowserNotificationPermission","browserNotificationPermissionRequesting","setBrowserNotificationPermissionRequesting","mergedItems","mergedUnreadCount","mergedUnseenCount","mergedLoading","mergedError","Error","message","visibleItems","slice","unread","filter","n","readAt","read","Boolean","unreadGroups","readGroups","refresh","markSeen","res","fetch","method","headers","credentials","body","JSON","stringify","json","catch","nextItems","Math","max","floor","keepalive","navigator","permissions","query","permissionStatus","PermissionStatus","disposed","syncPermission","name","PermissionName","then","status","addEventListener","removeEventListener","requestBrowserNotificationPermission","nextPermission","requestPermission","markAsRead","id","encodeURIComponent","nowIso","toISOString","current","target","find","count","seenAt","map","archive","requestClose","handleOpenChange","nextOpen","v","group","BrowserNotificationPermissionNotice","t0","$","_c","requesting","onEnable","t1","Symbol","for","isDenied","t2","t3","t4","t5","t6","t7","NotificationRow","notification","onMarkRead","onArchive","onAction","menuOpen","setMenuOpen","menuRef","menuButtonRef","isUnread","actionLabel","bb0","toLocaleString","createdAtLabel","handlePointerDown","event","Node","contains","handleKeyDown","event_0","focus","document","t8","title","t9","t10","t11","t12","t13","t14","t15","_temp","t16","t17","t18","t19"],"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\"\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 getNotificationActionLabel = (action: NotificationAction | null): string => {\n if (!action) return \"\"\n return action.mode === \"merge_current_search\" ? \"Open\" : action.link\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\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 requestClose = () => {\n onOpenChange(false)\n }\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (nextOpen) {\n onOpenChange(true)\n return\n }\n\n requestClose()\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop className=\"fixed inset-0 z-50 bg-black/50\" onClick={requestClose} />\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 type=\"button\"\n aria-label=\"Close notifications\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\"\n onClick={requestClose}\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={requestClose}\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={requestClose}\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 actionLabel = getNotificationActionLabel(action)\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 {actionLabel ? <div className=\"mt-2 truncate text-xs text-primary\">{actionLabel}</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"],"mappings":"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"}
|
package/dist/index422.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { cn as e } from "./index12.js";
|
|
2
|
+
import { useEffect as t, useMemo as n, useState as r } from "react";
|
|
3
|
+
import { Loader2 as i } from "lucide-react";
|
|
4
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/Notifications/NotificationsSettings.tsx
|
|
6
|
+
var s = [
|
|
7
|
+
{
|
|
8
|
+
value: "off",
|
|
9
|
+
label: "Off"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
value: "daily",
|
|
13
|
+
label: "Daily"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
value: "weekly",
|
|
17
|
+
label: "Weekly"
|
|
18
|
+
}
|
|
19
|
+
], c = (e) => {
|
|
20
|
+
let t = e?.digestFrequency;
|
|
21
|
+
return {
|
|
22
|
+
digestFrequency: t === "off" || t === "daily" || t === "weekly" ? t : "weekly",
|
|
23
|
+
topicPreferences: Array.isArray(e?.topicPreferences) ? e.topicPreferences.map((e) => ({
|
|
24
|
+
topic: typeof e.topic == "string" ? e.topic.trim() : "",
|
|
25
|
+
inApp: e.inApp === !0,
|
|
26
|
+
emailDigest: e.emailDigest === !0,
|
|
27
|
+
push: e.push === !0
|
|
28
|
+
})).filter((e) => e.topic.length > 0) : [],
|
|
29
|
+
...typeof e?.lastDigestSentAt == "string" ? { lastDigestSentAt: e.lastDigestSentAt } : {}
|
|
30
|
+
};
|
|
31
|
+
}, l = (e) => {
|
|
32
|
+
if (!Array.isArray(e)) return [];
|
|
33
|
+
let t = /* @__PURE__ */ new Set();
|
|
34
|
+
return e.map((e) => ({
|
|
35
|
+
topic: typeof e.topic == "string" ? e.topic.trim() : "",
|
|
36
|
+
title: typeof e.title == "string" ? e.title.trim() : "",
|
|
37
|
+
description: typeof e.description == "string" ? e.description.trim() : void 0
|
|
38
|
+
})).filter((e) => e.topic.length > 0).filter((e) => t.has(e.topic) ? !1 : (t.add(e.topic), !0));
|
|
39
|
+
}, u = (e, t) => {
|
|
40
|
+
let n = {
|
|
41
|
+
topic: "",
|
|
42
|
+
inApp: !0,
|
|
43
|
+
emailDigest: !0,
|
|
44
|
+
push: !1
|
|
45
|
+
}, r = new Map(e.topicPreferences.map((e) => [e.topic, e]));
|
|
46
|
+
return {
|
|
47
|
+
...e,
|
|
48
|
+
topicPreferences: t.map((e) => {
|
|
49
|
+
let t = r.get(e.topic);
|
|
50
|
+
return t ? {
|
|
51
|
+
topic: e.topic,
|
|
52
|
+
inApp: t.inApp === !0,
|
|
53
|
+
emailDigest: t.emailDigest === !0,
|
|
54
|
+
push: t.push === !0
|
|
55
|
+
} : {
|
|
56
|
+
...n,
|
|
57
|
+
topic: e.topic
|
|
58
|
+
};
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
function d({ className: d, topics: f }) {
|
|
63
|
+
let [p, m] = r(!0), [h, g] = r(!1), [_, v] = r(null), [y, b] = r(() => c({
|
|
64
|
+
digestFrequency: "weekly",
|
|
65
|
+
topicPreferences: []
|
|
66
|
+
})), x = n(() => l(f), [f]), S = async () => {
|
|
67
|
+
m(!0), v(null);
|
|
68
|
+
try {
|
|
69
|
+
let e = await fetch("/api/rb/notifications/settings", {
|
|
70
|
+
method: "GET",
|
|
71
|
+
credentials: "include"
|
|
72
|
+
}), t = await e.json().catch(() => null);
|
|
73
|
+
if (!e.ok || !t?.ok) {
|
|
74
|
+
v(t?.error || "Unable to load notification settings.");
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
let n = c(t.settings);
|
|
78
|
+
b(x.length > 0 ? u(n, x) : n);
|
|
79
|
+
} catch {
|
|
80
|
+
v("Unable to load notification settings.");
|
|
81
|
+
} finally {
|
|
82
|
+
m(!1);
|
|
83
|
+
}
|
|
84
|
+
}, C = async (e) => {
|
|
85
|
+
g(!0), v(null);
|
|
86
|
+
try {
|
|
87
|
+
let t = await fetch("/api/rb/notifications/settings", {
|
|
88
|
+
method: "PUT",
|
|
89
|
+
headers: { "Content-Type": "application/json" },
|
|
90
|
+
credentials: "include",
|
|
91
|
+
body: JSON.stringify({
|
|
92
|
+
digestFrequency: e.digestFrequency,
|
|
93
|
+
topicPreferences: e.topicPreferences
|
|
94
|
+
})
|
|
95
|
+
}), n = await t.json().catch(() => null);
|
|
96
|
+
if (!t.ok || !n?.ok) {
|
|
97
|
+
v(n?.error || "Unable to save notification settings.");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
let r = c(n.settings);
|
|
101
|
+
b(x.length > 0 ? u(r, x) : r);
|
|
102
|
+
} catch {
|
|
103
|
+
v("Unable to save notification settings.");
|
|
104
|
+
} finally {
|
|
105
|
+
g(!1);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
t(() => {
|
|
109
|
+
S();
|
|
110
|
+
}, []), t(() => {
|
|
111
|
+
x.length !== 0 && b((e) => u(e, x));
|
|
112
|
+
}, [x]);
|
|
113
|
+
let w = (e, t) => {
|
|
114
|
+
let n = y.topicPreferences.some((t) => t.topic === e) ? y.topicPreferences.map((n) => n.topic === e ? t(n) : n) : [...y.topicPreferences, t({
|
|
115
|
+
topic: e,
|
|
116
|
+
inApp: !0,
|
|
117
|
+
emailDigest: !0,
|
|
118
|
+
push: !1
|
|
119
|
+
})], r = c({
|
|
120
|
+
...y,
|
|
121
|
+
topicPreferences: n
|
|
122
|
+
});
|
|
123
|
+
b(r), C(r);
|
|
124
|
+
};
|
|
125
|
+
return p ? /* @__PURE__ */ a("div", {
|
|
126
|
+
className: e("flex items-center justify-center py-10 text-muted-foreground", d),
|
|
127
|
+
children: /* @__PURE__ */ a(i, { className: "h-4 w-4 animate-spin" })
|
|
128
|
+
}) : /* @__PURE__ */ o("div", {
|
|
129
|
+
className: e("space-y-4", d),
|
|
130
|
+
children: [/* @__PURE__ */ a("div", {
|
|
131
|
+
className: "rounded-md border bg-background p-4",
|
|
132
|
+
children: /* @__PURE__ */ o("div", {
|
|
133
|
+
className: "flex items-start justify-between gap-3",
|
|
134
|
+
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("div", {
|
|
135
|
+
className: "text-sm font-semibold",
|
|
136
|
+
children: "Email digest"
|
|
137
|
+
}), /* @__PURE__ */ a("div", {
|
|
138
|
+
className: "mt-1 text-xs text-muted-foreground",
|
|
139
|
+
children: "Choose how often we email you a summary."
|
|
140
|
+
})] }), /* @__PURE__ */ a("select", {
|
|
141
|
+
value: y.digestFrequency,
|
|
142
|
+
onChange: (e) => {
|
|
143
|
+
let t = e.target.value, n = c({
|
|
144
|
+
...y,
|
|
145
|
+
digestFrequency: t
|
|
146
|
+
});
|
|
147
|
+
b(n), C(n);
|
|
148
|
+
},
|
|
149
|
+
className: "h-9 rounded-md border bg-background px-2 text-sm",
|
|
150
|
+
children: s.map((e) => /* @__PURE__ */ a("option", {
|
|
151
|
+
value: e.value,
|
|
152
|
+
children: e.label
|
|
153
|
+
}, e.value))
|
|
154
|
+
})]
|
|
155
|
+
})
|
|
156
|
+
}), /* @__PURE__ */ o("div", {
|
|
157
|
+
className: "rounded-md border bg-background p-4",
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ a("div", {
|
|
160
|
+
className: "flex items-start justify-between gap-3",
|
|
161
|
+
children: /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("div", {
|
|
162
|
+
className: "text-sm font-semibold",
|
|
163
|
+
children: "Topics"
|
|
164
|
+
}), /* @__PURE__ */ a("div", {
|
|
165
|
+
className: "mt-1 text-xs text-muted-foreground",
|
|
166
|
+
children: "Choose where you receive each topic."
|
|
167
|
+
})] })
|
|
168
|
+
}),
|
|
169
|
+
x.length === 0 ? /* @__PURE__ */ a("div", {
|
|
170
|
+
className: "mt-4 text-sm text-muted-foreground",
|
|
171
|
+
children: "No topics configured."
|
|
172
|
+
}) : /* @__PURE__ */ a("div", {
|
|
173
|
+
className: "mt-4 overflow-x-auto",
|
|
174
|
+
children: /* @__PURE__ */ o("table", {
|
|
175
|
+
className: "w-full text-sm",
|
|
176
|
+
children: [/* @__PURE__ */ a("thead", { children: /* @__PURE__ */ o("tr", {
|
|
177
|
+
className: "text-left text-xs text-muted-foreground",
|
|
178
|
+
children: [
|
|
179
|
+
/* @__PURE__ */ a("th", {
|
|
180
|
+
className: "py-2 pr-4 font-medium",
|
|
181
|
+
children: "Topic"
|
|
182
|
+
}),
|
|
183
|
+
/* @__PURE__ */ a("th", {
|
|
184
|
+
className: "py-2 pr-4 font-medium",
|
|
185
|
+
children: "In-app"
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ a("th", {
|
|
188
|
+
className: "py-2 pr-4 font-medium",
|
|
189
|
+
children: "Email digest"
|
|
190
|
+
}),
|
|
191
|
+
/* @__PURE__ */ a("th", {
|
|
192
|
+
className: "py-2 pr-4 font-medium",
|
|
193
|
+
children: "Push"
|
|
194
|
+
})
|
|
195
|
+
]
|
|
196
|
+
}) }), /* @__PURE__ */ a("tbody", { children: y.topicPreferences.map((e) => {
|
|
197
|
+
let t = x.find((t) => t.topic === e.topic);
|
|
198
|
+
return /* @__PURE__ */ o("tr", {
|
|
199
|
+
className: "border-t align-top",
|
|
200
|
+
children: [
|
|
201
|
+
/* @__PURE__ */ a("td", {
|
|
202
|
+
className: "py-3 pr-4",
|
|
203
|
+
children: /* @__PURE__ */ o("div", {
|
|
204
|
+
className: "flex flex-col gap-1",
|
|
205
|
+
children: [
|
|
206
|
+
/* @__PURE__ */ a("span", {
|
|
207
|
+
className: "font-medium",
|
|
208
|
+
children: t?.title || e.topic
|
|
209
|
+
}),
|
|
210
|
+
t?.description ? /* @__PURE__ */ a("span", {
|
|
211
|
+
className: "text-xs text-muted-foreground",
|
|
212
|
+
children: t.description
|
|
213
|
+
}) : null,
|
|
214
|
+
/* @__PURE__ */ a("span", {
|
|
215
|
+
className: "text-[11px] text-muted-foreground",
|
|
216
|
+
children: e.topic
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
})
|
|
220
|
+
}),
|
|
221
|
+
/* @__PURE__ */ a("td", {
|
|
222
|
+
className: "py-3 pr-4",
|
|
223
|
+
children: /* @__PURE__ */ a("input", {
|
|
224
|
+
type: "checkbox",
|
|
225
|
+
checked: e.inApp,
|
|
226
|
+
onChange: (t) => w(e.topic, (e) => ({
|
|
227
|
+
...e,
|
|
228
|
+
inApp: t.target.checked
|
|
229
|
+
}))
|
|
230
|
+
})
|
|
231
|
+
}),
|
|
232
|
+
/* @__PURE__ */ a("td", {
|
|
233
|
+
className: "py-3 pr-4",
|
|
234
|
+
children: /* @__PURE__ */ a("input", {
|
|
235
|
+
type: "checkbox",
|
|
236
|
+
checked: e.emailDigest,
|
|
237
|
+
onChange: (t) => w(e.topic, (e) => ({
|
|
238
|
+
...e,
|
|
239
|
+
emailDigest: t.target.checked
|
|
240
|
+
}))
|
|
241
|
+
})
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ a("td", {
|
|
244
|
+
className: "py-3 pr-4",
|
|
245
|
+
children: /* @__PURE__ */ a("input", {
|
|
246
|
+
type: "checkbox",
|
|
247
|
+
checked: e.push,
|
|
248
|
+
disabled: !0,
|
|
249
|
+
className: "opacity-50",
|
|
250
|
+
"aria-label": "Push notifications (coming soon)"
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
]
|
|
254
|
+
}, e.topic);
|
|
255
|
+
}) })]
|
|
256
|
+
})
|
|
257
|
+
}),
|
|
258
|
+
_ ? /* @__PURE__ */ a("div", {
|
|
259
|
+
className: "mt-3 text-sm text-destructive",
|
|
260
|
+
children: _
|
|
261
|
+
}) : h ? /* @__PURE__ */ a("div", {
|
|
262
|
+
className: "mt-3 text-xs text-muted-foreground",
|
|
263
|
+
children: "Saving…"
|
|
264
|
+
}) : null
|
|
265
|
+
]
|
|
266
|
+
})]
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
//#endregion
|
|
270
|
+
export { d as NotificationsSettings };
|
|
271
|
+
|
|
272
|
+
//# sourceMappingURL=index422.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index422.js","names":["useEffect","useMemo","useState","Loader2","cn","NotificationDigestFrequency","NotificationSettings","NotificationTopicCatalogItem","NotificationTopicPreference","SettingsResponse","ok","error","settings","digestValues","Array","value","label","normalizeSettings","digestFrequency","frequency","topicPreferences","isArray","map","pref","topic","trim","inApp","emailDigest","push","filter","length","lastDigestSentAt","normalizeTopics","topics","seen","Set","title","description","undefined","has","add","applyTopicsToSettings","defaults","byTopic","Map","existing","get","NotificationsSettings","className","loading","setLoading","saving","setSaving","setError","setSettings","normalizedTopics","loadSettings","res","fetch","method","credentials","json","catch","normalized","saveSettings","next","headers","body","JSON","stringify","current","updatePreference","update","p","hasExisting","some","nextPrefs","e","target","opt","meta","find","checked"],"sources":["../src/components/Notifications/NotificationsSettings.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { NotificationDigestFrequency, NotificationSettings, NotificationTopicCatalogItem, NotificationTopicPreference } from \"./types\"\n\n\ntype SettingsResponse = {\n ok?: boolean\n error?: string\n settings?: NotificationSettings\n}\n\nconst digestValues: Array<{ value: NotificationDigestFrequency; label: string }> = [\n { value: \"off\", label: \"Off\" },\n { value: \"daily\", label: \"Daily\" },\n { value: \"weekly\", label: \"Weekly\" },\n]\n\nconst normalizeSettings = (settings: NotificationSettings | undefined): NotificationSettings => {\n const digestFrequency = settings?.digestFrequency\n const frequency: NotificationDigestFrequency =\n digestFrequency === \"off\" || digestFrequency === \"daily\" || digestFrequency === \"weekly\"\n ? digestFrequency\n : \"weekly\"\n\n const topicPreferences = Array.isArray(settings?.topicPreferences)\n ? settings!.topicPreferences\n .map((pref) => ({\n topic: typeof pref.topic === \"string\" ? pref.topic.trim() : \"\",\n inApp: pref.inApp === true,\n emailDigest: pref.emailDigest === true,\n push: pref.push === true,\n }))\n .filter((pref) => pref.topic.length > 0)\n : []\n\n return {\n digestFrequency: frequency,\n topicPreferences,\n ...(typeof settings?.lastDigestSentAt === \"string\" ? { lastDigestSentAt: settings.lastDigestSentAt } : {}),\n }\n}\n\nconst normalizeTopics = (topics: NotificationTopicCatalogItem[] | undefined): NotificationTopicCatalogItem[] => {\n if (!Array.isArray(topics)) return []\n\n const seen = new Set<string>()\n return topics\n .map((topic) => ({\n topic: typeof topic.topic === \"string\" ? topic.topic.trim() : \"\",\n title: typeof topic.title === \"string\" ? topic.title.trim() : \"\",\n description: typeof topic.description === \"string\" ? topic.description.trim() : undefined,\n }))\n .filter((topic) => topic.topic.length > 0)\n .filter((topic) => {\n if (seen.has(topic.topic)) return false\n seen.add(topic.topic)\n return true\n })\n}\n\nconst applyTopicsToSettings = (\n settings: NotificationSettings,\n topics: NotificationTopicCatalogItem[],\n): NotificationSettings => {\n const defaults: NotificationTopicPreference = {\n topic: \"\",\n inApp: true,\n emailDigest: true,\n push: false,\n }\n\n const byTopic = new Map(settings.topicPreferences.map((pref) => [pref.topic, pref]))\n return {\n ...settings,\n topicPreferences: topics.map((topic) => {\n const existing = byTopic.get(topic.topic)\n return existing\n ? {\n topic: topic.topic,\n inApp: existing.inApp === true,\n emailDigest: existing.emailDigest === true,\n push: existing.push === true,\n }\n : {\n ...defaults,\n topic: topic.topic,\n }\n }),\n }\n}\n\nexport function NotificationsSettings({\n className,\n topics,\n}: {\n className?: string\n topics?: NotificationTopicCatalogItem[]\n}) {\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [settings, setSettings] = useState<NotificationSettings>(() =>\n normalizeSettings({ digestFrequency: \"weekly\", topicPreferences: [] }),\n )\n\n const normalizedTopics = useMemo(() => normalizeTopics(topics), [topics])\n\n const loadSettings = async () => {\n setLoading(true)\n setError(null)\n try {\n const res = await fetch(\"/api/rb/notifications/settings\", {\n method: \"GET\",\n credentials: \"include\",\n })\n const json = (await res.json().catch(() => null)) as SettingsResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to load notification settings.\")\n return\n }\n const normalized = normalizeSettings(json.settings)\n setSettings(normalizedTopics.length > 0 ? applyTopicsToSettings(normalized, normalizedTopics) : normalized)\n } catch {\n setError(\"Unable to load notification settings.\")\n } finally {\n setLoading(false)\n }\n }\n\n const saveSettings = async (next: NotificationSettings) => {\n setSaving(true)\n setError(null)\n try {\n const res = await fetch(\"/api/rb/notifications/settings\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({\n digestFrequency: next.digestFrequency,\n topicPreferences: next.topicPreferences,\n }),\n })\n const json = (await res.json().catch(() => null)) as SettingsResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to save notification settings.\")\n return\n }\n const normalized = normalizeSettings(json.settings)\n setSettings(normalizedTopics.length > 0 ? applyTopicsToSettings(normalized, normalizedTopics) : normalized)\n } catch {\n setError(\"Unable to save notification settings.\")\n } finally {\n setSaving(false)\n }\n }\n\n useEffect(() => {\n void loadSettings()\n }, [])\n\n useEffect(() => {\n if (normalizedTopics.length === 0) return\n setSettings((current) => applyTopicsToSettings(current, normalizedTopics))\n }, [normalizedTopics])\n\n const updatePreference = (topic: string, update: (p: NotificationTopicPreference) => NotificationTopicPreference) => {\n const hasExisting = settings.topicPreferences.some((p) => p.topic === topic)\n const nextPrefs = hasExisting\n ? settings.topicPreferences.map((p) => (p.topic === topic ? update(p) : p))\n : [...settings.topicPreferences, update({ topic, inApp: true, emailDigest: true, push: false })]\n const next = normalizeSettings({ ...settings, topicPreferences: nextPrefs })\n setSettings(next)\n void saveSettings(next)\n }\n\n if (loading) {\n return (\n <div className={cn(\"flex items-center justify-center py-10 text-muted-foreground\", className)}>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )\n }\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n <div className=\"rounded-md border bg-background p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-semibold\">Email digest</div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Choose how often we email you a summary.</div>\n </div>\n <select\n value={settings.digestFrequency}\n onChange={(e) => {\n const value = e.target.value as NotificationDigestFrequency\n const next = normalizeSettings({ ...settings, digestFrequency: value })\n setSettings(next)\n void saveSettings(next)\n }}\n className=\"h-9 rounded-md border bg-background px-2 text-sm\"\n >\n {digestValues.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"rounded-md border bg-background p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-semibold\">Topics</div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Choose where you receive each topic.</div>\n </div>\n </div>\n\n {normalizedTopics.length === 0 ? (\n <div className=\"mt-4 text-sm text-muted-foreground\">No topics configured.</div>\n ) : (\n <div className=\"mt-4 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-muted-foreground\">\n <th className=\"py-2 pr-4 font-medium\">Topic</th>\n <th className=\"py-2 pr-4 font-medium\">In-app</th>\n <th className=\"py-2 pr-4 font-medium\">Email digest</th>\n <th className=\"py-2 pr-4 font-medium\">Push</th>\n </tr>\n </thead>\n <tbody>\n {settings.topicPreferences.map((pref) => {\n const meta = normalizedTopics.find((topic) => topic.topic === pref.topic)\n return (\n <tr key={pref.topic} className=\"border-t align-top\">\n <td className=\"py-3 pr-4\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"font-medium\">{meta?.title || pref.topic}</span>\n {meta?.description ? (\n <span className=\"text-xs text-muted-foreground\">{meta.description}</span>\n ) : null}\n <span className=\"text-[11px] text-muted-foreground\">{pref.topic}</span>\n </div>\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.inApp}\n onChange={(e) =>\n updatePreference(pref.topic, (p) => ({ ...p, inApp: e.target.checked }))\n }\n />\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.emailDigest}\n onChange={(e) =>\n updatePreference(pref.topic, (p) => ({ ...p, emailDigest: e.target.checked }))\n }\n />\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.push}\n disabled\n className=\"opacity-50\"\n aria-label=\"Push notifications (coming soon)\"\n />\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {error ? (\n <div className=\"mt-3 text-sm text-destructive\">{error}</div>\n ) : saving ? (\n <div className=\"mt-3 text-xs text-muted-foreground\">Saving…</div>\n ) : null}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rpcbase/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.262.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -102,6 +102,7 @@
|
|
|
102
102
|
"@dnd-kit/utilities": "3.2.2",
|
|
103
103
|
"@googlemaps/js-api-loader": "2.1.1",
|
|
104
104
|
"blurhash": "2.0.5",
|
|
105
|
+
"fast-sha256": "1.3.0",
|
|
105
106
|
"imask": "7.6.1",
|
|
106
107
|
"react-day-picker": "10.0.1",
|
|
107
108
|
"react-imask": "7.6.1",
|