shared-features 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +2 -0
  2. package/dist/{AdBanner-D-KuNTje.cjs → AnnouncementModal-Bqy0pn3V.cjs} +432 -4
  3. package/dist/AnnouncementModal-Bqy0pn3V.cjs.map +1 -0
  4. package/dist/{AdBanner-Ben0vVXV.js → AnnouncementModal-sxH4K5gy.js} +434 -6
  5. package/dist/AnnouncementModal-sxH4K5gy.js.map +1 -0
  6. package/dist/admin-notifications-D9n9h-eY.cjs +362 -0
  7. package/dist/admin-notifications-D9n9h-eY.cjs.map +1 -0
  8. package/dist/admin-notifications-p1dy3zIP.js +363 -0
  9. package/dist/admin-notifications-p1dy3zIP.js.map +1 -0
  10. package/dist/{analytics-CdpCtTpu.js → analytics-40-S_fHC.js} +3 -2
  11. package/dist/{analytics-CdpCtTpu.js.map → analytics-40-S_fHC.js.map} +1 -1
  12. package/dist/{analytics--ZSO9ova.cjs → analytics-lEzOx2vl.cjs} +2 -1
  13. package/dist/{analytics--ZSO9ova.cjs.map → analytics-lEzOx2vl.cjs.map} +1 -1
  14. package/dist/broadcasts-3_WfQMNL.cjs +278 -0
  15. package/dist/broadcasts-3_WfQMNL.cjs.map +1 -0
  16. package/dist/broadcasts-DgZUzqMf.js +257 -0
  17. package/dist/broadcasts-DgZUzqMf.js.map +1 -0
  18. package/dist/components/ads/AdModal.d.ts.map +1 -1
  19. package/dist/components/index.cjs +23 -20
  20. package/dist/components/index.cjs.map +1 -1
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/components/index.d.ts.map +1 -1
  23. package/dist/components/index.js +4 -1
  24. package/dist/components/notifications/AnnouncementModal.d.ts +21 -0
  25. package/dist/components/notifications/AnnouncementModal.d.ts.map +1 -0
  26. package/dist/components/notifications/BroadcastBanner.d.ts +55 -0
  27. package/dist/components/notifications/BroadcastBanner.d.ts.map +1 -0
  28. package/dist/components/notifications/index.d.ts +11 -0
  29. package/dist/components/notifications/index.d.ts.map +1 -0
  30. package/dist/hooks/index.cjs +9 -1
  31. package/dist/hooks/index.cjs.map +1 -1
  32. package/dist/hooks/index.d.ts +2 -0
  33. package/dist/hooks/index.d.ts.map +1 -1
  34. package/dist/hooks/index.js +9 -1
  35. package/dist/hooks/index.js.map +1 -1
  36. package/dist/hooks/useBroadcasts.d.ts +122 -0
  37. package/dist/hooks/useBroadcasts.d.ts.map +1 -0
  38. package/dist/index.cjs +99 -22
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +94 -17
  43. package/dist/index.js.map +1 -1
  44. package/dist/notifications/events/index.d.ts +14 -0
  45. package/dist/notifications/events/index.d.ts.map +1 -0
  46. package/dist/notifications/events/registry.d.ts +75 -0
  47. package/dist/notifications/events/registry.d.ts.map +1 -0
  48. package/dist/notifications/events/templates/engine.d.ts +57 -0
  49. package/dist/notifications/events/templates/engine.d.ts.map +1 -0
  50. package/dist/notifications/events/templates/standard.d.ts +20 -0
  51. package/dist/notifications/events/templates/standard.d.ts.map +1 -0
  52. package/dist/notifications/events/useNotificationEvents.d.ts +36 -0
  53. package/dist/notifications/events/useNotificationEvents.d.ts.map +1 -0
  54. package/dist/notifications/index.cjs +25 -0
  55. package/dist/notifications/index.cjs.map +1 -0
  56. package/dist/notifications/index.d.ts +9 -0
  57. package/dist/notifications/index.d.ts.map +1 -0
  58. package/dist/notifications/index.js +25 -0
  59. package/dist/notifications/index.js.map +1 -0
  60. package/dist/services/admin-notifications.d.ts +95 -0
  61. package/dist/services/admin-notifications.d.ts.map +1 -0
  62. package/dist/services/broadcasts.d.ts +55 -0
  63. package/dist/services/broadcasts.d.ts.map +1 -0
  64. package/dist/services/index.cjs +34 -1
  65. package/dist/services/index.cjs.map +1 -1
  66. package/dist/services/index.d.ts +2 -0
  67. package/dist/services/index.d.ts.map +1 -1
  68. package/dist/services/index.js +35 -2
  69. package/dist/services/index.js.map +1 -1
  70. package/dist/types/index.cjs +108 -0
  71. package/dist/types/index.cjs.map +1 -1
  72. package/dist/types/index.d.ts +1 -0
  73. package/dist/types/index.d.ts.map +1 -1
  74. package/dist/types/index.js +109 -1
  75. package/dist/types/index.js.map +1 -1
  76. package/dist/types/notifications.d.ts +634 -0
  77. package/dist/types/notifications.d.ts.map +1 -0
  78. package/dist/useBroadcasts-DzpCcbC8.js +161 -0
  79. package/dist/useBroadcasts-DzpCcbC8.js.map +1 -0
  80. package/dist/useBroadcasts-FP6ZrcY_.cjs +160 -0
  81. package/dist/useBroadcasts-FP6ZrcY_.cjs.map +1 -0
  82. package/dist/{useCampaigns-Dltisb9N.cjs → useCampaigns-BOZ9dDsG.cjs} +2 -2
  83. package/dist/{useCampaigns-Dltisb9N.cjs.map → useCampaigns-BOZ9dDsG.cjs.map} +1 -1
  84. package/dist/{useCampaigns-nwfsALsN.js → useCampaigns-D46b9zuf.js} +2 -2
  85. package/dist/{useCampaigns-nwfsALsN.js.map → useCampaigns-D46b9zuf.js.map} +1 -1
  86. package/dist/useNotificationEvents-BXeMqdak.cjs +954 -0
  87. package/dist/useNotificationEvents-BXeMqdak.cjs.map +1 -0
  88. package/dist/useNotificationEvents-D8DVxah1.js +955 -0
  89. package/dist/useNotificationEvents-D8DVxah1.js.map +1 -0
  90. package/package.json +13 -5
  91. package/dist/AdBanner-Ben0vVXV.js.map +0 -1
  92. package/dist/AdBanner-D-KuNTje.cjs.map +0 -1
@@ -0,0 +1,257 @@
1
+ import { query, collection, where, orderBy, getDocs, Timestamp, getDoc, doc, onSnapshot, serverTimestamp, addDoc } from "firebase/firestore";
2
+ import { d as getConfig, a as getSharedFeaturesDb, v as getState } from "./analytics-40-S_fHC.js";
3
+ const COLLECTION_BROADCASTS = "zaions_broadcasts";
4
+ const COLLECTION_BROADCAST_EVENTS = "zaions_broadcast_events";
5
+ const LOCAL_STORAGE_KEY = "shared_features_dismissed_broadcasts";
6
+ let broadcastsCache = null;
7
+ const CACHE_TTL_MS = 2 * 60 * 1e3;
8
+ async function getDismissedBroadcasts() {
9
+ try {
10
+ const { Preferences } = await import("@capacitor/preferences");
11
+ const result = await Preferences.get({ key: LOCAL_STORAGE_KEY });
12
+ if (result.value) {
13
+ const data = JSON.parse(result.value);
14
+ return new Set(data.dismissedIds || []);
15
+ }
16
+ } catch {
17
+ try {
18
+ const stored = localStorage.getItem(LOCAL_STORAGE_KEY);
19
+ if (stored) {
20
+ const data = JSON.parse(stored);
21
+ return new Set(data.dismissedIds || []);
22
+ }
23
+ } catch {
24
+ }
25
+ }
26
+ return /* @__PURE__ */ new Set();
27
+ }
28
+ async function saveDismissedBroadcast(broadcastId) {
29
+ const dismissed = await getDismissedBroadcasts();
30
+ dismissed.add(broadcastId);
31
+ const serialized = JSON.stringify({
32
+ dismissedIds: Array.from(dismissed),
33
+ updatedAt: Date.now()
34
+ });
35
+ try {
36
+ const { Preferences } = await import("@capacitor/preferences");
37
+ await Preferences.set({ key: LOCAL_STORAGE_KEY, value: serialized });
38
+ } catch {
39
+ try {
40
+ localStorage.setItem(LOCAL_STORAGE_KEY, serialized);
41
+ } catch {
42
+ }
43
+ }
44
+ }
45
+ async function isBroadcastDismissed(broadcastId) {
46
+ const dismissed = await getDismissedBroadcasts();
47
+ return dismissed.has(broadcastId);
48
+ }
49
+ async function dismissBroadcast(broadcastId) {
50
+ await saveDismissedBroadcast(broadcastId);
51
+ }
52
+ async function clearDismissedBroadcasts() {
53
+ try {
54
+ const { Preferences } = await import("@capacitor/preferences");
55
+ await Preferences.remove({ key: LOCAL_STORAGE_KEY });
56
+ } catch {
57
+ try {
58
+ localStorage.removeItem(LOCAL_STORAGE_KEY);
59
+ } catch {
60
+ }
61
+ }
62
+ }
63
+ function isCacheValid() {
64
+ if (!broadcastsCache) return false;
65
+ return Date.now() - broadcastsCache.timestamp < CACHE_TTL_MS;
66
+ }
67
+ function docToBroadcast(docId, data) {
68
+ return {
69
+ id: docId,
70
+ title: data.title,
71
+ message: data.message,
72
+ type: data.type,
73
+ category: data.category,
74
+ isRead: false,
75
+ // Broadcasts don't have read state per-user
76
+ isImportant: data.isImportant,
77
+ actionUrl: data.actionUrl,
78
+ actionText: data.actionText,
79
+ createdAt: data.createdAt,
80
+ metadata: data.metadata,
81
+ targetProjects: data.targetProjects || [],
82
+ targetPlatforms: data.targetPlatforms || [],
83
+ targetAudience: data.targetAudience || "all",
84
+ status: data.status,
85
+ startDate: data.startDate,
86
+ endDate: data.endDate,
87
+ priority: data.priority || 50,
88
+ dismissible: data.dismissible !== false,
89
+ // Default true
90
+ variant: data.variant || "banner",
91
+ impressions: data.impressions || 0,
92
+ clicks: data.clicks || 0,
93
+ createdBy: data.createdBy,
94
+ updatedBy: data.updatedBy
95
+ };
96
+ }
97
+ async function fetchBroadcasts(options = {}) {
98
+ const config = getConfig();
99
+ const db = getSharedFeaturesDb();
100
+ if (!options.projectId && !options.platform && !options.variant && !options.status && isCacheValid()) {
101
+ return broadcastsCache.data;
102
+ }
103
+ let q = query(collection(db, COLLECTION_BROADCASTS));
104
+ const status = options.status || "active";
105
+ q = query(q, where("status", "==", status));
106
+ q = query(q, orderBy("priority", "desc"));
107
+ if (options.limit) {
108
+ const { limit: firestoreLimit } = await import("firebase/firestore");
109
+ q = query(q, firestoreLimit(options.limit));
110
+ }
111
+ const snapshot = await getDocs(q);
112
+ let broadcasts = snapshot.docs.map((d) => docToBroadcast(d.id, d.data()));
113
+ const now = Timestamp.now();
114
+ broadcasts = broadcasts.filter((b) => {
115
+ if (b.startDate && b.startDate.toMillis() > now.toMillis()) {
116
+ return false;
117
+ }
118
+ if (b.endDate && b.endDate.toMillis() < now.toMillis()) {
119
+ return false;
120
+ }
121
+ const targetPlatform = options.platform || config.platform;
122
+ if (b.targetPlatforms.length > 0 && !b.targetPlatforms.includes(targetPlatform)) {
123
+ return false;
124
+ }
125
+ const targetProject = options.projectId || config.projectId;
126
+ if (b.targetProjects.length > 0 && !b.targetProjects.includes(targetProject)) {
127
+ return false;
128
+ }
129
+ if (options.variant && b.variant !== options.variant) {
130
+ return false;
131
+ }
132
+ return true;
133
+ });
134
+ if (!options.projectId && !options.platform && !options.variant && !options.status) {
135
+ broadcastsCache = {
136
+ data: broadcasts,
137
+ timestamp: Date.now()
138
+ };
139
+ }
140
+ return broadcasts;
141
+ }
142
+ async function fetchActiveBroadcasts(options = {}) {
143
+ const broadcasts = await fetchBroadcasts({ ...options, status: "active" });
144
+ const dismissed = await getDismissedBroadcasts();
145
+ return broadcasts.filter((b) => !dismissed.has(b.id));
146
+ }
147
+ async function fetchBroadcastsByVariant(variant) {
148
+ return fetchActiveBroadcasts({ variant });
149
+ }
150
+ async function getBroadcastById(broadcastId) {
151
+ const db = getSharedFeaturesDb();
152
+ const docSnap = await getDoc(doc(db, COLLECTION_BROADCASTS, broadcastId));
153
+ if (!docSnap.exists()) return null;
154
+ return docToBroadcast(docSnap.id, docSnap.data());
155
+ }
156
+ function subscribeToBroadcasts(callback, options = {}) {
157
+ const config = getConfig();
158
+ const db = getSharedFeaturesDb();
159
+ let q = query(
160
+ collection(db, COLLECTION_BROADCASTS),
161
+ where("status", "==", "active"),
162
+ orderBy("priority", "desc")
163
+ );
164
+ return onSnapshot(
165
+ q,
166
+ async (snapshot) => {
167
+ let broadcasts = snapshot.docs.map(
168
+ (d) => docToBroadcast(d.id, d.data())
169
+ );
170
+ const now = Timestamp.now();
171
+ const dismissed = await getDismissedBroadcasts();
172
+ broadcasts = broadcasts.filter((b) => {
173
+ if (dismissed.has(b.id)) return false;
174
+ if (b.startDate && b.startDate.toMillis() > now.toMillis()) {
175
+ return false;
176
+ }
177
+ if (b.endDate && b.endDate.toMillis() < now.toMillis()) {
178
+ return false;
179
+ }
180
+ const targetPlatform = options.platform || config.platform;
181
+ if (b.targetPlatforms.length > 0 && !b.targetPlatforms.includes(targetPlatform)) {
182
+ return false;
183
+ }
184
+ const targetProject = options.projectId || config.projectId;
185
+ if (b.targetProjects.length > 0 && !b.targetProjects.includes(targetProject)) {
186
+ return false;
187
+ }
188
+ if (options.variant && b.variant !== options.variant) {
189
+ return false;
190
+ }
191
+ return true;
192
+ });
193
+ callback(broadcasts);
194
+ },
195
+ (error) => {
196
+ const debug = config.debug;
197
+ if (debug) {
198
+ console.error("[shared-features] Broadcast subscription error:", error);
199
+ }
200
+ }
201
+ );
202
+ }
203
+ async function recordBroadcastEvent(broadcastId, action) {
204
+ const config = getConfig();
205
+ const state = getState();
206
+ const db = getSharedFeaturesDb();
207
+ const eventData = {
208
+ broadcastId,
209
+ projectId: config.projectId,
210
+ platform: config.platform,
211
+ deviceId: state.deviceId || "unknown",
212
+ action,
213
+ timestamp: serverTimestamp()
214
+ };
215
+ try {
216
+ await addDoc(collection(db, COLLECTION_BROADCAST_EVENTS), eventData);
217
+ if (config.debug) {
218
+ console.log("[shared-features] Recorded broadcast event:", eventData);
219
+ }
220
+ } catch (error) {
221
+ if (config.debug) {
222
+ console.error(
223
+ "[shared-features] Failed to record broadcast event:",
224
+ error
225
+ );
226
+ }
227
+ }
228
+ }
229
+ async function trackBroadcastImpression(broadcastId) {
230
+ await recordBroadcastEvent(broadcastId, "impression");
231
+ }
232
+ async function trackBroadcastClick(broadcastId) {
233
+ await recordBroadcastEvent(broadcastId, "click");
234
+ }
235
+ async function trackBroadcastDismiss(broadcastId) {
236
+ await recordBroadcastEvent(broadcastId, "dismiss");
237
+ await dismissBroadcast(broadcastId);
238
+ }
239
+ function clearBroadcastsCache() {
240
+ broadcastsCache = null;
241
+ }
242
+ export {
243
+ fetchActiveBroadcasts as a,
244
+ fetchBroadcastsByVariant as b,
245
+ trackBroadcastClick as c,
246
+ trackBroadcastDismiss as d,
247
+ dismissBroadcast as e,
248
+ fetchBroadcasts as f,
249
+ getBroadcastById as g,
250
+ clearDismissedBroadcasts as h,
251
+ isBroadcastDismissed as i,
252
+ clearBroadcastsCache as j,
253
+ recordBroadcastEvent as r,
254
+ subscribeToBroadcasts as s,
255
+ trackBroadcastImpression as t
256
+ };
257
+ //# sourceMappingURL=broadcasts-DgZUzqMf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcasts-DgZUzqMf.js","sources":["../src/services/broadcasts.ts"],"sourcesContent":["/**\n * Broadcasts Service\n *\n * Handles fetching and displaying cross-project broadcast notifications\n * from the centralized aoneahsan.com Firebase backend.\n *\n * Broadcasts are created via the admin panel and displayed across all\n * consumer projects based on targeting rules.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport {\n collection,\n getDocs,\n getDoc,\n doc,\n query,\n where,\n orderBy,\n onSnapshot,\n addDoc,\n serverTimestamp,\n Timestamp,\n Unsubscribe,\n} from 'firebase/firestore';\nimport { getSharedFeaturesDb } from '../firebase/init';\nimport { getConfig, getState } from '../firebase/config';\nimport type {\n BroadcastNotification,\n BroadcastStatus,\n BroadcastVariant,\n NotificationPlatform,\n FetchBroadcastsOptions,\n} from '../types/notifications';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst COLLECTION_BROADCASTS = 'zaions_broadcasts';\nconst COLLECTION_BROADCAST_EVENTS = 'zaions_broadcast_events';\nconst LOCAL_STORAGE_KEY = 'shared_features_dismissed_broadcasts';\n\n// Cache for broadcasts\ninterface BroadcastsCache {\n data: BroadcastNotification[];\n timestamp: number;\n}\nlet broadcastsCache: BroadcastsCache | null = null;\nconst CACHE_TTL_MS = 2 * 60 * 1000; // 2 minutes (shorter than campaigns)\n\n// ============================================================================\n// LOCAL DISMISSAL MANAGEMENT\n// ============================================================================\n\n/**\n * Get dismissed broadcast IDs from local storage\n */\nasync function getDismissedBroadcasts(): Promise<Set<string>> {\n try {\n // Try Capacitor Preferences first\n const { Preferences } = await import('@capacitor/preferences');\n const result = await Preferences.get({ key: LOCAL_STORAGE_KEY });\n if (result.value) {\n const data = JSON.parse(result.value);\n return new Set(data.dismissedIds || []);\n }\n } catch {\n // Fallback to localStorage\n try {\n const stored = localStorage.getItem(LOCAL_STORAGE_KEY);\n if (stored) {\n const data = JSON.parse(stored);\n return new Set(data.dismissedIds || []);\n }\n } catch {\n // Ignore\n }\n }\n return new Set();\n}\n\n/**\n * Save dismissed broadcast ID to local storage\n */\nasync function saveDismissedBroadcast(broadcastId: string): Promise<void> {\n const dismissed = await getDismissedBroadcasts();\n dismissed.add(broadcastId);\n\n const serialized = JSON.stringify({\n dismissedIds: Array.from(dismissed),\n updatedAt: Date.now(),\n });\n\n try {\n // Try Capacitor Preferences first\n const { Preferences } = await import('@capacitor/preferences');\n await Preferences.set({ key: LOCAL_STORAGE_KEY, value: serialized });\n } catch {\n // Fallback to localStorage\n try {\n localStorage.setItem(LOCAL_STORAGE_KEY, serialized);\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Check if a broadcast has been dismissed\n */\nexport async function isBroadcastDismissed(\n broadcastId: string\n): Promise<boolean> {\n const dismissed = await getDismissedBroadcasts();\n return dismissed.has(broadcastId);\n}\n\n/**\n * Dismiss a broadcast (save locally)\n */\nexport async function dismissBroadcast(broadcastId: string): Promise<void> {\n await saveDismissedBroadcast(broadcastId);\n}\n\n/**\n * Clear all dismissed broadcasts (useful for testing)\n */\nexport async function clearDismissedBroadcasts(): Promise<void> {\n try {\n const { Preferences } = await import('@capacitor/preferences');\n await Preferences.remove({ key: LOCAL_STORAGE_KEY });\n } catch {\n try {\n localStorage.removeItem(LOCAL_STORAGE_KEY);\n } catch {\n // Ignore\n }\n }\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Check if cache is valid\n */\nfunction isCacheValid(): boolean {\n if (!broadcastsCache) return false;\n return Date.now() - broadcastsCache.timestamp < CACHE_TTL_MS;\n}\n\n/**\n * Convert Firestore document to BroadcastNotification\n */\nfunction docToBroadcast(\n docId: string,\n data: Record<string, unknown>\n): BroadcastNotification {\n return {\n id: docId,\n title: data.title as string,\n message: data.message as string,\n type: data.type as BroadcastNotification['type'],\n category: data.category as BroadcastNotification['category'],\n isRead: false, // Broadcasts don't have read state per-user\n isImportant: data.isImportant as boolean | undefined,\n actionUrl: data.actionUrl as string | undefined,\n actionText: data.actionText as string | undefined,\n createdAt: data.createdAt as Timestamp,\n metadata: data.metadata as Record<string, unknown> | undefined,\n targetProjects: (data.targetProjects as string[]) || [],\n targetPlatforms:\n (data.targetPlatforms as NotificationPlatform[]) || [],\n targetAudience:\n (data.targetAudience as BroadcastNotification['targetAudience']) || 'all',\n status: data.status as BroadcastStatus,\n startDate: data.startDate as Timestamp,\n endDate: data.endDate as Timestamp | null | undefined,\n priority: (data.priority as number) || 50,\n dismissible: data.dismissible !== false, // Default true\n variant: (data.variant as BroadcastVariant) || 'banner',\n impressions: (data.impressions as number) || 0,\n clicks: (data.clicks as number) || 0,\n createdBy: data.createdBy as string,\n updatedBy: data.updatedBy as string | undefined,\n };\n}\n\n// ============================================================================\n// BROADCAST FETCHING\n// ============================================================================\n\n/**\n * Fetch broadcasts with optional filters\n */\nexport async function fetchBroadcasts(\n options: FetchBroadcastsOptions = {}\n): Promise<BroadcastNotification[]> {\n const config = getConfig();\n const db = getSharedFeaturesDb();\n\n // Check cache first (only for unfiltered queries)\n if (\n !options.projectId &&\n !options.platform &&\n !options.variant &&\n !options.status &&\n isCacheValid()\n ) {\n return broadcastsCache!.data;\n }\n\n let q = query(collection(db, COLLECTION_BROADCASTS));\n\n // Apply status filter (default to active)\n const status = options.status || 'active';\n q = query(q, where('status', '==', status));\n\n // Order by priority descending\n q = query(q, orderBy('priority', 'desc'));\n\n if (options.limit) {\n const { limit: firestoreLimit } = await import('firebase/firestore');\n q = query(q, firestoreLimit(options.limit));\n }\n\n const snapshot = await getDocs(q);\n let broadcasts = snapshot.docs.map((d) => docToBroadcast(d.id, d.data()));\n\n // Client-side filtering for array fields\n const now = Timestamp.now();\n\n broadcasts = broadcasts.filter((b) => {\n // Date range check\n if (b.startDate && (b.startDate as Timestamp).toMillis() > now.toMillis()) {\n return false;\n }\n if (\n b.endDate &&\n (b.endDate as Timestamp).toMillis() < now.toMillis()\n ) {\n return false;\n }\n\n // Platform check\n const targetPlatform = options.platform || config.platform;\n if (\n b.targetPlatforms.length > 0 &&\n !b.targetPlatforms.includes(targetPlatform as NotificationPlatform)\n ) {\n return false;\n }\n\n // Project check\n const targetProject = options.projectId || config.projectId;\n if (\n b.targetProjects.length > 0 &&\n !b.targetProjects.includes(targetProject)\n ) {\n return false;\n }\n\n // Variant check\n if (options.variant && b.variant !== options.variant) {\n return false;\n }\n\n return true;\n });\n\n // Cache unfiltered results\n if (\n !options.projectId &&\n !options.platform &&\n !options.variant &&\n !options.status\n ) {\n broadcastsCache = {\n data: broadcasts,\n timestamp: Date.now(),\n };\n }\n\n return broadcasts;\n}\n\n/**\n * Fetch active broadcasts for display, excluding dismissed ones\n */\nexport async function fetchActiveBroadcasts(\n options: Omit<FetchBroadcastsOptions, 'status'> = {}\n): Promise<BroadcastNotification[]> {\n const broadcasts = await fetchBroadcasts({ ...options, status: 'active' });\n const dismissed = await getDismissedBroadcasts();\n\n return broadcasts.filter((b) => !dismissed.has(b.id));\n}\n\n/**\n * Fetch broadcasts by variant type\n */\nexport async function fetchBroadcastsByVariant(\n variant: BroadcastVariant\n): Promise<BroadcastNotification[]> {\n return fetchActiveBroadcasts({ variant });\n}\n\n/**\n * Get a single broadcast by ID\n */\nexport async function getBroadcastById(\n broadcastId: string\n): Promise<BroadcastNotification | null> {\n const db = getSharedFeaturesDb();\n const docSnap = await getDoc(doc(db, COLLECTION_BROADCASTS, broadcastId));\n\n if (!docSnap.exists()) return null;\n return docToBroadcast(docSnap.id, docSnap.data());\n}\n\n// ============================================================================\n// REAL-TIME SUBSCRIPTION\n// ============================================================================\n\n/**\n * Subscribe to broadcast updates in real-time\n */\nexport function subscribeToBroadcasts(\n callback: (broadcasts: BroadcastNotification[]) => void,\n options: FetchBroadcastsOptions = {}\n): Unsubscribe {\n const config = getConfig();\n const db = getSharedFeaturesDb();\n\n let q = query(\n collection(db, COLLECTION_BROADCASTS),\n where('status', '==', 'active'),\n orderBy('priority', 'desc')\n );\n\n return onSnapshot(\n q,\n async (snapshot) => {\n let broadcasts = snapshot.docs.map((d) =>\n docToBroadcast(d.id, d.data())\n );\n\n // Client-side filtering\n const now = Timestamp.now();\n const dismissed = await getDismissedBroadcasts();\n\n broadcasts = broadcasts.filter((b) => {\n // Skip dismissed\n if (dismissed.has(b.id)) return false;\n\n // Date range check\n if (\n b.startDate &&\n (b.startDate as Timestamp).toMillis() > now.toMillis()\n ) {\n return false;\n }\n if (\n b.endDate &&\n (b.endDate as Timestamp).toMillis() < now.toMillis()\n ) {\n return false;\n }\n\n // Platform check\n const targetPlatform = options.platform || config.platform;\n if (\n b.targetPlatforms.length > 0 &&\n !b.targetPlatforms.includes(targetPlatform as NotificationPlatform)\n ) {\n return false;\n }\n\n // Project check\n const targetProject = options.projectId || config.projectId;\n if (\n b.targetProjects.length > 0 &&\n !b.targetProjects.includes(targetProject)\n ) {\n return false;\n }\n\n // Variant check\n if (options.variant && b.variant !== options.variant) {\n return false;\n }\n\n return true;\n });\n\n callback(broadcasts);\n },\n (error) => {\n const debug = config.debug;\n if (debug) {\n console.error('[shared-features] Broadcast subscription error:', error);\n }\n }\n );\n}\n\n// ============================================================================\n// BROADCAST ANALYTICS\n// ============================================================================\n\n/**\n * Record a broadcast event (impression, click, dismiss)\n */\nexport async function recordBroadcastEvent(\n broadcastId: string,\n action: 'impression' | 'click' | 'dismiss'\n): Promise<void> {\n const config = getConfig();\n const state = getState();\n const db = getSharedFeaturesDb();\n\n const eventData = {\n broadcastId,\n projectId: config.projectId,\n platform: config.platform,\n deviceId: state.deviceId || 'unknown',\n action,\n timestamp: serverTimestamp(),\n };\n\n try {\n await addDoc(collection(db, COLLECTION_BROADCAST_EVENTS), eventData);\n\n if (config.debug) {\n console.log('[shared-features] Recorded broadcast event:', eventData);\n }\n } catch (error) {\n if (config.debug) {\n console.error(\n '[shared-features] Failed to record broadcast event:',\n error\n );\n }\n // Don't throw - we don't want analytics failures to break the UI\n }\n}\n\n/**\n * Track broadcast impression\n */\nexport async function trackBroadcastImpression(\n broadcastId: string\n): Promise<void> {\n await recordBroadcastEvent(broadcastId, 'impression');\n}\n\n/**\n * Track broadcast click\n */\nexport async function trackBroadcastClick(broadcastId: string): Promise<void> {\n await recordBroadcastEvent(broadcastId, 'click');\n}\n\n/**\n * Track broadcast dismiss\n */\nexport async function trackBroadcastDismiss(\n broadcastId: string\n): Promise<void> {\n await recordBroadcastEvent(broadcastId, 'dismiss');\n await dismissBroadcast(broadcastId);\n}\n\n// ============================================================================\n// CACHE MANAGEMENT\n// ============================================================================\n\n/**\n * Clear the broadcasts cache\n */\nexport function clearBroadcastsCache(): void {\n broadcastsCache = null;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AdModal.d.ts","sourceRoot":"","sources":["../../../src/components/ads/AdModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAA2B,EAC3B,OAAO,EACP,YAAY,EACZ,kBAAkB,GACnB,EAAE,YAAY,kDAgKd;AAED,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"AdModal.d.ts","sourceRoot":"","sources":["../../../src/components/ads/AdModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAA2B,EAC3B,OAAO,EACP,YAAY,EACZ,kBAAkB,GACnB,EAAE,YAAY,kDAqKd;AAED,eAAe,OAAO,CAAC"}
@@ -1,23 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const AdBanner = require("../AdBanner-D-KuNTje.cjs");
4
- exports.AdBanner = AdBanner.AdBanner;
5
- exports.AdModal = AdBanner.AdModal;
6
- exports.AdPanel = AdBanner.AdPanel;
7
- exports.AdSlider = AdBanner.AdSlider;
8
- exports.AdUpdateModal = AdBanner.AdUpdateModal;
9
- exports.CardVariant = AdBanner.CardVariant;
10
- exports.ComparisonVariant = AdBanner.ComparisonVariant;
11
- exports.FeatureGridVariant = AdBanner.FeatureGridVariant;
12
- exports.FeaturesVariant = AdBanner.FeaturesVariant;
13
- exports.GradientVariant = AdBanner.GradientVariant;
14
- exports.HeroVariant = AdBanner.HeroVariant;
15
- exports.LARGE_PANEL_VARIANTS = AdBanner.LARGE_PANEL_VARIANTS;
16
- exports.MinimalVariant = AdBanner.MinimalVariant;
17
- exports.SMALL_PANEL_VARIANTS = AdBanner.SMALL_PANEL_VARIANTS;
18
- exports.TaglineVariant = AdBanner.TaglineVariant;
19
- exports.TestimonialVariant = AdBanner.TestimonialVariant;
20
- exports.VideoVariant = AdBanner.VideoVariant;
21
- exports.getLargePanelVariant = AdBanner.getLargePanelVariant;
22
- exports.getSmallPanelVariant = AdBanner.getSmallPanelVariant;
3
+ const AnnouncementModal = require("../AnnouncementModal-Bqy0pn3V.cjs");
4
+ exports.AdBanner = AnnouncementModal.AdBanner;
5
+ exports.AdModal = AnnouncementModal.AdModal;
6
+ exports.AdPanel = AnnouncementModal.AdPanel;
7
+ exports.AdSlider = AnnouncementModal.AdSlider;
8
+ exports.AdUpdateModal = AnnouncementModal.AdUpdateModal;
9
+ exports.AnnouncementModal = AnnouncementModal.AnnouncementModal;
10
+ exports.BroadcastBanner = AnnouncementModal.BroadcastBanner;
11
+ exports.BroadcastBanners = AnnouncementModal.BroadcastBanners;
12
+ exports.CardVariant = AnnouncementModal.CardVariant;
13
+ exports.ComparisonVariant = AnnouncementModal.ComparisonVariant;
14
+ exports.FeatureGridVariant = AnnouncementModal.FeatureGridVariant;
15
+ exports.FeaturesVariant = AnnouncementModal.FeaturesVariant;
16
+ exports.GradientVariant = AnnouncementModal.GradientVariant;
17
+ exports.HeroVariant = AnnouncementModal.HeroVariant;
18
+ exports.LARGE_PANEL_VARIANTS = AnnouncementModal.LARGE_PANEL_VARIANTS;
19
+ exports.MinimalVariant = AnnouncementModal.MinimalVariant;
20
+ exports.SMALL_PANEL_VARIANTS = AnnouncementModal.SMALL_PANEL_VARIANTS;
21
+ exports.TaglineVariant = AnnouncementModal.TaglineVariant;
22
+ exports.TestimonialVariant = AnnouncementModal.TestimonialVariant;
23
+ exports.VideoVariant = AnnouncementModal.VideoVariant;
24
+ exports.getLargePanelVariant = AnnouncementModal.getLargePanelVariant;
25
+ exports.getSmallPanelVariant = AnnouncementModal.getSmallPanelVariant;
23
26
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,4 +6,5 @@
6
6
  * @author Ahsan Mahmood <aoneahsan@gmail.com>
7
7
  */
8
8
  export * from './ads';
9
+ export * from './notifications';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,OAAO,CAAC;AAGtB,cAAc,iBAAiB,CAAC"}
@@ -1,10 +1,13 @@
1
- import { d, b, A, a, c, C, h, e, F, G, H, L, M, S, T, f, V, i, g } from "../AdBanner-Ben0vVXV.js";
1
+ import { d, b, A, a, c, k, B, j, C, h, e, F, G, H, L, M, S, T, f, V, i, g } from "../AnnouncementModal-sxH4K5gy.js";
2
2
  export {
3
3
  d as AdBanner,
4
4
  b as AdModal,
5
5
  A as AdPanel,
6
6
  a as AdSlider,
7
7
  c as AdUpdateModal,
8
+ k as AnnouncementModal,
9
+ B as BroadcastBanner,
10
+ j as BroadcastBanners,
8
11
  C as CardVariant,
9
12
  h as ComparisonVariant,
10
13
  e as FeatureGridVariant,
@@ -0,0 +1,21 @@
1
+ import { AnnouncementModalProps } from '../../types/notifications';
2
+ /**
3
+ * AnnouncementModal - Modal dialog for important announcements
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * const { broadcast, isOpen, close, handleAction } = useAnnouncementModal();
8
+ *
9
+ * return (
10
+ * <AnnouncementModal
11
+ * broadcast={broadcast}
12
+ * isOpen={isOpen}
13
+ * onClose={close}
14
+ * onActionClick={handleAction}
15
+ * />
16
+ * );
17
+ * ```
18
+ */
19
+ export declare function AnnouncementModal({ broadcast, isOpen, onClose, onActionClick, }: AnnouncementModalProps): import("react/jsx-runtime").JSX.Element | null;
20
+ export default AnnouncementModal;
21
+ //# sourceMappingURL=AnnouncementModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnnouncementModal.d.ts","sourceRoot":"","sources":["../../../src/components/notifications/AnnouncementModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,2BAA2B,CAAC;AA+DnC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,MAAM,EACN,OAAO,EACP,aAAa,GACd,EAAE,sBAAsB,kDAiLxB;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { BroadcastNotification, BroadcastBannerProps } from '../../types/notifications';
2
+ /**
3
+ * BroadcastBanner - Dismissible notification banner
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * const { broadcasts, dismissBroadcast, trackClick } = useBannerBroadcasts();
8
+ *
9
+ * return (
10
+ * <div>
11
+ * {broadcasts.map(broadcast => (
12
+ * <BroadcastBanner
13
+ * key={broadcast.id}
14
+ * broadcast={broadcast}
15
+ * onDismiss={() => dismissBroadcast(broadcast.id)}
16
+ * onActionClick={() => trackClick(broadcast.id)}
17
+ * />
18
+ * ))}
19
+ * </div>
20
+ * );
21
+ * ```
22
+ */
23
+ export declare function BroadcastBanner({ broadcast, onActionClick, onDismiss, className, }: BroadcastBannerProps): import("react/jsx-runtime").JSX.Element | null;
24
+ export interface BroadcastBannersProps {
25
+ /** List of broadcasts to display */
26
+ broadcasts: BroadcastNotification[];
27
+ /** Called when a broadcast is dismissed */
28
+ onDismiss?: (broadcastId: string) => void;
29
+ /** Called when action is clicked */
30
+ onActionClick?: (broadcastId: string) => void;
31
+ /** Maximum number of banners to show */
32
+ maxBanners?: number;
33
+ /** Custom CSS class */
34
+ className?: string;
35
+ }
36
+ /**
37
+ * BroadcastBanners - Display multiple broadcast banners stacked
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * const { broadcasts, dismissBroadcast, trackClick } = useBannerBroadcasts();
42
+ *
43
+ * return (
44
+ * <BroadcastBanners
45
+ * broadcasts={broadcasts}
46
+ * onDismiss={dismissBroadcast}
47
+ * onActionClick={trackClick}
48
+ * maxBanners={3}
49
+ * />
50
+ * );
51
+ * ```
52
+ */
53
+ export declare function BroadcastBanners({ broadcasts, onDismiss, onActionClick, maxBanners, className, }: BroadcastBannersProps): import("react/jsx-runtime").JSX.Element | null;
54
+ export default BroadcastBanner;
55
+ //# sourceMappingURL=BroadcastBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BroadcastBanner.d.ts","sourceRoot":"","sources":["../../../src/components/notifications/BroadcastBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,2BAA2B,CAAC;AAuEnC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,aAAa,EACb,SAAS,EACT,SAAS,GACV,EAAE,oBAAoB,kDA2ItB;AAMD,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,oCAAoC;IACpC,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,SAAS,EACT,aAAa,EACb,UAAc,EACd,SAAS,GACV,EAAE,qBAAqB,kDAmBvB;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Notification Components Index
3
+ *
4
+ * Re-exports all notification components from the shared-features package.
5
+ *
6
+ * @author Ahsan Mahmood <aoneahsan@gmail.com>
7
+ */
8
+ export { BroadcastBanner, BroadcastBanners } from './BroadcastBanner';
9
+ export type { BroadcastBannersProps } from './BroadcastBanner';
10
+ export { AnnouncementModal } from './AnnouncementModal';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/notifications/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,8 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const useCampaigns = require("../useCampaigns-Dltisb9N.cjs");
3
+ const useCampaigns = require("../useCampaigns-BOZ9dDsG.cjs");
4
+ const useBroadcasts = require("../useBroadcasts-FP6ZrcY_.cjs");
4
5
  exports.useCampaign = useCampaigns.useCampaign;
5
6
  exports.useCampaigns = useCampaigns.useCampaigns;
6
7
  exports.useOneTimeAdModal = useCampaigns.useOneTimeAdModal;
7
8
  exports.useUpdateAdModal = useCampaigns.useUpdateAdModal;
9
+ exports.useAnnouncementModal = useBroadcasts.useAnnouncementModal;
10
+ exports.useBannerBroadcasts = useBroadcasts.useBannerBroadcasts;
11
+ exports.useBellBroadcasts = useBroadcasts.useBellBroadcasts;
12
+ exports.useBroadcasts = useBroadcasts.useBroadcasts;
13
+ exports.useModalBroadcasts = useBroadcasts.useModalBroadcasts;
14
+ exports.useSingleBroadcast = useBroadcasts.useSingleBroadcast;
15
+ exports.useToastBroadcasts = useBroadcasts.useToastBroadcasts;
8
16
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -7,4 +7,6 @@
7
7
  */
8
8
  export { useCampaigns, useCampaign, useOneTimeAdModal, useUpdateAdModal, } from './useCampaigns';
9
9
  export type { UseCampaignsOptions, UseCampaignsResult } from './useCampaigns';
10
+ export { useBroadcasts, useBannerBroadcasts, useModalBroadcasts, useToastBroadcasts, useBellBroadcasts, useSingleBroadcast, useAnnouncementModal, } from './useBroadcasts';
11
+ export type { UseBroadcastsOptions, UseSingleBroadcastReturn, UseAnnouncementModalReturn, } from './useBroadcasts';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC"}
@@ -1,8 +1,16 @@
1
- import { a, u, b, c } from "../useCampaigns-nwfsALsN.js";
1
+ import { a, u, b, c } from "../useCampaigns-D46b9zuf.js";
2
+ import { f, a as a2, d, u as u2, b as b2, e, c as c2 } from "../useBroadcasts-DzpCcbC8.js";
2
3
  export {
4
+ f as useAnnouncementModal,
5
+ a2 as useBannerBroadcasts,
6
+ d as useBellBroadcasts,
7
+ u2 as useBroadcasts,
3
8
  a as useCampaign,
4
9
  u as useCampaigns,
10
+ b2 as useModalBroadcasts,
5
11
  b as useOneTimeAdModal,
12
+ e as useSingleBroadcast,
13
+ c2 as useToastBroadcasts,
6
14
  c as useUpdateAdModal
7
15
  };
8
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}