shared-features 0.1.0 → 0.1.2

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 (63) hide show
  1. package/dist/admin-commonFeatures-BqSmAHvZ.js +730 -0
  2. package/dist/admin-commonFeatures-BqSmAHvZ.js.map +1 -0
  3. package/dist/{admin-notifications-D1GgYCJW.cjs → admin-commonFeatures-LWADQRoD.cjs} +369 -2
  4. package/dist/admin-commonFeatures-LWADQRoD.cjs.map +1 -0
  5. package/dist/{broadcasts-DnzZkCoy.js → broadcasts-B36bWyZf.js} +2 -2
  6. package/dist/{broadcasts-DnzZkCoy.js.map → broadcasts-B36bWyZf.js.map} +1 -1
  7. package/dist/{broadcasts-BMoTZIuX.cjs → broadcasts-D3_TQybH.cjs} +2 -2
  8. package/dist/{broadcasts-BMoTZIuX.cjs.map → broadcasts-D3_TQybH.cjs.map} +1 -1
  9. package/dist/{commonFeatures-CiqxxOin.cjs → commonFeatures-B9NKYWuL.cjs} +87 -2
  10. package/dist/commonFeatures-B9NKYWuL.cjs.map +1 -0
  11. package/dist/{commonFeatures-Bdt0UZox.js → commonFeatures-BNmLKLa9.js} +129 -44
  12. package/dist/commonFeatures-BNmLKLa9.js.map +1 -0
  13. package/dist/{commonFeatures-Cr5g1E4M.cjs → commonFeatures-DhWaBEv_.cjs} +24 -2
  14. package/dist/commonFeatures-DhWaBEv_.cjs.map +1 -0
  15. package/dist/{commonFeatures-HT-UO7HW.js → commonFeatures-XJ9fuxg_.js} +27 -5
  16. package/dist/commonFeatures-XJ9fuxg_.js.map +1 -0
  17. package/dist/components/common/index.d.ts +8 -1
  18. package/dist/components/common/index.d.ts.map +1 -1
  19. package/dist/components/index.cjs +1 -1
  20. package/dist/components/index.js +1 -1
  21. package/dist/hooks/index.cjs +2 -2
  22. package/dist/hooks/index.js +2 -2
  23. package/dist/hooks/useCommonFeatures.d.ts +29 -1
  24. package/dist/hooks/useCommonFeatures.d.ts.map +1 -1
  25. package/dist/{index-Dv34aG2I.js → index-BJXr96cC.js} +3 -3
  26. package/dist/{index-Dv34aG2I.js.map → index-BJXr96cC.js.map} +1 -1
  27. package/dist/{index-Dt5YjYnK.cjs → index-CvRtEhjW.cjs} +3 -3
  28. package/dist/{index-Dt5YjYnK.cjs.map → index-CvRtEhjW.cjs.map} +1 -1
  29. package/dist/index.cjs +54 -25
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +121 -92
  32. package/dist/services/admin-commonFeatures.d.ts +35 -0
  33. package/dist/services/admin-commonFeatures.d.ts.map +1 -0
  34. package/dist/services/commonFeatures.d.ts +4 -1
  35. package/dist/services/commonFeatures.d.ts.map +1 -1
  36. package/dist/services/index.cjs +49 -22
  37. package/dist/services/index.cjs.map +1 -1
  38. package/dist/services/index.d.ts +2 -1
  39. package/dist/services/index.d.ts.map +1 -1
  40. package/dist/services/index.js +82 -55
  41. package/dist/types/commonFeatures.d.ts +38 -0
  42. package/dist/types/commonFeatures.d.ts.map +1 -1
  43. package/dist/types/index.cjs +3 -1
  44. package/dist/types/index.cjs.map +1 -1
  45. package/dist/types/index.js +6 -4
  46. package/dist/{useCommonFeatures-DnDlhmri.cjs → useCommonFeatures-C4fOj6rp.cjs} +2 -2
  47. package/dist/useCommonFeatures-C4fOj6rp.cjs.map +1 -0
  48. package/dist/{useCommonFeatures-CgyDq6LZ.js → useCommonFeatures-DgwIAj9a.js} +2 -2
  49. package/dist/useCommonFeatures-DgwIAj9a.js.map +1 -0
  50. package/dist/{useFeatureFlags-BRJSyH9M.js → useFeatureFlags-BHr1EOg0.js} +3 -3
  51. package/dist/{useFeatureFlags-BRJSyH9M.js.map → useFeatureFlags-BHr1EOg0.js.map} +1 -1
  52. package/dist/{useFeatureFlags-DXqBJ5Mh.cjs → useFeatureFlags-QBLhm28R.cjs} +3 -3
  53. package/dist/{useFeatureFlags-DXqBJ5Mh.cjs.map → useFeatureFlags-QBLhm28R.cjs.map} +1 -1
  54. package/package.json +1 -1
  55. package/dist/admin-notifications-D1GgYCJW.cjs.map +0 -1
  56. package/dist/admin-notifications-NI7I76uY.js +0 -363
  57. package/dist/admin-notifications-NI7I76uY.js.map +0 -1
  58. package/dist/commonFeatures-Bdt0UZox.js.map +0 -1
  59. package/dist/commonFeatures-CiqxxOin.cjs.map +0 -1
  60. package/dist/commonFeatures-Cr5g1E4M.cjs.map +0 -1
  61. package/dist/commonFeatures-HT-UO7HW.js.map +0 -1
  62. package/dist/useCommonFeatures-CgyDq6LZ.js.map +0 -1
  63. package/dist/useCommonFeatures-DnDlhmri.cjs.map +0 -1
@@ -0,0 +1,730 @@
1
+ import { query, collection, where, Timestamp, getDocs, getDoc, doc, orderBy, deleteDoc, updateDoc, serverTimestamp, addDoc, setDoc } from "firebase/firestore";
2
+ import { L as getSharedFeaturesDb, h as clearPaymentOptionsCache, j as clearProjectsCache, k as clearServicesCache, l as clearSkillsCache, m as clearSocialLinksCache, n as clearTestimonialsCache, a as clearAddressInfoCache, e as clearContactInfoCache, f as clearDeveloperInfoCache } from "./commonFeatures-BNmLKLa9.js";
3
+ import { a as COMMON_FEATURE_COLLECTIONS } from "./commonFeatures-XJ9fuxg_.js";
4
+ const COLLECTION_BROADCASTS = "zaions_broadcasts";
5
+ const COLLECTION_TEMPLATES = "zaions_notification_templates";
6
+ const COLLECTION_BROADCAST_EVENTS = "zaions_broadcast_events";
7
+ function docToBroadcast(docId, data) {
8
+ return {
9
+ id: docId,
10
+ title: data.title,
11
+ message: data.message,
12
+ type: data.type,
13
+ category: data.category,
14
+ isRead: false,
15
+ isImportant: data.isImportant,
16
+ actionUrl: data.actionUrl,
17
+ actionText: data.actionText,
18
+ createdAt: data.createdAt,
19
+ metadata: data.metadata,
20
+ targetProjects: data.targetProjects || [],
21
+ targetPlatforms: data.targetPlatforms || [],
22
+ targetAudience: data.targetAudience || "all",
23
+ status: data.status,
24
+ startDate: data.startDate,
25
+ endDate: data.endDate,
26
+ priority: data.priority || 50,
27
+ dismissible: data.dismissible !== false,
28
+ variant: data.variant || "banner",
29
+ impressions: data.impressions || 0,
30
+ clicks: data.clicks || 0,
31
+ createdBy: data.createdBy,
32
+ updatedBy: data.updatedBy
33
+ };
34
+ }
35
+ function docToTemplate(docId, data) {
36
+ return {
37
+ id: docId,
38
+ name: data.name,
39
+ eventType: data.eventType,
40
+ category: data.category,
41
+ title: data.title,
42
+ message: data.message,
43
+ variables: data.variables || [],
44
+ type: data.type,
45
+ isImportant: data.isImportant,
46
+ actionUrl: data.actionUrl,
47
+ actionText: data.actionText,
48
+ enabled: data.enabled !== false,
49
+ createdAt: data.createdAt?.toDate() || /* @__PURE__ */ new Date(),
50
+ updatedAt: data.updatedAt?.toDate() || /* @__PURE__ */ new Date()
51
+ };
52
+ }
53
+ async function createBroadcast(input, adminUserId) {
54
+ const db = getSharedFeaturesDb();
55
+ const broadcastData = {
56
+ ...input,
57
+ status: "draft",
58
+ isRead: false,
59
+ impressions: 0,
60
+ clicks: 0,
61
+ createdBy: adminUserId,
62
+ createdAt: serverTimestamp(),
63
+ startDate: Timestamp.fromDate(input.startDate),
64
+ endDate: input.endDate ? Timestamp.fromDate(input.endDate) : null
65
+ };
66
+ const docRef = await addDoc(
67
+ collection(db, COLLECTION_BROADCASTS),
68
+ broadcastData
69
+ );
70
+ return docRef.id;
71
+ }
72
+ async function updateBroadcast(input, adminUserId) {
73
+ const db = getSharedFeaturesDb();
74
+ const updateData = {
75
+ ...input,
76
+ updatedBy: adminUserId,
77
+ updatedAt: serverTimestamp()
78
+ };
79
+ if (input.startDate) {
80
+ updateData.startDate = Timestamp.fromDate(input.startDate);
81
+ }
82
+ if (input.endDate !== void 0) {
83
+ updateData.endDate = input.endDate ? Timestamp.fromDate(input.endDate) : null;
84
+ }
85
+ delete updateData.id;
86
+ await updateDoc(doc(db, COLLECTION_BROADCASTS, input.id), updateData);
87
+ }
88
+ async function deleteBroadcast(broadcastId) {
89
+ const db = getSharedFeaturesDb();
90
+ await deleteDoc(doc(db, COLLECTION_BROADCASTS, broadcastId));
91
+ }
92
+ async function getAllBroadcasts() {
93
+ const db = getSharedFeaturesDb();
94
+ const q = query(
95
+ collection(db, COLLECTION_BROADCASTS),
96
+ orderBy("createdAt", "desc")
97
+ );
98
+ const snapshot = await getDocs(q);
99
+ return snapshot.docs.map((d) => docToBroadcast(d.id, d.data()));
100
+ }
101
+ async function getBroadcastsByStatus(status) {
102
+ const db = getSharedFeaturesDb();
103
+ const q = query(
104
+ collection(db, COLLECTION_BROADCASTS),
105
+ where("status", "==", status),
106
+ orderBy("createdAt", "desc")
107
+ );
108
+ const snapshot = await getDocs(q);
109
+ return snapshot.docs.map((d) => docToBroadcast(d.id, d.data()));
110
+ }
111
+ async function getBroadcastById(broadcastId) {
112
+ const db = getSharedFeaturesDb();
113
+ const docSnap = await getDoc(doc(db, COLLECTION_BROADCASTS, broadcastId));
114
+ if (!docSnap.exists()) return null;
115
+ return docToBroadcast(docSnap.id, docSnap.data());
116
+ }
117
+ async function publishBroadcast(broadcastId, adminUserId) {
118
+ const db = getSharedFeaturesDb();
119
+ await updateDoc(doc(db, COLLECTION_BROADCASTS, broadcastId), {
120
+ status: "active",
121
+ updatedBy: adminUserId,
122
+ updatedAt: serverTimestamp()
123
+ });
124
+ }
125
+ async function scheduleBroadcast(broadcastId, scheduledDate, adminUserId) {
126
+ const db = getSharedFeaturesDb();
127
+ await updateDoc(doc(db, COLLECTION_BROADCASTS, broadcastId), {
128
+ status: "scheduled",
129
+ startDate: Timestamp.fromDate(scheduledDate),
130
+ updatedBy: adminUserId,
131
+ updatedAt: serverTimestamp()
132
+ });
133
+ }
134
+ async function pauseBroadcast(broadcastId, adminUserId) {
135
+ const db = getSharedFeaturesDb();
136
+ await updateDoc(doc(db, COLLECTION_BROADCASTS, broadcastId), {
137
+ status: "draft",
138
+ // Move back to draft
139
+ updatedBy: adminUserId,
140
+ updatedAt: serverTimestamp()
141
+ });
142
+ }
143
+ async function endBroadcast(broadcastId, adminUserId) {
144
+ const db = getSharedFeaturesDb();
145
+ await updateDoc(doc(db, COLLECTION_BROADCASTS, broadcastId), {
146
+ status: "ended",
147
+ endDate: serverTimestamp(),
148
+ updatedBy: adminUserId,
149
+ updatedAt: serverTimestamp()
150
+ });
151
+ }
152
+ async function createTemplate(input) {
153
+ const db = getSharedFeaturesDb();
154
+ const templateData = {
155
+ ...input,
156
+ createdAt: serverTimestamp(),
157
+ updatedAt: serverTimestamp()
158
+ };
159
+ const docRef = await addDoc(
160
+ collection(db, COLLECTION_TEMPLATES),
161
+ templateData
162
+ );
163
+ return docRef.id;
164
+ }
165
+ async function updateTemplate(templateId, input) {
166
+ const db = getSharedFeaturesDb();
167
+ await updateDoc(doc(db, COLLECTION_TEMPLATES, templateId), {
168
+ ...input,
169
+ updatedAt: serverTimestamp()
170
+ });
171
+ }
172
+ async function deleteTemplate(templateId) {
173
+ const db = getSharedFeaturesDb();
174
+ await deleteDoc(doc(db, COLLECTION_TEMPLATES, templateId));
175
+ }
176
+ async function getAllTemplates() {
177
+ const db = getSharedFeaturesDb();
178
+ const q = query(
179
+ collection(db, COLLECTION_TEMPLATES),
180
+ orderBy("name", "asc")
181
+ );
182
+ const snapshot = await getDocs(q);
183
+ return snapshot.docs.map((d) => docToTemplate(d.id, d.data()));
184
+ }
185
+ async function getTemplateById(templateId) {
186
+ const db = getSharedFeaturesDb();
187
+ const docSnap = await getDoc(doc(db, COLLECTION_TEMPLATES, templateId));
188
+ if (!docSnap.exists()) return null;
189
+ return docToTemplate(docSnap.id, docSnap.data());
190
+ }
191
+ async function getFirestoreTemplateByEventType(eventType) {
192
+ const db = getSharedFeaturesDb();
193
+ const q = query(
194
+ collection(db, COLLECTION_TEMPLATES),
195
+ where("eventType", "==", eventType)
196
+ );
197
+ const snapshot = await getDocs(q);
198
+ if (snapshot.empty) return null;
199
+ const docSnap = snapshot.docs[0];
200
+ if (!docSnap) return null;
201
+ return docToTemplate(docSnap.id, docSnap.data());
202
+ }
203
+ async function getBroadcastAnalytics(broadcastId) {
204
+ const db = getSharedFeaturesDb();
205
+ const broadcast = await getBroadcastById(broadcastId);
206
+ if (!broadcast) return null;
207
+ const eventsQuery = query(
208
+ collection(db, COLLECTION_BROADCAST_EVENTS),
209
+ where("broadcastId", "==", broadcastId)
210
+ );
211
+ const eventsSnapshot = await getDocs(eventsQuery);
212
+ const events = eventsSnapshot.docs.map((d) => d.data());
213
+ const impressions = events.filter((e) => e.action === "impression").length;
214
+ const clicks = events.filter((e) => e.action === "click").length;
215
+ const dismissals = events.filter((e) => e.action === "dismiss").length;
216
+ const byPlatform = {
217
+ web: { impressions: 0, clicks: 0 },
218
+ android: { impressions: 0, clicks: 0 },
219
+ ios: { impressions: 0, clicks: 0 }
220
+ };
221
+ events.forEach((e) => {
222
+ const platform = e.platform;
223
+ if (byPlatform[platform]) {
224
+ if (e.action === "impression") byPlatform[platform].impressions++;
225
+ if (e.action === "click") byPlatform[platform].clicks++;
226
+ }
227
+ });
228
+ const byProject = {};
229
+ events.forEach((e) => {
230
+ const projectId = e.projectId;
231
+ if (!byProject[projectId]) {
232
+ byProject[projectId] = { impressions: 0, clicks: 0 };
233
+ }
234
+ if (e.action === "impression") byProject[projectId].impressions++;
235
+ if (e.action === "click") byProject[projectId].clicks++;
236
+ });
237
+ const byDateMap = {};
238
+ events.forEach((e) => {
239
+ const dateStr = e.timestamp.toDate().toISOString().split("T")[0];
240
+ if (dateStr) {
241
+ if (!byDateMap[dateStr]) {
242
+ byDateMap[dateStr] = { impressions: 0, clicks: 0 };
243
+ }
244
+ if (e.action === "impression") byDateMap[dateStr].impressions++;
245
+ if (e.action === "click") byDateMap[dateStr].clicks++;
246
+ }
247
+ });
248
+ const byDate = Object.entries(byDateMap).map(([date, data]) => ({
249
+ date,
250
+ impressions: data.impressions,
251
+ clicks: data.clicks
252
+ }));
253
+ return {
254
+ broadcastId,
255
+ title: broadcast.title,
256
+ status: broadcast.status,
257
+ impressions,
258
+ clicks,
259
+ dismissals,
260
+ ctr: impressions > 0 ? clicks / impressions : 0,
261
+ byPlatform,
262
+ byProject,
263
+ byDate
264
+ };
265
+ }
266
+ async function getOverallAnalytics(startDate, endDate) {
267
+ const db = getSharedFeaturesDb();
268
+ const eventsQuery = query(
269
+ collection(db, COLLECTION_BROADCAST_EVENTS),
270
+ where("timestamp", ">=", Timestamp.fromDate(startDate)),
271
+ where("timestamp", "<=", Timestamp.fromDate(endDate))
272
+ );
273
+ const eventsSnapshot = await getDocs(eventsQuery);
274
+ const events = eventsSnapshot.docs.map((d) => d.data());
275
+ const totalSent = events.filter((e) => e.action === "impression").length;
276
+ const totalRead = events.filter((e) => e.action === "impression").length;
277
+ const totalClicked = events.filter((e) => e.action === "click").length;
278
+ const byCategory = {
279
+ system: { sent: 0, read: 0, clicked: 0 },
280
+ account: { sent: 0, read: 0, clicked: 0 },
281
+ activity: { sent: 0, read: 0, clicked: 0 },
282
+ report: { sent: 0, read: 0, clicked: 0 },
283
+ promotional: { sent: 0, read: 0, clicked: 0 },
284
+ social: { sent: 0, read: 0, clicked: 0 }
285
+ };
286
+ const byType = {
287
+ info: { sent: 0, read: 0, clicked: 0 },
288
+ success: { sent: 0, read: 0, clicked: 0 },
289
+ warning: { sent: 0, read: 0, clicked: 0 },
290
+ error: { sent: 0, read: 0, clicked: 0 },
291
+ reminder: { sent: 0, read: 0, clicked: 0 },
292
+ milestone: { sent: 0, read: 0, clicked: 0 },
293
+ announcement: { sent: 0, read: 0, clicked: 0 }
294
+ };
295
+ const byDateMap = {};
296
+ events.forEach((e) => {
297
+ const dateStr = e.timestamp.toDate().toISOString().split("T")[0];
298
+ if (dateStr) {
299
+ if (!byDateMap[dateStr]) {
300
+ byDateMap[dateStr] = { sent: 0, read: 0, clicked: 0 };
301
+ }
302
+ if (e.action === "impression") {
303
+ byDateMap[dateStr].sent++;
304
+ byDateMap[dateStr].read++;
305
+ }
306
+ if (e.action === "click") byDateMap[dateStr].clicked++;
307
+ }
308
+ });
309
+ const byDate = Object.entries(byDateMap).map(([date, data]) => ({ date, ...data })).sort((a, b) => a.date.localeCompare(b.date));
310
+ return {
311
+ totalSent,
312
+ totalRead,
313
+ totalClicked,
314
+ readRate: totalSent > 0 ? totalRead / totalSent : 0,
315
+ clickRate: totalSent > 0 ? totalClicked / totalSent : 0,
316
+ byCategory,
317
+ byType,
318
+ byDate
319
+ };
320
+ }
321
+ const adminNotificationService = {
322
+ // Broadcasts
323
+ createBroadcast,
324
+ updateBroadcast,
325
+ deleteBroadcast,
326
+ getAllBroadcasts,
327
+ getBroadcastsByStatus,
328
+ getBroadcastById,
329
+ publishBroadcast,
330
+ scheduleBroadcast,
331
+ pauseBroadcast,
332
+ endBroadcast,
333
+ // Templates
334
+ createTemplate,
335
+ updateTemplate,
336
+ deleteTemplate,
337
+ getAllTemplates,
338
+ getTemplateById,
339
+ getFirestoreTemplateByEventType,
340
+ // Analytics
341
+ getBroadcastAnalytics,
342
+ getOverallAnalytics
343
+ };
344
+ async function saveContactInfo(data) {
345
+ try {
346
+ const db = getSharedFeaturesDb();
347
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.CONTACT_INFO, "main");
348
+ await setDoc(docRef, {
349
+ ...data,
350
+ updatedAt: serverTimestamp()
351
+ });
352
+ clearContactInfoCache();
353
+ return true;
354
+ } catch (error) {
355
+ console.error("[shared-features admin] Error saving contact info:", error);
356
+ return false;
357
+ }
358
+ }
359
+ async function updateContactInfo(data) {
360
+ try {
361
+ const db = getSharedFeaturesDb();
362
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.CONTACT_INFO, "main");
363
+ await updateDoc(docRef, {
364
+ ...data,
365
+ updatedAt: serverTimestamp()
366
+ });
367
+ clearContactInfoCache();
368
+ return true;
369
+ } catch (error) {
370
+ console.error("[shared-features admin] Error updating contact info:", error);
371
+ return false;
372
+ }
373
+ }
374
+ async function saveDeveloperInfo(data) {
375
+ try {
376
+ const db = getSharedFeaturesDb();
377
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.DEVELOPER_INFO, "main");
378
+ await setDoc(docRef, {
379
+ ...data,
380
+ updatedAt: serverTimestamp()
381
+ });
382
+ clearDeveloperInfoCache();
383
+ return true;
384
+ } catch (error) {
385
+ console.error("[shared-features admin] Error saving developer info:", error);
386
+ return false;
387
+ }
388
+ }
389
+ async function updateDeveloperInfo(data) {
390
+ try {
391
+ const db = getSharedFeaturesDb();
392
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.DEVELOPER_INFO, "main");
393
+ await updateDoc(docRef, {
394
+ ...data,
395
+ updatedAt: serverTimestamp()
396
+ });
397
+ clearDeveloperInfoCache();
398
+ return true;
399
+ } catch (error) {
400
+ console.error("[shared-features admin] Error updating developer info:", error);
401
+ return false;
402
+ }
403
+ }
404
+ async function saveAddressInfo(data) {
405
+ try {
406
+ const db = getSharedFeaturesDb();
407
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.ADDRESS_INFO, "main");
408
+ await setDoc(docRef, {
409
+ ...data,
410
+ updatedAt: serverTimestamp()
411
+ });
412
+ clearAddressInfoCache();
413
+ return true;
414
+ } catch (error) {
415
+ console.error("[shared-features admin] Error saving address info:", error);
416
+ return false;
417
+ }
418
+ }
419
+ async function updateAddressInfo(data) {
420
+ try {
421
+ const db = getSharedFeaturesDb();
422
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.ADDRESS_INFO, "main");
423
+ await updateDoc(docRef, {
424
+ ...data,
425
+ updatedAt: serverTimestamp()
426
+ });
427
+ clearAddressInfoCache();
428
+ return true;
429
+ } catch (error) {
430
+ console.error("[shared-features admin] Error updating address info:", error);
431
+ return false;
432
+ }
433
+ }
434
+ async function createSocialLink(data) {
435
+ try {
436
+ const db = getSharedFeaturesDb();
437
+ const colRef = collection(db, COMMON_FEATURE_COLLECTIONS.SOCIAL_LINKS);
438
+ const docRef = await addDoc(colRef, {
439
+ ...data,
440
+ updatedAt: serverTimestamp()
441
+ });
442
+ clearSocialLinksCache();
443
+ return docRef.id;
444
+ } catch (error) {
445
+ console.error("[shared-features admin] Error creating social link:", error);
446
+ return null;
447
+ }
448
+ }
449
+ async function updateSocialLink(id, data) {
450
+ try {
451
+ const db = getSharedFeaturesDb();
452
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.SOCIAL_LINKS, id);
453
+ await updateDoc(docRef, {
454
+ ...data,
455
+ updatedAt: serverTimestamp()
456
+ });
457
+ clearSocialLinksCache();
458
+ return true;
459
+ } catch (error) {
460
+ console.error("[shared-features admin] Error updating social link:", error);
461
+ return false;
462
+ }
463
+ }
464
+ async function deleteSocialLink(id) {
465
+ try {
466
+ const db = getSharedFeaturesDb();
467
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.SOCIAL_LINKS, id);
468
+ await deleteDoc(docRef);
469
+ clearSocialLinksCache();
470
+ return true;
471
+ } catch (error) {
472
+ console.error("[shared-features admin] Error deleting social link:", error);
473
+ return false;
474
+ }
475
+ }
476
+ async function createPaymentOption(data) {
477
+ try {
478
+ const db = getSharedFeaturesDb();
479
+ const colRef = collection(db, COMMON_FEATURE_COLLECTIONS.PAYMENT_OPTIONS);
480
+ const docRef = await addDoc(colRef, {
481
+ ...data,
482
+ updatedAt: serverTimestamp()
483
+ });
484
+ clearPaymentOptionsCache();
485
+ return docRef.id;
486
+ } catch (error) {
487
+ console.error("[shared-features admin] Error creating payment option:", error);
488
+ return null;
489
+ }
490
+ }
491
+ async function updatePaymentOption(id, data) {
492
+ try {
493
+ const db = getSharedFeaturesDb();
494
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.PAYMENT_OPTIONS, id);
495
+ await updateDoc(docRef, {
496
+ ...data,
497
+ updatedAt: serverTimestamp()
498
+ });
499
+ clearPaymentOptionsCache();
500
+ return true;
501
+ } catch (error) {
502
+ console.error("[shared-features admin] Error updating payment option:", error);
503
+ return false;
504
+ }
505
+ }
506
+ async function deletePaymentOption(id) {
507
+ try {
508
+ const db = getSharedFeaturesDb();
509
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.PAYMENT_OPTIONS, id);
510
+ await deleteDoc(docRef);
511
+ clearPaymentOptionsCache();
512
+ return true;
513
+ } catch (error) {
514
+ console.error("[shared-features admin] Error deleting payment option:", error);
515
+ return false;
516
+ }
517
+ }
518
+ async function createService(data) {
519
+ try {
520
+ const db = getSharedFeaturesDb();
521
+ const colRef = collection(db, COMMON_FEATURE_COLLECTIONS.SERVICES);
522
+ const docRef = await addDoc(colRef, {
523
+ ...data,
524
+ updatedAt: serverTimestamp()
525
+ });
526
+ clearServicesCache();
527
+ return docRef.id;
528
+ } catch (error) {
529
+ console.error("[shared-features admin] Error creating service:", error);
530
+ return null;
531
+ }
532
+ }
533
+ async function updateService(id, data) {
534
+ try {
535
+ const db = getSharedFeaturesDb();
536
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.SERVICES, id);
537
+ await updateDoc(docRef, {
538
+ ...data,
539
+ updatedAt: serverTimestamp()
540
+ });
541
+ clearServicesCache();
542
+ return true;
543
+ } catch (error) {
544
+ console.error("[shared-features admin] Error updating service:", error);
545
+ return false;
546
+ }
547
+ }
548
+ async function deleteService(id) {
549
+ try {
550
+ const db = getSharedFeaturesDb();
551
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.SERVICES, id);
552
+ await deleteDoc(docRef);
553
+ clearServicesCache();
554
+ return true;
555
+ } catch (error) {
556
+ console.error("[shared-features admin] Error deleting service:", error);
557
+ return false;
558
+ }
559
+ }
560
+ async function createSkill(data) {
561
+ try {
562
+ const db = getSharedFeaturesDb();
563
+ const colRef = collection(db, COMMON_FEATURE_COLLECTIONS.SKILLS);
564
+ const docRef = await addDoc(colRef, {
565
+ ...data,
566
+ updatedAt: serverTimestamp()
567
+ });
568
+ clearSkillsCache();
569
+ return docRef.id;
570
+ } catch (error) {
571
+ console.error("[shared-features admin] Error creating skill:", error);
572
+ return null;
573
+ }
574
+ }
575
+ async function updateSkill(id, data) {
576
+ try {
577
+ const db = getSharedFeaturesDb();
578
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.SKILLS, id);
579
+ await updateDoc(docRef, {
580
+ ...data,
581
+ updatedAt: serverTimestamp()
582
+ });
583
+ clearSkillsCache();
584
+ return true;
585
+ } catch (error) {
586
+ console.error("[shared-features admin] Error updating skill:", error);
587
+ return false;
588
+ }
589
+ }
590
+ async function deleteSkill(id) {
591
+ try {
592
+ const db = getSharedFeaturesDb();
593
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.SKILLS, id);
594
+ await deleteDoc(docRef);
595
+ clearSkillsCache();
596
+ return true;
597
+ } catch (error) {
598
+ console.error("[shared-features admin] Error deleting skill:", error);
599
+ return false;
600
+ }
601
+ }
602
+ async function createTestimonial(data) {
603
+ try {
604
+ const db = getSharedFeaturesDb();
605
+ const colRef = collection(db, COMMON_FEATURE_COLLECTIONS.TESTIMONIALS);
606
+ const docRef = await addDoc(colRef, {
607
+ ...data,
608
+ updatedAt: serverTimestamp()
609
+ });
610
+ clearTestimonialsCache();
611
+ return docRef.id;
612
+ } catch (error) {
613
+ console.error("[shared-features admin] Error creating testimonial:", error);
614
+ return null;
615
+ }
616
+ }
617
+ async function updateTestimonial(id, data) {
618
+ try {
619
+ const db = getSharedFeaturesDb();
620
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.TESTIMONIALS, id);
621
+ await updateDoc(docRef, {
622
+ ...data,
623
+ updatedAt: serverTimestamp()
624
+ });
625
+ clearTestimonialsCache();
626
+ return true;
627
+ } catch (error) {
628
+ console.error("[shared-features admin] Error updating testimonial:", error);
629
+ return false;
630
+ }
631
+ }
632
+ async function deleteTestimonial(id) {
633
+ try {
634
+ const db = getSharedFeaturesDb();
635
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.TESTIMONIALS, id);
636
+ await deleteDoc(docRef);
637
+ clearTestimonialsCache();
638
+ return true;
639
+ } catch (error) {
640
+ console.error("[shared-features admin] Error deleting testimonial:", error);
641
+ return false;
642
+ }
643
+ }
644
+ async function createProject(data) {
645
+ try {
646
+ const db = getSharedFeaturesDb();
647
+ const colRef = collection(db, COMMON_FEATURE_COLLECTIONS.PROJECTS);
648
+ const docRef = await addDoc(colRef, {
649
+ ...data,
650
+ updatedAt: serverTimestamp()
651
+ });
652
+ clearProjectsCache();
653
+ return docRef.id;
654
+ } catch (error) {
655
+ console.error("[shared-features admin] Error creating project:", error);
656
+ return null;
657
+ }
658
+ }
659
+ async function updateProject(id, data) {
660
+ try {
661
+ const db = getSharedFeaturesDb();
662
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.PROJECTS, id);
663
+ await updateDoc(docRef, {
664
+ ...data,
665
+ updatedAt: serverTimestamp()
666
+ });
667
+ clearProjectsCache();
668
+ return true;
669
+ } catch (error) {
670
+ console.error("[shared-features admin] Error updating project:", error);
671
+ return false;
672
+ }
673
+ }
674
+ async function deleteProject(id) {
675
+ try {
676
+ const db = getSharedFeaturesDb();
677
+ const docRef = doc(db, COMMON_FEATURE_COLLECTIONS.PROJECTS, id);
678
+ await deleteDoc(docRef);
679
+ clearProjectsCache();
680
+ return true;
681
+ } catch (error) {
682
+ console.error("[shared-features admin] Error deleting project:", error);
683
+ return false;
684
+ }
685
+ }
686
+ export {
687
+ publishBroadcast as A,
688
+ saveAddressInfo as B,
689
+ saveContactInfo as C,
690
+ saveDeveloperInfo as D,
691
+ scheduleBroadcast as E,
692
+ updateAddressInfo as F,
693
+ updateBroadcast as G,
694
+ updateContactInfo as H,
695
+ updateDeveloperInfo as I,
696
+ updatePaymentOption as J,
697
+ updateProject as K,
698
+ updateService as L,
699
+ updateSkill as M,
700
+ updateSocialLink as N,
701
+ updateTemplate as O,
702
+ updateTestimonial as P,
703
+ adminNotificationService as a,
704
+ createPaymentOption as b,
705
+ createBroadcast as c,
706
+ createProject as d,
707
+ createService as e,
708
+ createSkill as f,
709
+ createSocialLink as g,
710
+ createTemplate as h,
711
+ createTestimonial as i,
712
+ deleteBroadcast as j,
713
+ deletePaymentOption as k,
714
+ deleteProject as l,
715
+ deleteService as m,
716
+ deleteSkill as n,
717
+ deleteSocialLink as o,
718
+ deleteTemplate as p,
719
+ deleteTestimonial as q,
720
+ endBroadcast as r,
721
+ getAllBroadcasts as s,
722
+ getAllTemplates as t,
723
+ getBroadcastAnalytics as u,
724
+ getBroadcastsByStatus as v,
725
+ getFirestoreTemplateByEventType as w,
726
+ getOverallAnalytics as x,
727
+ getTemplateById as y,
728
+ pauseBroadcast as z
729
+ };
730
+ //# sourceMappingURL=admin-commonFeatures-BqSmAHvZ.js.map