shared-features 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/AI-INTEGRATION-GUIDE.md +315 -0
  2. package/README.md +207 -2
  3. package/dist/{admin-notifications-D9n9h-eY.cjs → admin-notifications-D1GgYCJW.cjs} +20 -20
  4. package/dist/{admin-notifications-D9n9h-eY.cjs.map → admin-notifications-D1GgYCJW.cjs.map} +1 -1
  5. package/dist/{admin-notifications-p1dy3zIP.js → admin-notifications-NI7I76uY.js} +13 -13
  6. package/dist/{admin-notifications-p1dy3zIP.js.map → admin-notifications-NI7I76uY.js.map} +1 -1
  7. package/dist/{broadcasts-3_WfQMNL.cjs → broadcasts-BMoTZIuX.cjs} +10 -10
  8. package/dist/{broadcasts-3_WfQMNL.cjs.map → broadcasts-BMoTZIuX.cjs.map} +1 -1
  9. package/dist/{broadcasts-DgZUzqMf.js → broadcasts-DnzZkCoy.js} +12 -12
  10. package/dist/{broadcasts-DgZUzqMf.js.map → broadcasts-DnzZkCoy.js.map} +1 -1
  11. package/dist/commonFeatures-Bdt0UZox.js +1255 -0
  12. package/dist/commonFeatures-Bdt0UZox.js.map +1 -0
  13. package/dist/commonFeatures-CiqxxOin.cjs +1276 -0
  14. package/dist/commonFeatures-CiqxxOin.cjs.map +1 -0
  15. package/dist/commonFeatures-Cr5g1E4M.cjs +200 -0
  16. package/dist/commonFeatures-Cr5g1E4M.cjs.map +1 -0
  17. package/dist/commonFeatures-HT-UO7HW.js +201 -0
  18. package/dist/commonFeatures-HT-UO7HW.js.map +1 -0
  19. package/dist/components/common/index.d.ts +53 -0
  20. package/dist/components/common/index.d.ts.map +1 -0
  21. package/dist/components/index.cjs +31 -23
  22. package/dist/components/index.cjs.map +1 -1
  23. package/dist/components/index.d.ts +1 -0
  24. package/dist/components/index.d.ts.map +1 -1
  25. package/dist/components/index.js +21 -13
  26. package/dist/config/support.d.ts +10 -0
  27. package/dist/config/support.d.ts.map +1 -0
  28. package/dist/firebase/config.d.ts +34 -0
  29. package/dist/firebase/config.d.ts.map +1 -1
  30. package/dist/hooks/index.cjs +26 -13
  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 +24 -11
  35. package/dist/hooks/useCommonFeatures.d.ts +74 -0
  36. package/dist/hooks/useCommonFeatures.d.ts.map +1 -0
  37. package/dist/hooks/useFeatureFlags.d.ts +134 -0
  38. package/dist/hooks/useFeatureFlags.d.ts.map +1 -0
  39. package/dist/{AnnouncementModal-Bqy0pn3V.cjs → index-Dt5YjYnK.cjs} +209 -14
  40. package/dist/index-Dt5YjYnK.cjs.map +1 -0
  41. package/dist/{AnnouncementModal-sxH4K5gy.js → index-Dv34aG2I.js} +212 -17
  42. package/dist/index-Dv34aG2I.js.map +1 -0
  43. package/dist/index.cjs +125 -60
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.ts +10 -5
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +173 -108
  48. package/dist/index.js.map +1 -1
  49. package/dist/notifications/index.js +14 -14
  50. package/dist/services/commonFeatures.d.ts +22 -0
  51. package/dist/services/commonFeatures.d.ts.map +1 -0
  52. package/dist/services/featureFlags.d.ts +71 -0
  53. package/dist/services/featureFlags.d.ts.map +1 -0
  54. package/dist/services/index.cjs +49 -17
  55. package/dist/services/index.cjs.map +1 -1
  56. package/dist/services/index.d.ts +2 -0
  57. package/dist/services/index.d.ts.map +1 -1
  58. package/dist/services/index.js +75 -43
  59. package/dist/services/index.js.map +1 -1
  60. package/dist/types/commonFeatures.d.ts +194 -0
  61. package/dist/types/commonFeatures.d.ts.map +1 -0
  62. package/dist/types/featureFlags.d.ts +203 -0
  63. package/dist/types/featureFlags.d.ts.map +1 -0
  64. package/dist/types/index.cjs +15 -0
  65. package/dist/types/index.cjs.map +1 -1
  66. package/dist/types/index.d.ts +3 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/index.js +15 -0
  69. package/dist/types/index.js.map +1 -1
  70. package/dist/useCommonFeatures-CgyDq6LZ.js +489 -0
  71. package/dist/useCommonFeatures-CgyDq6LZ.js.map +1 -0
  72. package/dist/useCommonFeatures-DnDlhmri.cjs +488 -0
  73. package/dist/useCommonFeatures-DnDlhmri.cjs.map +1 -0
  74. package/dist/useFeatureFlags-BRJSyH9M.js +368 -0
  75. package/dist/useFeatureFlags-BRJSyH9M.js.map +1 -0
  76. package/dist/useFeatureFlags-DXqBJ5Mh.cjs +367 -0
  77. package/dist/useFeatureFlags-DXqBJ5Mh.cjs.map +1 -0
  78. package/dist/{useNotificationEvents-D8DVxah1.js → useNotificationEvents-DAmR7FYF.js} +14 -14
  79. package/dist/{useNotificationEvents-D8DVxah1.js.map → useNotificationEvents-DAmR7FYF.js.map} +1 -1
  80. package/package.json +18 -7
  81. package/dist/AnnouncementModal-Bqy0pn3V.cjs.map +0 -1
  82. package/dist/AnnouncementModal-sxH4K5gy.js.map +0 -1
  83. package/dist/analytics-40-S_fHC.js +0 -440
  84. package/dist/analytics-40-S_fHC.js.map +0 -1
  85. package/dist/analytics-lEzOx2vl.cjs +0 -461
  86. package/dist/analytics-lEzOx2vl.cjs.map +0 -1
  87. package/dist/useBroadcasts-DzpCcbC8.js +0 -161
  88. package/dist/useBroadcasts-DzpCcbC8.js.map +0 -1
  89. package/dist/useBroadcasts-FP6ZrcY_.cjs +0 -160
  90. package/dist/useBroadcasts-FP6ZrcY_.cjs.map +0 -1
  91. package/dist/useCampaigns-BOZ9dDsG.cjs +0 -152
  92. package/dist/useCampaigns-BOZ9dDsG.cjs.map +0 -1
  93. package/dist/useCampaigns-D46b9zuf.js +0 -153
  94. package/dist/useCampaigns-D46b9zuf.js.map +0 -1
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+ const react = require("react");
3
+ const broadcasts = require("./broadcasts-BMoTZIuX.cjs");
4
+ const commonFeatures = require("./commonFeatures-CiqxxOin.cjs");
5
+ function useBroadcasts(options = {}) {
6
+ const {
7
+ variant,
8
+ platform,
9
+ maxBroadcasts = 10,
10
+ autoFetch = true,
11
+ realtime = false
12
+ } = options;
13
+ const [broadcasts$1, setBroadcasts] = react.useState([]);
14
+ const [isLoading, setIsLoading] = react.useState(autoFetch);
15
+ const [error, setError] = react.useState(null);
16
+ const dismissedIdsRef = react.useRef(/* @__PURE__ */ new Set());
17
+ const impressionTrackedRef = react.useRef(/* @__PURE__ */ new Set());
18
+ const fetchBroadcastsData = react.useCallback(async () => {
19
+ if (!commonFeatures.isInitialized()) {
20
+ setError(new Error("shared-features not initialized"));
21
+ setIsLoading(false);
22
+ return;
23
+ }
24
+ setIsLoading(true);
25
+ setError(null);
26
+ try {
27
+ const allBroadcasts = await broadcasts.fetchActiveBroadcasts({
28
+ variant,
29
+ platform
30
+ });
31
+ const filteredBroadcasts = allBroadcasts.filter((b) => !dismissedIdsRef.current.has(b.id)).slice(0, maxBroadcasts);
32
+ setBroadcasts(filteredBroadcasts);
33
+ } catch (err) {
34
+ const errorObj = err instanceof Error ? err : new Error("Failed to fetch broadcasts");
35
+ setError(errorObj);
36
+ console.error("[shared-features] Error fetching broadcasts:", err);
37
+ } finally {
38
+ setIsLoading(false);
39
+ }
40
+ }, [variant, platform, maxBroadcasts]);
41
+ react.useEffect(() => {
42
+ if (autoFetch) {
43
+ fetchBroadcastsData();
44
+ }
45
+ }, [autoFetch, fetchBroadcastsData]);
46
+ react.useEffect(() => {
47
+ if (!realtime || !commonFeatures.isInitialized()) return;
48
+ const unsubscribe = broadcasts.subscribeToBroadcasts(
49
+ (newBroadcasts) => {
50
+ const filtered = newBroadcasts.filter((b) => !dismissedIdsRef.current.has(b.id)).filter((b) => !variant || b.variant === variant).slice(0, maxBroadcasts);
51
+ setBroadcasts(filtered);
52
+ setIsLoading(false);
53
+ },
54
+ { variant, platform }
55
+ );
56
+ return () => {
57
+ unsubscribe();
58
+ };
59
+ }, [realtime, variant, platform, maxBroadcasts]);
60
+ const handleDismissBroadcast = react.useCallback((broadcastId) => {
61
+ dismissedIdsRef.current.add(broadcastId);
62
+ setBroadcasts((prev) => prev.filter((b) => b.id !== broadcastId));
63
+ broadcasts.trackBroadcastDismiss(broadcastId).catch((err) => {
64
+ console.error("[shared-features] Failed to track dismiss:", err);
65
+ });
66
+ }, []);
67
+ const handleTrackImpression = react.useCallback((broadcastId) => {
68
+ if (impressionTrackedRef.current.has(broadcastId)) return;
69
+ impressionTrackedRef.current.add(broadcastId);
70
+ broadcasts.trackBroadcastImpression(broadcastId).catch((err) => {
71
+ console.error("[shared-features] Failed to track impression:", err);
72
+ });
73
+ }, []);
74
+ const handleTrackClick = react.useCallback((broadcastId) => {
75
+ broadcasts.trackBroadcastClick(broadcastId).catch((err) => {
76
+ console.error("[shared-features] Failed to track click:", err);
77
+ });
78
+ }, []);
79
+ const checkIsDismissed = react.useCallback((broadcastId) => {
80
+ return dismissedIdsRef.current.has(broadcastId);
81
+ }, []);
82
+ const handleRefresh = react.useCallback(async () => {
83
+ broadcasts.clearBroadcastsCache();
84
+ await fetchBroadcastsData();
85
+ }, [fetchBroadcastsData]);
86
+ return {
87
+ broadcasts: broadcasts$1,
88
+ isLoading,
89
+ error,
90
+ dismissBroadcast: handleDismissBroadcast,
91
+ trackImpression: handleTrackImpression,
92
+ trackClick: handleTrackClick,
93
+ isDismissed: checkIsDismissed,
94
+ refresh: handleRefresh
95
+ };
96
+ }
97
+ function useBannerBroadcasts(options = {}) {
98
+ return useBroadcasts({ ...options, variant: "banner" });
99
+ }
100
+ function useModalBroadcasts(options = {}) {
101
+ return useBroadcasts({ ...options, variant: "modal", maxBroadcasts: 1 });
102
+ }
103
+ function useToastBroadcasts(options = {}) {
104
+ return useBroadcasts({ ...options, variant: "toast" });
105
+ }
106
+ function useBellBroadcasts(options = {}) {
107
+ return useBroadcasts({ ...options, variant: "bell" });
108
+ }
109
+ function useSingleBroadcast(options = {}) {
110
+ const result = useBroadcasts({ ...options, maxBroadcasts: 1 });
111
+ const broadcast = result.broadcasts[0] || null;
112
+ return {
113
+ broadcast,
114
+ isLoading: result.isLoading,
115
+ error: result.error,
116
+ dismiss: () => broadcast && result.dismissBroadcast(broadcast.id),
117
+ trackImpression: () => broadcast && result.trackImpression(broadcast.id),
118
+ trackClick: () => broadcast && result.trackClick(broadcast.id),
119
+ isDismissed: broadcast ? result.isDismissed(broadcast.id) : false
120
+ };
121
+ }
122
+ function useAnnouncementModal() {
123
+ const { broadcast, dismiss, trackImpression, trackClick } = useSingleBroadcast({
124
+ variant: "modal"
125
+ });
126
+ const [isOpen, setIsOpen] = react.useState(false);
127
+ const impressionTrackedRef = react.useRef(false);
128
+ react.useEffect(() => {
129
+ if (broadcast && !impressionTrackedRef.current) {
130
+ setIsOpen(true);
131
+ trackImpression();
132
+ impressionTrackedRef.current = true;
133
+ }
134
+ }, [broadcast, trackImpression]);
135
+ const handleClose = react.useCallback(() => {
136
+ setIsOpen(false);
137
+ dismiss();
138
+ }, [dismiss]);
139
+ const handleAction = react.useCallback(() => {
140
+ trackClick();
141
+ if (broadcast?.actionUrl) {
142
+ window.open(broadcast.actionUrl, "_blank");
143
+ }
144
+ handleClose();
145
+ }, [broadcast, trackClick, handleClose]);
146
+ return {
147
+ broadcast,
148
+ isOpen,
149
+ close: handleClose,
150
+ handleAction
151
+ };
152
+ }
153
+ function useFeatureFlags(options = {}) {
154
+ const {
155
+ autoRefresh = false,
156
+ refreshInterval = 5 * 60 * 1e3,
157
+ // 5 minutes
158
+ autoFetch = true
159
+ } = options;
160
+ const [status, setStatus] = react.useState(null);
161
+ const [loading, setLoading] = react.useState(autoFetch);
162
+ const [error, setError] = react.useState(null);
163
+ const mountedRef = react.useRef(true);
164
+ const consumerVersions = react.useRef(
165
+ commonFeatures.getState().config?.featureVersions
166
+ );
167
+ const fetchStatus = react.useCallback(async () => {
168
+ if (!commonFeatures.isInitialized()) {
169
+ setError("shared-features not initialized");
170
+ setLoading(false);
171
+ return;
172
+ }
173
+ setLoading(true);
174
+ setError(null);
175
+ try {
176
+ const newStatus = await commonFeatures.getSharedFeaturesStatus(consumerVersions.current);
177
+ if (mountedRef.current) {
178
+ setStatus(newStatus);
179
+ }
180
+ } catch (err) {
181
+ const message = err instanceof Error ? err.message : "Failed to fetch feature flags";
182
+ if (mountedRef.current) {
183
+ setError(message);
184
+ console.error("[shared-features] Error fetching feature flags:", err);
185
+ }
186
+ } finally {
187
+ if (mountedRef.current) {
188
+ setLoading(false);
189
+ }
190
+ }
191
+ }, []);
192
+ react.useEffect(() => {
193
+ if (autoFetch) {
194
+ fetchStatus();
195
+ }
196
+ }, [autoFetch, fetchStatus]);
197
+ react.useEffect(() => {
198
+ if (!autoRefresh) return;
199
+ const interval = setInterval(() => {
200
+ fetchStatus();
201
+ }, refreshInterval);
202
+ return () => clearInterval(interval);
203
+ }, [autoRefresh, refreshInterval, fetchStatus]);
204
+ react.useEffect(() => {
205
+ mountedRef.current = true;
206
+ return () => {
207
+ mountedRef.current = false;
208
+ };
209
+ }, []);
210
+ const checkFeatureAvailable = react.useCallback(
211
+ (featureId) => {
212
+ if (!status) return commonFeatures.isFeatureEnabled(featureId);
213
+ const availability = status.features[featureId];
214
+ return availability?.available ?? false;
215
+ },
216
+ [status]
217
+ );
218
+ const getAvailability = react.useCallback(
219
+ (featureId) => {
220
+ if (!status) return null;
221
+ return status.features[featureId] ?? null;
222
+ },
223
+ [status]
224
+ );
225
+ const refetch = react.useCallback(async () => {
226
+ commonFeatures.clearFeatureFlagsCache();
227
+ await fetchStatus();
228
+ }, [fetchStatus]);
229
+ return {
230
+ status,
231
+ loading,
232
+ error,
233
+ refetch,
234
+ isFeatureAvailable: checkFeatureAvailable,
235
+ getFeatureAvailability: getAvailability,
236
+ hasDeprecatedFeatures: (status?.deprecatedFeatures.length ?? 0) > 0,
237
+ hasUpgradeRequired: (status?.upgradeRequiredFeatures.length ?? 0) > 0
238
+ };
239
+ }
240
+ function useFeature(featureId) {
241
+ const [availability, setAvailability] = react.useState(
242
+ null
243
+ );
244
+ const [loading, setLoading] = react.useState(true);
245
+ react.useEffect(() => {
246
+ let mounted = true;
247
+ const checkFeature = async () => {
248
+ if (!commonFeatures.isInitialized()) {
249
+ setLoading(false);
250
+ return;
251
+ }
252
+ try {
253
+ const consumerVersions = commonFeatures.getState().config?.featureVersions;
254
+ const result = await commonFeatures.checkFeatureAvailability(
255
+ featureId,
256
+ consumerVersions
257
+ );
258
+ if (mounted) {
259
+ setAvailability(result);
260
+ }
261
+ } catch (err) {
262
+ console.error(
263
+ `[shared-features] Error checking feature '${featureId}':`,
264
+ err
265
+ );
266
+ } finally {
267
+ if (mounted) {
268
+ setLoading(false);
269
+ }
270
+ }
271
+ };
272
+ checkFeature();
273
+ return () => {
274
+ mounted = false;
275
+ };
276
+ }, [featureId]);
277
+ return {
278
+ /** Whether the feature is available */
279
+ available: availability?.available ?? false,
280
+ /** Whether the check is in progress */
281
+ loading,
282
+ /** Full availability details */
283
+ availability,
284
+ /** Whether the feature is enabled (but might need upgrade) */
285
+ enabled: availability?.enabled ?? false,
286
+ /** Whether using a deprecated version */
287
+ deprecated: availability?.deprecated ?? false,
288
+ /** Whether an upgrade is required */
289
+ upgradeRequired: availability?.upgradeRequired ?? false,
290
+ /** Deprecation warning if applicable */
291
+ deprecationWarning: availability?.deprecationWarning,
292
+ /** Reason feature is unavailable */
293
+ unavailableReason: availability?.unavailableReason
294
+ };
295
+ }
296
+ function useFeatureFlagsSubscription(callback) {
297
+ const callbackRef = react.useRef(callback);
298
+ callbackRef.current = callback;
299
+ react.useEffect(() => {
300
+ if (!commonFeatures.isInitialized()) return;
301
+ const consumerVersions = commonFeatures.getState().config?.featureVersions;
302
+ const unsubscribe = commonFeatures.subscribeToFeatureFlags(async (flags) => {
303
+ if (!flags) {
304
+ callbackRef.current(null);
305
+ return;
306
+ }
307
+ const status = await commonFeatures.getSharedFeaturesStatus(consumerVersions);
308
+ callbackRef.current(status);
309
+ });
310
+ return () => unsubscribe();
311
+ }, []);
312
+ }
313
+ function useSharedFeaturesOperational() {
314
+ const { status, loading } = useFeatureFlags({ autoFetch: true });
315
+ return {
316
+ /** Whether shared-features is operational */
317
+ operational: status?.operational ?? false,
318
+ /** Whether check is in progress */
319
+ loading,
320
+ /** Maintenance message if in maintenance mode */
321
+ maintenanceMessage: status?.maintenanceMessage,
322
+ /** Whether in maintenance mode */
323
+ maintenanceMode: status?.maintenanceMode ?? false,
324
+ /** Current API version */
325
+ apiVersion: status?.apiVersion ?? "v1"
326
+ };
327
+ }
328
+ function useFeatureGate(featureId) {
329
+ const { available, loading, deprecated, deprecationWarning } = useFeature(featureId);
330
+ react.useEffect(() => {
331
+ if (deprecated && deprecationWarning) {
332
+ console.warn(`[shared-features] ${deprecationWarning}`);
333
+ }
334
+ }, [deprecated, deprecationWarning]);
335
+ return {
336
+ /** Whether the feature should be rendered */
337
+ shouldRender: available,
338
+ /** Whether still checking availability */
339
+ loading,
340
+ /** Whether using deprecated version */
341
+ deprecated,
342
+ /** Component that renders children if available, fallback otherwise */
343
+ FallbackOrChildren: react.useCallback(
344
+ ({
345
+ children,
346
+ fallback = null
347
+ }) => {
348
+ if (loading) return null;
349
+ return available ? children : fallback;
350
+ },
351
+ [available, loading]
352
+ )
353
+ };
354
+ }
355
+ exports.useAnnouncementModal = useAnnouncementModal;
356
+ exports.useBannerBroadcasts = useBannerBroadcasts;
357
+ exports.useBellBroadcasts = useBellBroadcasts;
358
+ exports.useBroadcasts = useBroadcasts;
359
+ exports.useFeature = useFeature;
360
+ exports.useFeatureFlags = useFeatureFlags;
361
+ exports.useFeatureFlagsSubscription = useFeatureFlagsSubscription;
362
+ exports.useFeatureGate = useFeatureGate;
363
+ exports.useModalBroadcasts = useModalBroadcasts;
364
+ exports.useSharedFeaturesOperational = useSharedFeaturesOperational;
365
+ exports.useSingleBroadcast = useSingleBroadcast;
366
+ exports.useToastBroadcasts = useToastBroadcasts;
367
+ //# sourceMappingURL=useFeatureFlags-DXqBJ5Mh.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFeatureFlags-DXqBJ5Mh.cjs","sources":["../src/hooks/useBroadcasts.ts","../src/hooks/useFeatureFlags.ts"],"sourcesContent":["/**\n * useBroadcasts Hook\n *\n * React hook for fetching and displaying broadcast notifications in consumer projects.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n fetchActiveBroadcasts,\n subscribeToBroadcasts,\n trackBroadcastImpression,\n trackBroadcastClick,\n trackBroadcastDismiss,\n clearBroadcastsCache,\n} from '../services/broadcasts';\nimport { isInitialized } from '../firebase/config';\nimport type {\n BroadcastNotification,\n BroadcastVariant,\n NotificationPlatform,\n UseBroadcastsReturn,\n} from '../types/notifications';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UseBroadcastsOptions {\n /** Filter by variant type */\n variant?: BroadcastVariant;\n /** Override platform detection */\n platform?: NotificationPlatform;\n /** Maximum number of broadcasts to return */\n maxBroadcasts?: number;\n /** Whether to auto-fetch on mount (default: true) */\n autoFetch?: boolean;\n /** Whether to subscribe to real-time updates (default: false) */\n realtime?: boolean;\n}\n\n// ============================================================================\n// MAIN HOOK\n// ============================================================================\n\n/**\n * Hook to fetch and manage broadcast notifications\n *\n * @example\n * ```tsx\n * const { broadcasts, isLoading, dismissBroadcast, trackClick } = useBroadcasts({\n * variant: 'banner',\n * maxBroadcasts: 3,\n * });\n *\n * return (\n * <div>\n * {broadcasts.map(broadcast => (\n * <BroadcastBanner\n * key={broadcast.id}\n * broadcast={broadcast}\n * onDismiss={() => dismissBroadcast(broadcast.id)}\n * onActionClick={() => trackClick(broadcast.id)}\n * />\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useBroadcasts(\n options: UseBroadcastsOptions = {}\n): UseBroadcastsReturn {\n const {\n variant,\n platform,\n maxBroadcasts = 10,\n autoFetch = true,\n realtime = false,\n } = options;\n\n const [broadcasts, setBroadcasts] = useState<BroadcastNotification[]>([]);\n const [isLoading, setIsLoading] = useState(autoFetch);\n const [error, setError] = useState<Error | null>(null);\n const dismissedIdsRef = useRef<Set<string>>(new Set());\n const impressionTrackedRef = useRef<Set<string>>(new Set());\n\n // Fetch broadcasts\n const fetchBroadcastsData = useCallback(async () => {\n if (!isInitialized()) {\n setError(new Error('shared-features not initialized'));\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const allBroadcasts = await fetchActiveBroadcasts({\n variant,\n platform,\n });\n\n // Filter out locally dismissed and limit count\n const filteredBroadcasts = allBroadcasts\n .filter((b) => !dismissedIdsRef.current.has(b.id))\n .slice(0, maxBroadcasts);\n\n setBroadcasts(filteredBroadcasts);\n } catch (err) {\n const errorObj =\n err instanceof Error ? err : new Error('Failed to fetch broadcasts');\n setError(errorObj);\n console.error('[shared-features] Error fetching broadcasts:', err);\n } finally {\n setIsLoading(false);\n }\n }, [variant, platform, maxBroadcasts]);\n\n // Auto-fetch on mount\n useEffect(() => {\n if (autoFetch) {\n fetchBroadcastsData();\n }\n }, [autoFetch, fetchBroadcastsData]);\n\n // Real-time subscription\n useEffect(() => {\n if (!realtime || !isInitialized()) return;\n\n const unsubscribe = subscribeToBroadcasts(\n (newBroadcasts) => {\n // Filter and limit\n const filtered = newBroadcasts\n .filter((b) => !dismissedIdsRef.current.has(b.id))\n .filter((b) => !variant || b.variant === variant)\n .slice(0, maxBroadcasts);\n\n setBroadcasts(filtered);\n setIsLoading(false);\n },\n { variant, platform }\n );\n\n return () => {\n unsubscribe();\n };\n }, [realtime, variant, platform, maxBroadcasts]);\n\n // Dismiss broadcast\n const handleDismissBroadcast = useCallback((broadcastId: string) => {\n // Update local state immediately\n dismissedIdsRef.current.add(broadcastId);\n setBroadcasts((prev) => prev.filter((b) => b.id !== broadcastId));\n\n // Track dismiss and persist\n trackBroadcastDismiss(broadcastId).catch((err) => {\n console.error('[shared-features] Failed to track dismiss:', err);\n });\n }, []);\n\n // Track impression\n const handleTrackImpression = useCallback((broadcastId: string) => {\n // Only track once per session\n if (impressionTrackedRef.current.has(broadcastId)) return;\n impressionTrackedRef.current.add(broadcastId);\n\n trackBroadcastImpression(broadcastId).catch((err) => {\n console.error('[shared-features] Failed to track impression:', err);\n });\n }, []);\n\n // Track click\n const handleTrackClick = useCallback((broadcastId: string) => {\n trackBroadcastClick(broadcastId).catch((err) => {\n console.error('[shared-features] Failed to track click:', err);\n });\n }, []);\n\n // Check if dismissed\n const checkIsDismissed = useCallback((broadcastId: string) => {\n return dismissedIdsRef.current.has(broadcastId);\n }, []);\n\n // Refresh broadcasts\n const handleRefresh = useCallback(async () => {\n clearBroadcastsCache();\n await fetchBroadcastsData();\n }, [fetchBroadcastsData]);\n\n return {\n broadcasts,\n isLoading,\n error,\n dismissBroadcast: handleDismissBroadcast,\n trackImpression: handleTrackImpression,\n trackClick: handleTrackClick,\n isDismissed: checkIsDismissed,\n refresh: handleRefresh,\n };\n}\n\n// ============================================================================\n// SPECIALIZED HOOKS\n// ============================================================================\n\n/**\n * Hook specifically for banner broadcasts\n */\nexport function useBannerBroadcasts(\n options: Omit<UseBroadcastsOptions, 'variant'> = {}\n) {\n return useBroadcasts({ ...options, variant: 'banner' });\n}\n\n/**\n * Hook specifically for modal broadcasts\n */\nexport function useModalBroadcasts(\n options: Omit<UseBroadcastsOptions, 'variant'> = {}\n) {\n return useBroadcasts({ ...options, variant: 'modal', maxBroadcasts: 1 });\n}\n\n/**\n * Hook specifically for toast broadcasts\n */\nexport function useToastBroadcasts(\n options: Omit<UseBroadcastsOptions, 'variant'> = {}\n) {\n return useBroadcasts({ ...options, variant: 'toast' });\n}\n\n/**\n * Hook specifically for bell/notification center broadcasts\n */\nexport function useBellBroadcasts(\n options: Omit<UseBroadcastsOptions, 'variant'> = {}\n) {\n return useBroadcasts({ ...options, variant: 'bell' });\n}\n\n// ============================================================================\n// SINGLE BROADCAST HOOK\n// ============================================================================\n\nexport interface UseSingleBroadcastReturn {\n /** The broadcast (first matching one) */\n broadcast: BroadcastNotification | null;\n /** Whether loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | null;\n /** Dismiss the broadcast */\n dismiss: () => void;\n /** Track impression */\n trackImpression: () => void;\n /** Track click */\n trackClick: () => void;\n /** Whether broadcast was dismissed */\n isDismissed: boolean;\n}\n\n/**\n * Hook to get a single broadcast (convenience wrapper)\n *\n * @example\n * ```tsx\n * const { broadcast, dismiss, trackClick } = useSingleBroadcast({ variant: 'modal' });\n *\n * if (!broadcast) return null;\n *\n * return (\n * <AnnouncementModal\n * broadcast={broadcast}\n * onClose={dismiss}\n * onActionClick={trackClick}\n * />\n * );\n * ```\n */\nexport function useSingleBroadcast(\n options: Omit<UseBroadcastsOptions, 'maxBroadcasts'> = {}\n): UseSingleBroadcastReturn {\n const result = useBroadcasts({ ...options, maxBroadcasts: 1 });\n const broadcast = result.broadcasts[0] || null;\n\n return {\n broadcast,\n isLoading: result.isLoading,\n error: result.error,\n dismiss: () => broadcast && result.dismissBroadcast(broadcast.id),\n trackImpression: () => broadcast && result.trackImpression(broadcast.id),\n trackClick: () => broadcast && result.trackClick(broadcast.id),\n isDismissed: broadcast ? result.isDismissed(broadcast.id) : false,\n };\n}\n\n// ============================================================================\n// ANNOUNCEMENT MODAL HOOK\n// ============================================================================\n\nexport interface UseAnnouncementModalReturn {\n /** The modal broadcast to display */\n broadcast: BroadcastNotification | null;\n /** Whether the modal should be shown */\n isOpen: boolean;\n /** Close the modal */\n close: () => void;\n /** Handle action button click */\n handleAction: () => void;\n}\n\n/**\n * Hook for managing announcement modal display\n * Automatically tracks impressions and handles dismissal\n *\n * @example\n * ```tsx\n * const { broadcast, isOpen, close, handleAction } = useAnnouncementModal();\n *\n * return (\n * <Dialog open={isOpen} onOpenChange={(open) => !open && close()}>\n * <DialogContent>\n * <h2>{broadcast?.title}</h2>\n * <p>{broadcast?.message}</p>\n * {broadcast?.actionUrl && (\n * <Button onClick={handleAction}>{broadcast.actionText || 'Learn More'}</Button>\n * )}\n * </DialogContent>\n * </Dialog>\n * );\n * ```\n */\nexport function useAnnouncementModal(): UseAnnouncementModalReturn {\n const { broadcast, dismiss, trackImpression, trackClick } = useSingleBroadcast({\n variant: 'modal',\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const impressionTrackedRef = useRef(false);\n\n // Show modal when broadcast is available\n useEffect(() => {\n if (broadcast && !impressionTrackedRef.current) {\n setIsOpen(true);\n trackImpression();\n impressionTrackedRef.current = true;\n }\n }, [broadcast, trackImpression]);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n dismiss();\n }, [dismiss]);\n\n const handleAction = useCallback(() => {\n trackClick();\n if (broadcast?.actionUrl) {\n window.open(broadcast.actionUrl, '_blank');\n }\n handleClose();\n }, [broadcast, trackClick, handleClose]);\n\n return {\n broadcast,\n isOpen,\n close: handleClose,\n handleAction,\n };\n}\n","/**\n * useFeatureFlags Hook\n *\n * React hook for checking feature availability and status in consumer projects.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n getSharedFeaturesStatus,\n checkFeatureAvailability,\n isFeatureEnabled,\n subscribeToFeatureFlags,\n clearFeatureFlagsCache,\n} from '../services/featureFlags';\nimport { isInitialized, getState } from '../firebase/config';\nimport type {\n FeatureId,\n FeatureAvailability,\n SharedFeaturesStatus,\n UseFeatureFlagsOptions,\n UseFeatureFlagsResult,\n ConsumerFeatureVersions,\n} from '../types/featureFlags';\n\n/**\n * Hook to fetch and monitor feature flags\n *\n * @param options - Hook options\n * @returns Feature flags status and utilities\n *\n * @example\n * ```tsx\n * const {\n * status,\n * loading,\n * isFeatureAvailable,\n * hasDeprecatedFeatures\n * } = useFeatureFlags();\n *\n * if (loading) return <Spinner />;\n *\n * if (!status?.operational) {\n * return <MaintenancePage message={status?.maintenanceMessage} />;\n * }\n *\n * if (isFeatureAvailable('contactInfo')) {\n * return <ContactInfo />;\n * }\n * ```\n */\nexport function useFeatureFlags(\n options: UseFeatureFlagsOptions = {}\n): UseFeatureFlagsResult {\n const {\n autoRefresh = false,\n refreshInterval = 5 * 60 * 1000, // 5 minutes\n autoFetch = true,\n } = options;\n\n const [status, setStatus] = useState<SharedFeaturesStatus | null>(null);\n const [loading, setLoading] = useState(autoFetch);\n const [error, setError] = useState<string | null>(null);\n\n // Track mounted state to prevent state updates after unmount\n const mountedRef = useRef(true);\n\n // Get consumer versions from config if available\n const consumerVersions = useRef<ConsumerFeatureVersions | undefined>(\n getState().config?.featureVersions\n );\n\n // Fetch status\n const fetchStatus = useCallback(async () => {\n if (!isInitialized()) {\n setError('shared-features not initialized');\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const newStatus = await getSharedFeaturesStatus(consumerVersions.current);\n\n if (mountedRef.current) {\n setStatus(newStatus);\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Failed to fetch feature flags';\n\n if (mountedRef.current) {\n setError(message);\n console.error('[shared-features] Error fetching feature flags:', err);\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, []);\n\n // Auto-fetch on mount\n useEffect(() => {\n if (autoFetch) {\n fetchStatus();\n }\n }, [autoFetch, fetchStatus]);\n\n // Auto-refresh interval\n useEffect(() => {\n if (!autoRefresh) return;\n\n const interval = setInterval(() => {\n fetchStatus();\n }, refreshInterval);\n\n return () => clearInterval(interval);\n }, [autoRefresh, refreshInterval, fetchStatus]);\n\n // Cleanup on unmount\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Check if a feature is available\n const checkFeatureAvailable = useCallback(\n (featureId: FeatureId): boolean => {\n // Quick check using cached data\n if (!status) return isFeatureEnabled(featureId);\n\n const availability = status.features[featureId];\n return availability?.available ?? false;\n },\n [status]\n );\n\n // Get feature availability details\n const getAvailability = useCallback(\n (featureId: FeatureId): FeatureAvailability | null => {\n if (!status) return null;\n return status.features[featureId] ?? null;\n },\n [status]\n );\n\n // Refetch with cache clear\n const refetch = useCallback(async () => {\n clearFeatureFlagsCache();\n await fetchStatus();\n }, [fetchStatus]);\n\n return {\n status,\n loading,\n error,\n refetch,\n isFeatureAvailable: checkFeatureAvailable,\n getFeatureAvailability: getAvailability,\n hasDeprecatedFeatures: (status?.deprecatedFeatures.length ?? 0) > 0,\n hasUpgradeRequired: (status?.upgradeRequiredFeatures.length ?? 0) > 0,\n };\n}\n\n/**\n * Hook to check a single feature's availability\n *\n * @param featureId - The feature to check\n * @returns Feature availability and loading state\n *\n * @example\n * ```tsx\n * const { available, loading, deprecated } = useFeature('contactInfo');\n *\n * if (loading) return <Spinner />;\n * if (!available) return null;\n *\n * return <ContactInfo />;\n * ```\n */\nexport function useFeature(featureId: FeatureId) {\n const [availability, setAvailability] = useState<FeatureAvailability | null>(\n null\n );\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let mounted = true;\n\n const checkFeature = async () => {\n if (!isInitialized()) {\n setLoading(false);\n return;\n }\n\n try {\n const consumerVersions = getState().config?.featureVersions;\n const result = await checkFeatureAvailability(\n featureId,\n consumerVersions\n );\n\n if (mounted) {\n setAvailability(result);\n }\n } catch (err) {\n console.error(\n `[shared-features] Error checking feature '${featureId}':`,\n err\n );\n } finally {\n if (mounted) {\n setLoading(false);\n }\n }\n };\n\n checkFeature();\n\n return () => {\n mounted = false;\n };\n }, [featureId]);\n\n return {\n /** Whether the feature is available */\n available: availability?.available ?? false,\n /** Whether the check is in progress */\n loading,\n /** Full availability details */\n availability,\n /** Whether the feature is enabled (but might need upgrade) */\n enabled: availability?.enabled ?? false,\n /** Whether using a deprecated version */\n deprecated: availability?.deprecated ?? false,\n /** Whether an upgrade is required */\n upgradeRequired: availability?.upgradeRequired ?? false,\n /** Deprecation warning if applicable */\n deprecationWarning: availability?.deprecationWarning,\n /** Reason feature is unavailable */\n unavailableReason: availability?.unavailableReason,\n };\n}\n\n/**\n * Hook to subscribe to real-time feature flag updates\n *\n * @param callback - Function to call when flags change\n *\n * @example\n * ```tsx\n * useFeatureFlagsSubscription((flags) => {\n * if (flags?.maintenanceMode) {\n * showMaintenanceBanner();\n * }\n * });\n * ```\n */\nexport function useFeatureFlagsSubscription(\n callback: (status: SharedFeaturesStatus | null) => void\n) {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!isInitialized()) return;\n\n const consumerVersions = getState().config?.featureVersions;\n\n const unsubscribe = subscribeToFeatureFlags(async (flags) => {\n if (!flags) {\n callbackRef.current(null);\n return;\n }\n\n // Get full status with current flags\n const status = await getSharedFeaturesStatus(consumerVersions);\n callbackRef.current(status);\n });\n\n return () => unsubscribe();\n }, []);\n}\n\n/**\n * Hook to check if shared-features is operational\n *\n * @returns Whether shared-features is operational\n *\n * @example\n * ```tsx\n * const { operational, maintenanceMessage } = useSharedFeaturesOperational();\n *\n * if (!operational) {\n * return <MaintenancePage message={maintenanceMessage} />;\n * }\n * ```\n */\nexport function useSharedFeaturesOperational() {\n const { status, loading } = useFeatureFlags({ autoFetch: true });\n\n return {\n /** Whether shared-features is operational */\n operational: status?.operational ?? false,\n /** Whether check is in progress */\n loading,\n /** Maintenance message if in maintenance mode */\n maintenanceMessage: status?.maintenanceMessage,\n /** Whether in maintenance mode */\n maintenanceMode: status?.maintenanceMode ?? false,\n /** Current API version */\n apiVersion: status?.apiVersion ?? 'v1',\n };\n}\n\n/**\n * Hook for conditional rendering based on feature availability\n *\n * @param featureId - The feature to check\n * @returns Object with show/hide helpers\n *\n * @example\n * ```tsx\n * const { shouldRender, FallbackOrChildren } = useFeatureGate('contactInfo');\n *\n * return (\n * <FallbackOrChildren fallback={<OldContactInfo />}>\n * <NewContactInfo />\n * </FallbackOrChildren>\n * );\n * ```\n */\nexport function useFeatureGate(featureId: FeatureId) {\n const { available, loading, deprecated, deprecationWarning } =\n useFeature(featureId);\n\n // Log deprecation warning in development\n useEffect(() => {\n if (deprecated && deprecationWarning) {\n console.warn(`[shared-features] ${deprecationWarning}`);\n }\n }, [deprecated, deprecationWarning]);\n\n return {\n /** Whether the feature should be rendered */\n shouldRender: available,\n /** Whether still checking availability */\n loading,\n /** Whether using deprecated version */\n deprecated,\n /** Component that renders children if available, fallback otherwise */\n FallbackOrChildren: useCallback(\n ({\n children,\n fallback = null,\n }: {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n }) => {\n if (loading) return null;\n return available ? children : fallback;\n },\n [available, loading]\n ),\n };\n}\n"],"names":["broadcasts","useState","useRef","useCallback","isInitialized","fetchActiveBroadcasts","useEffect","subscribeToBroadcasts","trackBroadcastDismiss","trackBroadcastImpression","trackBroadcastClick","clearBroadcastsCache","getState","getSharedFeaturesStatus","isFeatureEnabled","clearFeatureFlagsCache","checkFeatureAvailability","subscribeToFeatureFlags"],"mappings":"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"}
@@ -933,23 +933,23 @@ export {
933
933
  ACCOUNT_TEMPLATES as A,
934
934
  PROMOTIONAL_TEMPLATES as P,
935
935
  REPORT_TEMPLATES as R,
936
- SYSTEM_TEMPLATES as S,
937
- interpolateWithFormatters as a,
938
- ACTIVITY_TEMPLATES as b,
939
- ALL_STANDARD_TEMPLATES as c,
936
+ STANDARD_EVENTS as S,
937
+ ACTIVITY_TEMPLATES as a,
938
+ ALL_STANDARD_TEMPLATES as b,
939
+ SYSTEM_TEMPLATES as c,
940
940
  defaultFormatters as d,
941
- extractVariables as e,
942
- getTemplatesByCategory as f,
943
- getTemplateByEventType as g,
941
+ eventRegistry as e,
942
+ extractVariables as f,
943
+ getAllEventTypes as g,
944
944
  getEnabledTemplates as h,
945
- interpolate as i,
946
- STANDARD_EVENTS as j,
947
- eventRegistry as k,
948
- getEventDefinition as l,
949
- getEventsByCategory as m,
950
- getAllEventTypes as n,
945
+ getEventDefinition as i,
946
+ getEventsByCategory as j,
947
+ getTemplateByEventType as k,
948
+ getTemplatesByCategory as l,
949
+ interpolate as m,
950
+ interpolateWithFormatters as n,
951
951
  registerCustomEvent as r,
952
952
  useNotificationEvents as u,
953
953
  validateContext as v
954
954
  };
955
- //# sourceMappingURL=useNotificationEvents-D8DVxah1.js.map
955
+ //# sourceMappingURL=useNotificationEvents-DAmR7FYF.js.map