@asteby/metacore-notifications 23.0.1 → 24.0.1

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/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @asteby/metacore-notifications
2
2
 
3
- Metacore notifications kit — a drop-in bell-icon dropdown, app-badge hook
4
- (Badging API) and WebSocket integration for real-time push updates.
3
+ Bell dropdown, **unified toast**, dynamic Lucide icons / severity colors /
4
+ module chips, and live ingest over **SSE** (preferred) or WebSocket.
5
5
 
6
6
  ## Install
7
7
 
@@ -11,76 +11,51 @@ pnpm add @asteby/metacore-notifications \
11
11
  date-fns lucide-react sonner @tanstack/react-query react react-dom
12
12
  ```
13
13
 
14
- This package declares its UI, WebSocket, date, icon and toast libraries as
15
- `peerDependencies` — the consumer installs them once at the app level.
16
-
17
- ## Usage
14
+ ## Boot (host app)
18
15
 
19
16
  ```tsx
20
- import { NotificationsDropdown } from '@asteby/metacore-notifications/dropdown'
21
- import { WebSocketProvider } from '@asteby/metacore-websocket/provider'
22
- import { api } from '@/lib/api' // your injected axios-compatible client
23
- import { useNavigate } from '@tanstack/react-router'
24
-
25
- export function Header() {
26
- const navigate = useNavigate()
27
- return (
28
- <WebSocketProvider url="wss://api.example.com/ws" getToken={getToken}>
29
- <NotificationsDropdown
30
- apiClient={api}
31
- apiBasePath="/data/notifications/me"
32
- enableBadge
33
- onNotificationClick={(n) => {
34
- if (n.link) navigate({ to: n.link })
35
- else if (n.conversation_id)
36
- navigate({ to: '/chats', search: { id: n.conversation_id } })
37
- }}
38
- />
39
- </WebSocketProvider>
40
- )
41
- }
42
- ```
43
-
44
- `apiBasePath` lets each host application point at its own notifications endpoint, for example:
45
-
46
- - `"/data/notifications/me"`
47
- - `"/dynamic/notifications/me"`
17
+ import { installUnifiedToasts, registerModuleLabel } from '@asteby/metacore-notifications'
48
18
 
49
- ## Props
50
-
51
- | Prop | Type | Default | Notes |
52
- |----------------------------|-------------------------------------------|----------|-------|
53
- | `apiClient` | `NotificationsApiClient` (axios-compatible) | — | Never imported as a singleton — inject it. |
54
- | `apiBasePath` | `string` | — | e.g. `/data/notifications/me`. |
55
- | `enableBadge` | `boolean` | `true` | Drives `navigator.setAppBadge()`. |
56
- | `onNotificationClick` | `(n: NotificationItem) => void` | — | Navigate however you like. |
57
- | `perPage` | `number` | `20` | Initial fetch size. |
58
- | `locale` | `date-fns` `Locale` | `es` | Used by `formatDistanceToNow`. |
59
- | `labels` | `Partial<NotificationsDropdownLabels>` | — | i18n overrides. |
60
- | `subscribeToNotifications` | `(onMessage) => void \| () => void` | — | Bring-your-own subscription (skips `useWebSocketMessage`). |
19
+ installUnifiedToasts() // every toast.success/info/… → same card as the bell
20
+ registerModuleLabel('team_chat', 'Equipo') // optional extra chips
21
+ ```
61
22
 
62
- ## Hooks
23
+ ## Dropdown + SSE
63
24
 
64
- ```ts
65
- import { useAppBadge, useNotifications } from '@asteby/metacore-notifications/hooks'
25
+ ```tsx
26
+ import { NotificationsDropdown } from '@asteby/metacore-notifications'
27
+
28
+ <NotificationsDropdown
29
+ apiClient={api}
30
+ apiBasePath="/data/notifications/me"
31
+ sseUrl="/api/notifications/stream"
32
+ sseAccessToken={accessToken}
33
+ preferSse
34
+ showToastOnIngest
35
+ onNotificationClick={(n) => n.link && navigate({ to: n.link })}
36
+ />
66
37
  ```
67
38
 
68
- - `useAppBadge()` → `{ badgeCount, setBadge, clearBadge }` — wraps the
69
- PWA Badging API with a no-op fallback.
70
- - `useNotifications()` → `{ permission, isSupported, requestPermission,
71
- isGranted, isDenied, isDefault }` — tracks the browser's
72
- `Notification.permission` state.
39
+ ### Live transports
40
+
41
+ | Prop | Role |
42
+ |------|------|
43
+ | `sseUrl` | `EventSource` to host SSE (`event: notification`) |
44
+ | `subscribeToNotifications` | Bring-your-own bus (team-chat bridge, etc.) |
45
+ | built-in WS | Used when neither SSE-prefer nor custom subscribe is set |
73
46
 
74
- ## API contract
47
+ ### Visual contract (payload / metadata)
75
48
 
76
- The component expects the injected HTTP client to behave like axios:
49
+ - `icon` — Lucide kebab name (`shopping-cart`, `clipboard-list`, …)
50
+ - `type` — `info` \| `success` \| `warning` \| `error` → default colors
51
+ - `metadata.addon_key` / `apartado` — module chip (Inventario, Almacén, POS, …)
52
+ - `metadata.color` — optional CSS/hex override for the icon disc
77
53
 
78
- - `GET {apiBasePath}` with query `{ orderBy, orderDir, per_page }`
79
- returning `{ data: { data: NotificationItem[] } }`.
80
- - `PATCH {apiBasePath}/{id}` with body `{ is_read: true }`.
54
+ ## API
81
55
 
82
- WebSocket messages are expected under the discriminator `type: 'NOTIFICATION'`
83
- with a payload shaped like `NotificationWsPayload`.
56
+ - `GET {apiBasePath}` → `{ data: NotificationItem[] }`
57
+ - `PATCH {apiBasePath}/{id}` `{ is_read: true }`
58
+ - `GET /api/notifications/stream` — SSE (`?access_token=` for EventSource)
84
59
 
85
60
  ## License
86
61
 
@@ -1,14 +1,7 @@
1
1
  import type { NotificationsDropdownProps } from './types';
2
2
  /**
3
- * Bell-icon dropdown that lists the authenticated user's notifications,
4
- * marks them read, shows an unread counter (and optional PWA app badge),
5
- * and streams new items pushed over WebSocket under the `NOTIFICATION`
6
- * message type.
7
- *
8
- * This component is transport-agnostic: the HTTP client is injected via
9
- * `apiClient`. The collection base path is injected via `apiBasePath` —
10
- * the component fetches `GET {apiBasePath}?orderBy=created_at&...` and
11
- * mutates items via `PATCH {apiBasePath}/{id}`.
3
+ * Bell-icon dropdown: REST list + live ingest (SSE preferred, WebSocket
4
+ * fallback) + optional canonical card toast on every new item.
12
5
  */
13
- export declare function NotificationsDropdown({ apiClient, apiBasePath, enableBadge, onNotificationClick, perPage, locale, labels: labelsOverride, resolveImageUrl, subscribeToNotifications, }: NotificationsDropdownProps): import("react").JSX.Element;
6
+ export declare function NotificationsDropdown({ apiClient, apiBasePath, enableBadge, onNotificationClick, perPage, locale, labels: labelsOverride, resolveImageUrl, subscribeToNotifications, sseUrl, sseAccessToken, preferSse, showToastOnIngest, }: NotificationsDropdownProps): import("react").JSX.Element;
14
7
  //# sourceMappingURL=dropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../src/dropdown.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAIV,0BAA0B,EAC3B,MAAM,SAAS,CAAA;AA0GhB;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,WAAW,EACX,WAAkB,EAClB,mBAAmB,EACnB,OAAY,EACZ,MAAW,EACX,MAAM,EAAE,cAAc,EACtB,eAAe,EACf,wBAAwB,GACzB,EAAE,0BAA0B,+BAiL5B"}
1
+ {"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../src/dropdown.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAIV,0BAA0B,EAC3B,MAAM,SAAS,CAAA;AAuBhB;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,WAAW,EACX,WAAkB,EAClB,mBAAmB,EACnB,OAAY,EACZ,MAAW,EACX,MAAM,EAAE,cAAc,EACtB,eAAe,EACf,wBAAwB,EACxB,MAAM,EACN,cAAc,EACd,SAAS,EACT,iBAAwB,GACzB,EAAE,0BAA0B,+BA+L5B"}
package/dist/dropdown.js CHANGED
@@ -7,11 +7,9 @@ import { formatDistanceToNow } from 'date-fns';
7
7
  import { es } from 'date-fns/locale';
8
8
  import { toast } from 'sonner';
9
9
  import { useAppBadge } from './hooks';
10
- /** Convert kebab-case to PascalCase ("message-circle" -> "MessageCircle"). */
11
- const toPascalCase = (str) => str
12
- .split('-')
13
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
14
- .join('');
10
+ import { subscribeNotificationSSE } from './sse';
11
+ import { showNotificationToast } from './toast';
12
+ import { moduleLabelFromMeta, parseNotificationMeta, resolveNotificationIcon, resolveNotificationTone, } from './visual';
15
13
  const DEFAULT_LABELS = {
16
14
  title: 'Notificaciones',
17
15
  newBadge: (count) => `${count} nuevas`,
@@ -25,93 +23,17 @@ const DEFAULT_LABELS = {
25
23
  permissionRequired: 'Permisos requeridos',
26
24
  srLabel: 'Notificaciones',
27
25
  };
28
- const getIconFor = (notification) => {
29
- if (notification.icon) {
30
- const pascalName = toPascalCase(notification.icon);
31
- const DynamicIcon = LucideIcons[pascalName];
32
- if (DynamicIcon)
33
- return DynamicIcon;
34
- }
35
- switch (notification.type) {
36
- case 'warning':
37
- return LucideIcons.AlertTriangle;
38
- case 'success':
39
- return LucideIcons.CheckCircle2;
40
- case 'error':
41
- return LucideIcons.XCircle;
42
- case 'info':
43
- default:
44
- return LucideIcons.Info;
45
- }
46
- };
47
- const getStyle = (type) => {
48
- switch (type) {
49
- case 'warning':
50
- return 'bg-amber-500 text-white';
51
- case 'success':
52
- return 'bg-emerald-500 text-white';
53
- case 'error':
54
- return 'bg-red-500 text-white';
55
- case 'info':
56
- default:
57
- return 'bg-violet-600 text-white';
58
- }
59
- };
60
- const getRowAccent = (type) => {
61
- switch (type) {
62
- case 'warning':
63
- return 'border-l-amber-500';
64
- case 'success':
65
- return 'border-l-emerald-500';
66
- case 'error':
67
- return 'border-l-red-500';
68
- case 'info':
69
- default:
70
- return 'border-l-violet-500';
71
- }
72
- };
73
- function parseMeta(raw) {
74
- if (!raw)
75
- return {};
76
- try {
77
- const v = typeof raw === 'string' ? JSON.parse(raw) : raw;
78
- return (v && typeof v === 'object' ? v : {});
79
- }
80
- catch {
81
- return {};
82
- }
83
- }
84
- function moduleLabel(meta) {
85
- const key = (meta.addon_key || '').trim();
86
- const map = {
87
- inventory: 'Inventario',
88
- warehouse: 'Almacén',
89
- customers: 'Clientes',
90
- pos: 'POS',
91
- fiscal_mexico: 'Fiscal',
92
- workshop: 'Taller',
93
- accounting_lite: 'Contabilidad',
94
- };
95
- return map[key] || (key ? key.replace(/_/g, ' ') : '');
96
- }
97
26
  /**
98
- * Bell-icon dropdown that lists the authenticated user's notifications,
99
- * marks them read, shows an unread counter (and optional PWA app badge),
100
- * and streams new items pushed over WebSocket under the `NOTIFICATION`
101
- * message type.
102
- *
103
- * This component is transport-agnostic: the HTTP client is injected via
104
- * `apiClient`. The collection base path is injected via `apiBasePath` —
105
- * the component fetches `GET {apiBasePath}?orderBy=created_at&...` and
106
- * mutates items via `PATCH {apiBasePath}/{id}`.
27
+ * Bell-icon dropdown: REST list + live ingest (SSE preferred, WebSocket
28
+ * fallback) + optional canonical card toast on every new item.
107
29
  */
108
- export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = true, onNotificationClick, perPage = 20, locale = es, labels: labelsOverride, resolveImageUrl, subscribeToNotifications, }) {
30
+ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = true, onNotificationClick, perPage = 20, locale = es, labels: labelsOverride, resolveImageUrl, subscribeToNotifications, sseUrl, sseAccessToken, preferSse, showToastOnIngest = true, }) {
109
31
  const labels = useMemo(() => ({ ...DEFAULT_LABELS, ...labelsOverride }), [labelsOverride]);
110
32
  const [notifications, setNotifications] = useState([]);
111
33
  const [unreadCount, setUnreadCount] = useState(0);
112
34
  const [, setLoading] = useState(false);
113
35
  const { setBadge } = useAppBadge();
114
- // Keep fetch callbacks stable across apiClient / basePath changes.
36
+ const seenIdsRef = useRef(new Set());
115
37
  const apiClientRef = useRef(apiClient);
116
38
  apiClientRef.current = apiClient;
117
39
  const basePathRef = useRef(apiBasePath);
@@ -134,6 +56,7 @@ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = tr
134
56
  const items = response.data?.data ?? [];
135
57
  setNotifications(items);
136
58
  setUnreadCount(items.filter((n) => !n.is_read).length);
59
+ seenIdsRef.current = new Set(items.map((n) => n.id));
137
60
  }
138
61
  catch (error) {
139
62
  // eslint-disable-next-line no-console
@@ -146,12 +69,28 @@ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = tr
146
69
  useEffect(() => {
147
70
  fetchNotifications();
148
71
  }, [fetchNotifications, apiBasePath]);
149
- // Normalise an incoming WS payload + prepend it to the list.
150
72
  const ingestWsPayload = useCallback((payload) => {
151
- const newNotification = {
152
- id: payload.id || (typeof crypto !== 'undefined' && 'randomUUID' in crypto
73
+ const id = payload.id ||
74
+ (typeof crypto !== 'undefined' && 'randomUUID' in crypto
153
75
  ? crypto.randomUUID()
154
- : `${Date.now()}-${Math.random()}`),
76
+ : `${Date.now()}-${Math.random()}`);
77
+ if (seenIdsRef.current.has(id))
78
+ return;
79
+ seenIdsRef.current.add(id);
80
+ const metaObj = typeof payload.metadata === 'object' && payload.metadata
81
+ ? { ...payload.metadata }
82
+ : parseNotificationMeta(typeof payload.metadata === 'string' ? payload.metadata : undefined);
83
+ if (payload.addon_key)
84
+ metaObj.addon_key = payload.addon_key;
85
+ if (payload.apartado)
86
+ metaObj.apartado = payload.apartado;
87
+ if (payload.color)
88
+ metaObj.color = payload.color;
89
+ const metadataStr = typeof payload.metadata === 'string'
90
+ ? payload.metadata
91
+ : JSON.stringify(metaObj);
92
+ const newNotification = {
93
+ id,
155
94
  title: payload.title,
156
95
  message: payload.body || payload.message || payload.description || '',
157
96
  type: payload.type || 'info',
@@ -160,20 +99,38 @@ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = tr
160
99
  link: payload.link,
161
100
  icon: payload.icon,
162
101
  image: payload.image,
163
- metadata: payload.metadata,
102
+ metadata: metadataStr,
164
103
  conversation_id: payload.conversation_id,
165
104
  };
166
105
  setNotifications((prev) => [newNotification, ...prev]);
167
106
  setUnreadCount((prev) => prev + 1);
107
+ if (showToastOnIngest) {
108
+ showNotificationToast({
109
+ title: payload.title,
110
+ body: payload.body || payload.message || payload.description,
111
+ type: payload.type || 'info',
112
+ icon: payload.icon,
113
+ image: payload.image,
114
+ apartado: payload.apartado,
115
+ addonKey: payload.addon_key || metaObj.addon_key,
116
+ metadata: metaObj,
117
+ onClick: () => {
118
+ if (onNotificationClick)
119
+ onNotificationClick(newNotification);
120
+ else if (payload.link?.startsWith('http'))
121
+ window.open(payload.link, '_blank');
122
+ },
123
+ });
124
+ }
168
125
  if (typeof window !== 'undefined' &&
169
126
  'Notification' in window &&
170
127
  Notification.permission !== 'granted') {
171
128
  window.dispatchEvent(new CustomEvent('show-notification-prompt'));
172
129
  }
173
- }, []);
174
- // WebSocket wiring: use provided hook unless caller supplies a custom
175
- // subscription. We always run one of the two branches exactly once.
130
+ }, [showToastOnIngest, onNotificationClick]);
176
131
  const useCustomSubscription = Boolean(subscribeToNotifications);
132
+ const useSse = Boolean(sseUrl);
133
+ const skipBuiltInWs = useCustomSubscription || (useSse && preferSse !== false);
177
134
  useEffect(() => {
178
135
  if (!useCustomSubscription || !subscribeToNotifications)
179
136
  return;
@@ -183,36 +140,17 @@ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = tr
183
140
  unsub();
184
141
  };
185
142
  }, [useCustomSubscription, subscribeToNotifications, ingestWsPayload]);
186
- // Hooks must be called unconditionally. When the caller overrides the
187
- // subscription we still call `useWebSocketMessage` but with a no-op —
188
- // this requires a provider in context even when unused, so we skip it
189
- // entirely via a separate component when override is present.
190
- return useCustomSubscription ? (_jsx(DropdownShell, { labels: labels, locale: locale, notifications: notifications, unreadCount: unreadCount, resolveImageUrl: resolveImageUrl, onMarkAsRead: async (id) => {
191
- setNotifications((prev) => prev.map((n) => (n.id === id ? { ...n, is_read: true } : n)));
192
- setUnreadCount((prev) => Math.max(0, prev - 1));
193
- try {
194
- await apiClientRef.current.patch(`${basePathRef.current}/${id}`, {
195
- is_read: true,
196
- });
197
- }
198
- catch (error) {
199
- // eslint-disable-next-line no-console
200
- console.error('Failed to mark notification as read:', error);
201
- }
202
- }, onMarkAllAsRead: async () => {
203
- const unreadIds = notifications.filter((n) => !n.is_read).map((n) => n.id);
204
- setNotifications((prev) => prev.map((n) => ({ ...n, is_read: true })));
205
- setUnreadCount(0);
206
- try {
207
- await Promise.all(unreadIds.map((id) => apiClientRef.current.patch(`${basePathRef.current}/${id}`, {
208
- is_read: true,
209
- })));
210
- }
211
- catch (error) {
212
- // eslint-disable-next-line no-console
213
- console.error('Failed to mark all as read:', error);
214
- }
215
- }, onNotificationClick: onNotificationClick })) : (_jsx(DropdownWithWebSocket, { labels: labels, locale: locale, notifications: notifications, unreadCount: unreadCount, resolveImageUrl: resolveImageUrl, ingestWsPayload: ingestWsPayload, onMarkAsRead: async (id) => {
143
+ useEffect(() => {
144
+ if (!useSse || !sseUrl)
145
+ return;
146
+ return subscribeNotificationSSE({
147
+ url: sseUrl,
148
+ accessToken: sseAccessToken,
149
+ onMessage: ingestWsPayload,
150
+ });
151
+ }, [useSse, sseUrl, sseAccessToken, ingestWsPayload]);
152
+ const markHandlers = {
153
+ onMarkAsRead: async (id) => {
216
154
  setNotifications((prev) => prev.map((n) => (n.id === id ? { ...n, is_read: true } : n)));
217
155
  setUnreadCount((prev) => Math.max(0, prev - 1));
218
156
  try {
@@ -224,7 +162,8 @@ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = tr
224
162
  // eslint-disable-next-line no-console
225
163
  console.error('Failed to mark notification as read:', error);
226
164
  }
227
- }, onMarkAllAsRead: async () => {
165
+ },
166
+ onMarkAllAsRead: async () => {
228
167
  const unreadIds = notifications.filter((n) => !n.is_read).map((n) => n.id);
229
168
  setNotifications((prev) => prev.map((n) => ({ ...n, is_read: true })));
230
169
  setUnreadCount(0);
@@ -237,7 +176,18 @@ export function NotificationsDropdown({ apiClient, apiBasePath, enableBadge = tr
237
176
  // eslint-disable-next-line no-console
238
177
  console.error('Failed to mark all as read:', error);
239
178
  }
240
- }, onNotificationClick: onNotificationClick }));
179
+ },
180
+ };
181
+ const shellProps = {
182
+ labels,
183
+ locale,
184
+ notifications,
185
+ unreadCount,
186
+ resolveImageUrl,
187
+ onNotificationClick,
188
+ ...markHandlers,
189
+ };
190
+ return skipBuiltInWs ? (_jsx(DropdownShell, { ...shellProps })) : (_jsx(DropdownWithWebSocket, { ingestWsPayload: ingestWsPayload, ...shellProps }));
241
191
  }
242
192
  function DropdownWithWebSocket({ ingestWsPayload, ...rest }) {
243
193
  useWebSocketMessage('NOTIFICATION', (message) => {
@@ -252,12 +202,13 @@ function DropdownShell({ labels, locale, notifications, unreadCount, resolveImag
252
202
  ? Notification.permission
253
203
  : null;
254
204
  return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: 'ghost', size: 'icon', className: 'relative', children: [notificationApiAvailable && permission !== 'granted' ? (_jsxs("div", { className: 'relative', children: [_jsx(LucideIcons.BellOff, { className: 'h-[1.2rem] w-[1.2rem] text-muted-foreground' }), permission === 'default' && (_jsx("span", { className: 'absolute -top-1 -right-1 h-2.5 w-2.5 rounded-full bg-yellow-500 ring-2 ring-background', title: labels.permissionRequired }))] })) : (_jsx(LucideIcons.Bell, { className: 'h-[1.2rem] w-[1.2rem] text-foreground' })), unreadCount > 0 && (_jsxs("span", { className: 'absolute -top-1 -right-1 flex h-5 min-w-5 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-bold text-primary-foreground shadow-sm ring-2 ring-background', children: [unreadCount, _jsx("span", { className: 'animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75' })] })), _jsx("span", { className: 'sr-only', children: labels.srLabel })] }) }), _jsxs(DropdownMenuContent, { className: 'w-85 sm:w-96 p-0', align: 'end', forceMount: true, children: [_jsx(DropdownMenuLabel, { className: 'p-4 font-normal border-b', children: _jsxs("div", { className: 'flex items-center justify-between', children: [_jsx("p", { className: 'text-sm font-semibold', children: labels.title }), unreadCount > 0 && (_jsx("span", { className: 'rounded-full bg-primary/10 px-2 py-0.5 text-xs font-medium text-primary', children: labels.newBadge(unreadCount) }))] }) }), _jsx(DropdownMenuGroup, { className: 'max-h-[350px] overflow-y-auto', children: notifications.length === 0 ? (_jsx("div", { className: 'p-8 text-center text-muted-foreground text-sm', children: labels.empty })) : (notifications.map((notification) => {
255
- const Icon = getIconFor(notification);
256
- const meta = parseMeta(notification.metadata);
257
- const mod = moduleLabel(meta);
258
- return (_jsx(DropdownMenuItem, { className: `cursor-pointer p-3 sm:p-4 focus:bg-muted/50 data-[state=open]:bg-muted/50 border-l-2 ${getRowAccent(notification.type)} ${!notification.is_read ? 'bg-primary/[0.03]' : ''}`, onClick: () => {
205
+ const meta = parseNotificationMeta(notification.metadata);
206
+ const Icon = resolveNotificationIcon(notification.icon, notification.type);
207
+ const tone = resolveNotificationTone(notification.type, meta);
208
+ const mod = moduleLabelFromMeta(meta);
209
+ return (_jsx(DropdownMenuItem, { className: `cursor-pointer border-l-2 p-3 focus:bg-muted/50 data-[state=open]:bg-muted/50 sm:p-4 ${tone.rowAccentClass} ${!notification.is_read ? 'bg-primary/[0.03]' : ''}`, onClick: () => {
259
210
  if (!notification.is_read)
260
- onMarkAsRead(notification.id);
211
+ void onMarkAsRead(notification.id);
261
212
  if (onNotificationClick) {
262
213
  onNotificationClick(notification);
263
214
  }
@@ -265,11 +216,11 @@ function DropdownShell({ labels, locale, notifications, unreadCount, resolveImag
265
216
  notification.link.startsWith('http')) {
266
217
  window.open(notification.link, '_blank');
267
218
  }
268
- }, children: _jsxs("div", { className: 'flex items-start gap-3 w-full', children: [_jsx(NotificationAvatar, { notification: notification, Icon: Icon, resolveImageUrl: resolveImageUrl }), _jsxs("div", { className: 'flex flex-col gap-1.5 w-full min-w-0', children: [_jsxs("div", { className: 'flex items-center justify-between gap-2', children: [_jsx("p", { className: `text-sm leading-snug truncate ${!notification.is_read ? 'font-semibold text-foreground' : 'font-medium text-foreground/80'}`, children: notification.title }), _jsx("span", { className: 'text-[10px] text-muted-foreground whitespace-nowrap shrink-0', children: formatDistanceToNow(new Date(notification.created_at), {
219
+ }, children: _jsxs("div", { className: 'flex w-full items-start gap-3', children: [_jsx(NotificationAvatar, { notification: notification, Icon: Icon, toneClass: tone.iconClass, customColor: tone.customColor, resolveImageUrl: resolveImageUrl }), _jsxs("div", { className: 'flex min-w-0 w-full flex-col gap-1.5', children: [_jsxs("div", { className: 'flex items-center justify-between gap-2', children: [_jsx("p", { className: `truncate text-sm leading-snug ${!notification.is_read ? 'font-semibold text-foreground' : 'font-medium text-foreground/80'}`, children: notification.title }), _jsx("span", { className: 'shrink-0 whitespace-nowrap text-[10px] text-muted-foreground', children: formatDistanceToNow(new Date(notification.created_at), {
269
220
  addSuffix: true,
270
221
  locale,
271
- }) })] }), notification.message ? (_jsx("p", { className: 'text-xs text-muted-foreground line-clamp-2 leading-relaxed', children: notification.message })) : null, mod ? (_jsx("div", { className: 'flex items-center gap-1.5 pt-0.5', children: _jsx("span", { className: 'inline-flex items-center rounded-md bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground capitalize', children: mod }) })) : null] }), !notification.is_read && (_jsx("div", { className: 'self-center shrink-0', children: _jsx("div", { className: 'h-2 w-2 rounded-full bg-primary shadow-sm' }) }))] }) }, notification.id));
272
- })) }), notifications.length > 0 && (_jsx("div", { className: 'p-2 border-t bg-muted/20', children: _jsx(Button, { variant: 'ghost', size: 'sm', className: 'w-full text-xs h-8', onClick: () => void onMarkAllAsRead(), children: labels.markAllAsRead }) })), notificationApiAvailable && permission !== 'granted' && (_jsx("div", { className: 'p-2 border-t bg-muted/20', children: _jsxs(Button, { variant: 'outline', size: 'sm', className: 'w-full text-xs h-8 gap-2 bg-primary/10 hover:bg-primary/20 text-primary border-primary/20', onClick: async () => {
222
+ }) })] }), notification.message ? (_jsx("p", { className: 'line-clamp-2 text-xs leading-relaxed text-muted-foreground', children: notification.message })) : null, mod ? (_jsx("div", { className: 'flex items-center gap-1.5 pt-0.5', children: _jsx("span", { className: 'inline-flex items-center rounded-md bg-muted px-1.5 py-0.5 text-[10px] font-medium capitalize text-muted-foreground', children: mod }) })) : null] }), !notification.is_read && (_jsx("div", { className: 'shrink-0 self-center', children: _jsx("div", { className: 'h-2 w-2 rounded-full bg-primary shadow-sm' }) }))] }) }, notification.id));
223
+ })) }), notifications.length > 0 && (_jsx("div", { className: 'border-t bg-muted/20 p-2', children: _jsx(Button, { variant: 'ghost', size: 'sm', className: 'h-8 w-full text-xs', onClick: () => void onMarkAllAsRead(), children: labels.markAllAsRead }) })), notificationApiAvailable && permission !== 'granted' && (_jsx("div", { className: 'border-t bg-muted/20 p-2', children: _jsxs(Button, { variant: 'outline', size: 'sm', className: 'h-8 w-full gap-2 border-primary/20 bg-primary/10 text-xs text-primary hover:bg-primary/20', onClick: async () => {
273
224
  try {
274
225
  const next = await Notification.requestPermission();
275
226
  if (next === 'granted') {
@@ -287,15 +238,14 @@ function DropdownShell({ labels, locale, notifications, unreadCount, resolveImag
287
238
  }
288
239
  }, children: [_jsx(LucideIcons.BellRing, { className: 'h-3 w-3' }), labels.enableNotifications] }) }))] })] }));
289
240
  }
290
- /** Avatar + type badge. Resolves storage paths and falls back if the image 404s. */
291
- function NotificationAvatar({ notification, Icon, resolveImageUrl, }) {
241
+ function NotificationAvatar({ notification, Icon, toneClass, customColor, resolveImageUrl, }) {
292
242
  const [failed, setFailed] = useState(false);
293
243
  const raw = (notification.image || '').trim();
294
244
  const resolved = raw && !failed ? (resolveImageUrl ? resolveImageUrl(raw) : raw) : '';
295
245
  const showPhoto = Boolean(resolved);
296
246
  if (showPhoto) {
297
- return (_jsxs("div", { className: 'relative shrink-0', children: [_jsx("img", { src: resolved, alt: '', className: 'h-10 w-10 rounded-full object-cover border border-muted/40 shadow-sm', onError: () => setFailed(true) }), _jsx("div", { className: 'absolute -bottom-1 -right-1 flex size-6 items-center justify-center rounded-full bg-background p-1 text-primary shadow-sm ring-1 ring-border', children: _jsx(Icon, { className: 'size-3.5 text-current', strokeWidth: 2.25 }) })] }));
247
+ return (_jsxs("div", { className: 'relative shrink-0', children: [_jsx("img", { src: resolved, alt: '', className: 'h-10 w-10 rounded-full border border-muted/40 object-cover shadow-sm', onError: () => setFailed(true) }), _jsx("div", { className: 'absolute -bottom-1 -right-1 flex size-6 items-center justify-center rounded-full bg-background p-1 text-primary shadow-sm ring-1 ring-border', children: _jsx(Icon, { className: 'size-3.5 text-current', strokeWidth: 2.25 }) })] }));
298
248
  }
299
- return (_jsx("div", { className: `flex h-10 w-10 shrink-0 items-center justify-center rounded-full shadow-sm ring-1 ring-inset ring-black/5 ${getStyle(notification.type)}`, children: _jsx(Icon, { className: 'h-5 w-5 text-white', strokeWidth: 2.5 }) }));
249
+ return (_jsx("div", { className: `flex h-10 w-10 shrink-0 items-center justify-center rounded-full shadow-sm ring-1 ring-inset ring-black/5 ${toneClass}`, style: customColor ? { backgroundColor: customColor, color: '#fff' } : undefined, children: _jsx(Icon, { className: 'h-5 w-5', strokeWidth: 2.5 }) }));
300
250
  }
301
251
  //# sourceMappingURL=dropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../src/dropdown.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dropdown.js","sourceRoot":"","sources":["../src/dropdown.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export { NotificationsDropdown } from './dropdown';
2
2
  export { useAppBadge, useNotifications } from './hooks';
3
+ export { showNotificationToast, installUnifiedToasts, type ShowNotificationToastOptions, } from './toast';
4
+ export { subscribeNotificationSSE, useNotificationSSE, type NotificationStreamOptions, } from './sse';
5
+ export { resolveNotificationVisual, resolveNotificationIcon, resolveNotificationTone, moduleLabelFromMeta, parseNotificationMeta, registerModuleLabel, toPascalCase, type NotificationMeta, type NotificationTone, } from './visual';
3
6
  export type { NotificationItem, NotificationType, NotificationsApiClient, NotificationWsPayload, NotificationsDropdownLabels, NotificationsDropdownProps, } from './types';
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACvD,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,4BAA4B,GAClC,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,yBAAyB,GAC/B,MAAM,OAAO,CAAA;AACd,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,6 @@
1
1
  export { NotificationsDropdown } from './dropdown';
2
2
  export { useAppBadge, useNotifications } from './hooks';
3
+ export { showNotificationToast, installUnifiedToasts, } from './toast';
4
+ export { subscribeNotificationSSE, useNotificationSSE, } from './sse';
5
+ export { resolveNotificationVisual, resolveNotificationIcon, resolveNotificationTone, moduleLabelFromMeta, parseNotificationMeta, registerModuleLabel, toPascalCase, } from './visual';
3
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,OAAO,CAAA;AACd,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,GAGb,MAAM,UAAU,CAAA"}
package/dist/sse.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type { NotificationWsPayload } from './types';
2
+ export type NotificationStreamOptions = {
3
+ /** Absolute or same-origin URL, e.g. `/api/notifications/stream` */
4
+ url: string;
5
+ /** Bearer token (EventSource cannot set headers — pass as `?access_token=` if needed). */
6
+ accessToken?: string | null;
7
+ /** Called for every `notification` SSE event (and unnamed events with JSON body). */
8
+ onMessage: (payload: NotificationWsPayload) => void;
9
+ /** Optional Last-Event-ID resume cursor (notification id / sequence). */
10
+ lastEventId?: string | null;
11
+ enabled?: boolean;
12
+ };
13
+ /**
14
+ * Subscribe to the host's SSE notification stream (`text/event-stream`).
15
+ * Prefer this over WebSocket for bell fan-out: auto-reconnect, Last-Event-ID,
16
+ * and no socket multiplexing with chat/presence.
17
+ *
18
+ * Returns an unsubscribe function. No-ops when `EventSource` is unavailable.
19
+ */
20
+ export declare function subscribeNotificationSSE(opts: NotificationStreamOptions): () => void;
21
+ /**
22
+ * React helper: open SSE for the lifetime of the component.
23
+ * Prefer passing a stable `onMessage` (useCallback).
24
+ */
25
+ export declare function useNotificationSSE(opts: NotificationStreamOptions): void;
26
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAEpD,MAAM,MAAM,yBAAyB,GAAG;IACtC,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAA;IACX,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,qFAAqF;IACrF,SAAS,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACnD,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AASD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,yBAAyB,GAC9B,MAAM,IAAI,CAgCZ;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAWxE"}
package/dist/sse.js ADDED
@@ -0,0 +1,64 @@
1
+ import { useEffect, useRef } from 'react';
2
+ function buildUrl(base, accessToken, lastEventId) {
3
+ const u = new URL(base, typeof window !== 'undefined' ? window.location.origin : 'http://local');
4
+ if (accessToken)
5
+ u.searchParams.set('access_token', accessToken);
6
+ if (lastEventId)
7
+ u.searchParams.set('last_event_id', lastEventId);
8
+ return u.pathname + u.search;
9
+ }
10
+ /**
11
+ * Subscribe to the host's SSE notification stream (`text/event-stream`).
12
+ * Prefer this over WebSocket for bell fan-out: auto-reconnect, Last-Event-ID,
13
+ * and no socket multiplexing with chat/presence.
14
+ *
15
+ * Returns an unsubscribe function. No-ops when `EventSource` is unavailable.
16
+ */
17
+ export function subscribeNotificationSSE(opts) {
18
+ if (typeof window === 'undefined' || typeof EventSource === 'undefined') {
19
+ return () => { };
20
+ }
21
+ if (opts.enabled === false || !opts.url)
22
+ return () => { };
23
+ const url = buildUrl(opts.url, opts.accessToken, opts.lastEventId);
24
+ const es = new EventSource(url, { withCredentials: true });
25
+ const handle = (ev) => {
26
+ try {
27
+ const data = typeof ev.data === 'string' ? JSON.parse(ev.data) : ev.data;
28
+ if (!data || typeof data !== 'object')
29
+ return;
30
+ // Accept either bare payload or { type, payload } envelope.
31
+ const payload = data.type === 'NOTIFICATION' && data.payload
32
+ ? data.payload
33
+ : data.title
34
+ ? data
35
+ : null;
36
+ if (payload?.title)
37
+ opts.onMessage(payload);
38
+ }
39
+ catch {
40
+ // ignore malformed frames
41
+ }
42
+ };
43
+ es.addEventListener('notification', handle);
44
+ es.onmessage = handle;
45
+ return () => {
46
+ es.close();
47
+ };
48
+ }
49
+ /**
50
+ * React helper: open SSE for the lifetime of the component.
51
+ * Prefer passing a stable `onMessage` (useCallback).
52
+ */
53
+ export function useNotificationSSE(opts) {
54
+ const onMessageRef = useRef(opts.onMessage);
55
+ onMessageRef.current = opts.onMessage;
56
+ useEffect(() => {
57
+ return subscribeNotificationSSE({
58
+ ...opts,
59
+ onMessage: (p) => onMessageRef.current(p),
60
+ });
61
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- url/token/enabled are the live deps
62
+ }, [opts.url, opts.accessToken, opts.lastEventId, opts.enabled]);
63
+ }
64
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { NotificationType } from './types';
2
+ export type ShowNotificationToastOptions = {
3
+ title: string;
4
+ body?: string;
5
+ type?: NotificationType | string;
6
+ icon?: string;
7
+ image?: string;
8
+ /** Inventario / Almacén / POS — or pass metadata.addon_key */
9
+ apartado?: string;
10
+ metadata?: string | Record<string, unknown>;
11
+ addonKey?: string;
12
+ duration?: number;
13
+ onClick?: () => void;
14
+ };
15
+ /**
16
+ * Canonical in-app notification toast — same card as the bell dropdown
17
+ * (dynamic Lucide icon, severity color, module chip).
18
+ */
19
+ export declare function showNotificationToast(opts: ShowNotificationToastOptions): void;
20
+ /**
21
+ * Patch the shared sonner singleton so every `toast.success/info/warning/error`
22
+ * (host + Module Federation remotes) renders the same card as WS/SSE notifications.
23
+ * Call once at app boot (e.g. main.tsx).
24
+ */
25
+ export declare function installUnifiedToasts(): void;
26
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI,CA4D9E;AA0BD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAyB3C"}
package/dist/toast.js ADDED
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { toast } from 'sonner';
3
+ import { resolveNotificationVisual } from './visual';
4
+ /**
5
+ * Canonical in-app notification toast — same card as the bell dropdown
6
+ * (dynamic Lucide icon, severity color, module chip).
7
+ */
8
+ export function showNotificationToast(opts) {
9
+ const meta = typeof opts.metadata === 'object' && opts.metadata
10
+ ? { ...opts.metadata }
11
+ : opts.metadata;
12
+ const { Icon, tone, moduleLabel } = resolveNotificationVisual({
13
+ icon: opts.icon,
14
+ type: opts.type,
15
+ metadata: meta,
16
+ addonKey: opts.addonKey,
17
+ });
18
+ const apartado = (opts.apartado || moduleLabel || '').trim();
19
+ const duration = opts.duration ?? 5000;
20
+ toast.custom((id) => (_jsxs("button", { type: 'button', className: [
21
+ 'flex w-full min-w-[280px] max-w-[360px] items-start gap-3 rounded-xl border border-border/60 bg-card p-3 text-left shadow-lg ring-1 ring-black/5',
22
+ opts.onClick ? 'cursor-pointer hover:bg-accent/40' : '',
23
+ ]
24
+ .filter(Boolean)
25
+ .join(' '), onClick: () => {
26
+ opts.onClick?.();
27
+ toast.dismiss(id);
28
+ }, children: [opts.image ? (_jsx("img", { src: opts.image, alt: '', className: 'mt-0.5 h-9 w-9 shrink-0 rounded-full object-cover' })) : (_jsx("span", { className: `mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full ${tone.iconClass}`, style: tone.customColor ? { backgroundColor: tone.customColor, color: '#fff' } : undefined, children: _jsx(Icon, { className: 'h-4 w-4', "aria-hidden": true }) })), _jsxs("span", { className: 'min-w-0 flex-1', children: [apartado ? (_jsx("span", { className: 'mb-0.5 inline-flex items-center rounded-md bg-muted px-1.5 py-0.5 text-[10px] font-medium capitalize text-muted-foreground', children: apartado })) : null, _jsx("span", { className: 'block text-sm font-semibold text-foreground', children: opts.title }), opts.body ? (_jsx("span", { className: 'mt-0.5 block text-xs text-muted-foreground line-clamp-2', children: opts.body })) : null] })] })), { duration });
29
+ }
30
+ function extract(message, data) {
31
+ const title = typeof message === 'string' ? message : message == null ? 'Notificación' : String(message);
32
+ const body = typeof data?.description === 'string' ? data.description : undefined;
33
+ return {
34
+ title,
35
+ body,
36
+ duration: typeof data?.duration === 'number' ? data.duration : undefined,
37
+ apartado: typeof data?.apartado === 'string' ? data.apartado : undefined,
38
+ icon: typeof data?.icon === 'string' ? data.icon : undefined,
39
+ metadata: data?.metadata,
40
+ };
41
+ }
42
+ let installed = false;
43
+ /**
44
+ * Patch the shared sonner singleton so every `toast.success/info/warning/error`
45
+ * (host + Module Federation remotes) renders the same card as WS/SSE notifications.
46
+ * Call once at app boot (e.g. main.tsx).
47
+ */
48
+ export function installUnifiedToasts() {
49
+ if (installed || typeof window === 'undefined')
50
+ return;
51
+ installed = true;
52
+ const wrap = (type, defaultIcon) => (message, data) => {
53
+ const x = extract(message, data);
54
+ showNotificationToast({
55
+ title: x.title,
56
+ body: x.body,
57
+ type,
58
+ icon: x.icon || defaultIcon,
59
+ duration: x.duration,
60
+ apartado: x.apartado,
61
+ metadata: x.metadata,
62
+ });
63
+ return '';
64
+ };
65
+ toast.success = wrap('success', 'check-circle-2');
66
+ toast.info = wrap('info', 'info');
67
+ toast.warning = wrap('warning', 'alert-triangle');
68
+ toast.error = wrap('error', 'x-circle');
69
+ toast.message = wrap('info', 'bell');
70
+ }
71
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAA;AAiBpD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAkC;IACtE,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAChD,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;QACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;IACnB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,yBAAyB,CAAC;QAC5D,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAA2D;QACrE,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAA;IAEtC,KAAK,CAAC,MAAM,CACV,CAAC,EAAE,EAAE,EAAE,CAAC,CACN,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE;YACT,kJAAkJ;YAClJ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EAAE;SACxD;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,EACZ,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC,OAAO,EAAE,EAAE,CAAA;YAChB,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACnB,CAAC,aAEA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACZ,cACE,GAAG,EAAE,IAAI,CAAC,KAAK,EACf,GAAG,EAAC,EAAE,EACN,SAAS,EAAC,mDAAmD,GAC7D,CACH,CAAC,CAAC,CAAC,CACF,eACE,SAAS,EAAE,yEAAyE,IAAI,CAAC,SAAS,EAAE,EACpG,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,YAE1F,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,wBAAe,GACnC,CACR,EACD,gBAAM,SAAS,EAAC,gBAAgB,aAC7B,QAAQ,CAAC,CAAC,CAAC,CACV,eAAM,SAAS,EAAC,4HAA4H,YACzI,QAAQ,GACJ,CACR,CAAC,CAAC,CAAC,IAAI,EACR,eAAM,SAAS,EAAC,6CAA6C,YAAE,IAAI,CAAC,KAAK,GAAQ,EAChF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACX,eAAM,SAAS,EAAC,yDAAyD,YACtE,IAAI,CAAC,IAAI,GACL,CACR,CAAC,CAAC,CAAC,IAAI,IACH,IACA,CACV,EACD,EAAE,QAAQ,EAAE,CACb,CAAA;AACH,CAAC;AAUD,SAAS,OAAO,CAAC,OAAgB,EAAE,IAAgB;IACjD,MAAM,KAAK,GACT,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC5F,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;IACjF,OAAO;QACL,KAAK;QACL,IAAI;QACJ,QAAQ,EAAE,OAAO,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACxE,QAAQ,EAAE,OAAO,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACxE,IAAI,EAAE,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAC5D,QAAQ,EAAE,IAAI,EAAE,QAAQ;KACzB,CAAA;AACH,CAAC;AAED,IAAI,SAAS,GAAG,KAAK,CAAA;AAErB;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,SAAS,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAM;IACtD,SAAS,GAAG,IAAI,CAAA;IAEhB,MAAM,IAAI,GACR,CAAC,IAAsB,EAAE,WAAmB,EAAE,EAAE,CAChD,CAAC,OAAgB,EAAE,IAAgB,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAChC,qBAAqB,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI;YACJ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,WAAW;YAC3B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAA;QACF,OAAO,EAAsC,CAAA;IAC/C,CAAC,CAAA;IAEH,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAyB,CAAA;IACzE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAsB,CAAA;IACtD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAyB,CAAA;IACzE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAuB,CAAA;IAC7D,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAyB,CAAA;AAC9D,CAAC"}
package/dist/types.d.ts CHANGED
@@ -19,7 +19,8 @@ export interface NotificationItem {
19
19
  link?: string;
20
20
  icon?: string;
21
21
  image?: string;
22
- metadata?: string;
22
+ /** JSON string or already-parsed object (addon_key, color, …). */
23
+ metadata?: string | Record<string, unknown>;
23
24
  conversation_id?: string;
24
25
  }
25
26
  /**
@@ -38,8 +39,7 @@ export interface NotificationsApiClient {
38
39
  }>;
39
40
  }
40
41
  /**
41
- * Shape of a WebSocket `NOTIFICATION` payload. Consumers may provide any
42
- * of these fields; the component normalises them into a `NotificationItem`.
42
+ * Shape of a live `NOTIFICATION` payload (WebSocket or SSE).
43
43
  */
44
44
  export interface NotificationWsPayload {
45
45
  id?: string;
@@ -51,8 +51,13 @@ export interface NotificationWsPayload {
51
51
  link?: string;
52
52
  icon?: string;
53
53
  image?: string;
54
- metadata?: string;
54
+ metadata?: string | Record<string, unknown>;
55
55
  conversation_id?: string;
56
+ /** Optional explicit module chip (overrides metadata.addon_key map). */
57
+ apartado?: string;
58
+ addon_key?: string;
59
+ /** Optional CSS/hex colour for the icon disc. */
60
+ color?: string;
56
61
  }
57
62
  /**
58
63
  * Strings used by the dropdown. Overridable for i18n. Defaults to Spanish.
@@ -106,5 +111,24 @@ export interface NotificationsDropdownProps {
106
111
  * `onMessage` with every incoming `NOTIFICATION` payload.
107
112
  */
108
113
  subscribeToNotifications?: (onMessage: (payload: NotificationWsPayload) => void) => void | (() => void);
114
+ /**
115
+ * Preferred live transport: Server-Sent Events URL
116
+ * (e.g. `/api/notifications/stream`). When set, opens EventSource in
117
+ * addition to (or instead of, when `subscribeToNotifications` is also
118
+ * omitted and `preferSse` is true) the WebSocket path.
119
+ */
120
+ sseUrl?: string;
121
+ /** Bearer token for SSE (`?access_token=` — EventSource cannot set headers). */
122
+ sseAccessToken?: string | null;
123
+ /**
124
+ * When true (default if `sseUrl` is set), skip the built-in WebSocket hook
125
+ * and rely on SSE (+ optional `subscribeToNotifications`).
126
+ */
127
+ preferSse?: boolean;
128
+ /**
129
+ * Show the canonical card toast when a live notification arrives.
130
+ * Default true — one visual pipeline for bell + toast.
131
+ */
132
+ showToastOnIngest?: boolean;
109
133
  }
110
134
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { LucideIcon } from 'lucide-react';
2
+ import type { NotificationType } from './types';
3
+ /** Convert kebab-case / snake_case to PascalCase ("shopping-cart" → "ShoppingCart"). */
4
+ export declare function toPascalCase(str: string): string;
5
+ /** Hosts can register extra addon keys without forking the package. */
6
+ export declare function registerModuleLabel(addonKey: string, label: string): void;
7
+ export type NotificationMeta = {
8
+ addon_key?: string;
9
+ apartado?: string;
10
+ module?: string;
11
+ model?: string;
12
+ rule?: string;
13
+ source?: string;
14
+ color?: string;
15
+ [key: string]: unknown;
16
+ };
17
+ export declare function parseNotificationMeta(raw?: string | NotificationMeta | null): NotificationMeta;
18
+ /** Chip label for Inventario / Almacén / POS / … */
19
+ export declare function moduleLabelFromMeta(meta: NotificationMeta): string;
20
+ export type NotificationTone = {
21
+ /** Circle behind the Lucide icon */
22
+ iconClass: string;
23
+ /** Left border on list rows */
24
+ rowAccentClass: string;
25
+ /** Optional explicit hex/css color from payload metadata.color */
26
+ customColor?: string;
27
+ };
28
+ export declare function resolveNotificationTone(type?: NotificationType | string | null, meta?: NotificationMeta): NotificationTone;
29
+ export declare function resolveNotificationIcon(icon?: string | null, type?: NotificationType | string | null): LucideIcon;
30
+ /** One-shot resolve for toast + list rows. */
31
+ export declare function resolveNotificationVisual(input: {
32
+ icon?: string | null;
33
+ type?: NotificationType | string | null;
34
+ metadata?: string | NotificationMeta | null;
35
+ addonKey?: string | null;
36
+ }): {
37
+ Icon: LucideIcon;
38
+ tone: NotificationTone;
39
+ moduleLabel: string;
40
+ meta: {
41
+ addon_key?: string;
42
+ apartado?: string;
43
+ module?: string;
44
+ model?: string;
45
+ rule?: string;
46
+ source?: string;
47
+ color?: string;
48
+ };
49
+ };
50
+ //# sourceMappingURL=visual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual.d.ts","sourceRoot":"","sources":["../src/visual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAmBD,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,wBAAgB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,GAAG,gBAAgB,CAS9F;AAED,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAMlE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAyBD,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,EACvC,IAAI,CAAC,EAAE,gBAAgB,GACtB,gBAAgB,CAKlB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,GACtC,UAAU,CAgBZ;AAED,8CAA8C;AAC9C,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAA;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;;;;;oBAnGa,MAAM;mBACP,MAAM;iBACR,MAAM;gBACP,MAAM;eACP,MAAM;iBACJ,MAAM;gBACP,MAAM;;EAwGf"}
package/dist/visual.js ADDED
@@ -0,0 +1,115 @@
1
+ import * as LucideIcons from 'lucide-react';
2
+ /** Convert kebab-case / snake_case to PascalCase ("shopping-cart" → "ShoppingCart"). */
3
+ export function toPascalCase(str) {
4
+ return str
5
+ .split(/[-_]/)
6
+ .filter(Boolean)
7
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
8
+ .join('');
9
+ }
10
+ /** Known addon → human label (bell chip / toast eyebrow). Hosts may extend via registerModuleLabel. */
11
+ const MODULE_LABELS = {
12
+ inventory: 'Inventario',
13
+ warehouse: 'Almacén',
14
+ customers: 'Clientes',
15
+ pos: 'POS',
16
+ caja: 'Caja',
17
+ fiscal_mexico: 'Fiscal',
18
+ workshop: 'Taller',
19
+ accounting_lite: 'Contabilidad',
20
+ products: 'Productos',
21
+ payroll: 'Nómina',
22
+ hr: 'RRHH',
23
+ vehicles: 'Vehículos',
24
+ tires_inventory: 'Llantas',
25
+ };
26
+ /** Hosts can register extra addon keys without forking the package. */
27
+ export function registerModuleLabel(addonKey, label) {
28
+ const k = addonKey.trim();
29
+ if (!k || !label.trim())
30
+ return;
31
+ MODULE_LABELS[k] = label.trim();
32
+ }
33
+ export function parseNotificationMeta(raw) {
34
+ if (!raw)
35
+ return {};
36
+ if (typeof raw === 'object')
37
+ return raw;
38
+ try {
39
+ const v = JSON.parse(raw);
40
+ return v && typeof v === 'object' ? v : {};
41
+ }
42
+ catch {
43
+ return {};
44
+ }
45
+ }
46
+ /** Chip label for Inventario / Almacén / POS / … */
47
+ export function moduleLabelFromMeta(meta) {
48
+ if (typeof meta.apartado === 'string' && meta.apartado.trim())
49
+ return meta.apartado.trim();
50
+ if (typeof meta.module === 'string' && meta.module.trim())
51
+ return meta.module.trim();
52
+ const key = (meta.addon_key || '').trim();
53
+ if (!key)
54
+ return '';
55
+ return MODULE_LABELS[key] || key.replace(/_/g, ' ');
56
+ }
57
+ const TONES = {
58
+ success: {
59
+ iconClass: 'bg-emerald-500 text-white',
60
+ rowAccentClass: 'border-l-emerald-500',
61
+ },
62
+ warning: {
63
+ iconClass: 'bg-amber-500 text-white',
64
+ rowAccentClass: 'border-l-amber-500',
65
+ },
66
+ error: {
67
+ iconClass: 'bg-red-500 text-white',
68
+ rowAccentClass: 'border-l-red-500',
69
+ },
70
+ info: {
71
+ iconClass: 'bg-primary text-primary-foreground',
72
+ rowAccentClass: 'border-l-primary',
73
+ },
74
+ default: {
75
+ iconClass: 'bg-primary text-primary-foreground',
76
+ rowAccentClass: 'border-l-primary',
77
+ },
78
+ };
79
+ export function resolveNotificationTone(type, meta) {
80
+ const base = TONES[type || 'info'] || TONES.default;
81
+ const custom = typeof meta?.color === 'string' && meta.color.trim() ? meta.color.trim() : undefined;
82
+ return custom ? { ...base, customColor: custom } : base;
83
+ }
84
+ export function resolveNotificationIcon(icon, type) {
85
+ if (icon) {
86
+ const Dynamic = LucideIcons[toPascalCase(icon)];
87
+ if (Dynamic)
88
+ return Dynamic;
89
+ }
90
+ switch (type) {
91
+ case 'warning':
92
+ return LucideIcons.AlertTriangle;
93
+ case 'success':
94
+ return LucideIcons.CheckCircle2;
95
+ case 'error':
96
+ return LucideIcons.XCircle;
97
+ case 'info':
98
+ default:
99
+ return LucideIcons.Bell;
100
+ }
101
+ }
102
+ /** One-shot resolve for toast + list rows. */
103
+ export function resolveNotificationVisual(input) {
104
+ const meta = {
105
+ ...parseNotificationMeta(input.metadata),
106
+ ...(input.addonKey ? { addon_key: input.addonKey } : {}),
107
+ };
108
+ return {
109
+ Icon: resolveNotificationIcon(input.icon, input.type),
110
+ tone: resolveNotificationTone(input.type, meta),
111
+ moduleLabel: moduleLabelFromMeta(meta),
112
+ meta,
113
+ };
114
+ }
115
+ //# sourceMappingURL=visual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual.js","sourceRoot":"","sources":["../src/visual.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@asteby/metacore-notifications",
3
- "version": "23.0.1",
4
- "description": "Metacore notifications — dropdown, app badge, WebSocket-driven real-time updates",
3
+ "version": "24.0.1",
4
+ "description": "Metacore notifications — dropdown, SSE/WS live stream, unified toast, dynamic icons & module chips",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -27,6 +27,18 @@
27
27
  "./hooks": {
28
28
  "types": "./dist/hooks.d.ts",
29
29
  "import": "./dist/hooks.js"
30
+ },
31
+ "./toast": {
32
+ "types": "./dist/toast.d.ts",
33
+ "import": "./dist/toast.js"
34
+ },
35
+ "./sse": {
36
+ "types": "./dist/sse.d.ts",
37
+ "import": "./dist/sse.js"
38
+ },
39
+ "./visual": {
40
+ "types": "./dist/visual.d.ts",
41
+ "import": "./dist/visual.js"
30
42
  }
31
43
  },
32
44
  "peerDependencies": {
@@ -36,8 +48,8 @@
36
48
  "date-fns": ">=3",
37
49
  "lucide-react": ">=0.460",
38
50
  "sonner": ">=1.7",
39
- "@asteby/metacore-websocket": "^0.5.0",
40
- "@asteby/metacore-ui": "^2.16.0"
51
+ "@asteby/metacore-ui": "^2.16.0",
52
+ "@asteby/metacore-websocket": "^0.5.0"
41
53
  },
42
54
  "devDependencies": {
43
55
  "@tanstack/react-query": "^5.95.0",