shared-features 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +200 -0
  2. package/dist/AdPanel-D0BiV6Xb.cjs +88 -0
  3. package/dist/AdPanel-D0BiV6Xb.cjs.map +1 -0
  4. package/dist/AdPanel-RGRBf4ub.js +89 -0
  5. package/dist/AdPanel-RGRBf4ub.js.map +1 -0
  6. package/dist/analytics-6shJHRZG.cjs +463 -0
  7. package/dist/analytics-6shJHRZG.cjs.map +1 -0
  8. package/dist/analytics-Bbmodnm_.js +442 -0
  9. package/dist/analytics-Bbmodnm_.js.map +1 -0
  10. package/dist/components/ads/AdPanel.d.ts +12 -0
  11. package/dist/components/ads/AdPanel.d.ts.map +1 -0
  12. package/dist/components/ads/index.d.ts +9 -0
  13. package/dist/components/ads/index.d.ts.map +1 -0
  14. package/dist/components/index.cjs +5 -0
  15. package/dist/components/index.cjs.map +1 -0
  16. package/dist/components/index.d.ts +9 -0
  17. package/dist/components/index.d.ts.map +1 -0
  18. package/dist/components/index.js +5 -0
  19. package/dist/components/index.js.map +1 -0
  20. package/dist/firebase/config.d.ts +77 -0
  21. package/dist/firebase/config.d.ts.map +1 -0
  22. package/dist/firebase/init.d.ts +55 -0
  23. package/dist/firebase/init.d.ts.map +1 -0
  24. package/dist/hooks/index.cjs +6 -0
  25. package/dist/hooks/index.cjs.map +1 -0
  26. package/dist/hooks/index.d.ts +10 -0
  27. package/dist/hooks/index.d.ts.map +1 -0
  28. package/dist/hooks/index.js +6 -0
  29. package/dist/hooks/index.js.map +1 -0
  30. package/dist/hooks/useCampaigns.d.ts +59 -0
  31. package/dist/hooks/useCampaigns.d.ts.map +1 -0
  32. package/dist/index.cjs +37 -0
  33. package/dist/index.cjs.map +1 -0
  34. package/dist/index.d.ts +25 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +37 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/services/analytics.d.ts +32 -0
  39. package/dist/services/analytics.d.ts.map +1 -0
  40. package/dist/services/campaigns.d.ts +31 -0
  41. package/dist/services/campaigns.d.ts.map +1 -0
  42. package/dist/services/index.cjs +18 -0
  43. package/dist/services/index.cjs.map +1 -0
  44. package/dist/services/index.d.ts +10 -0
  45. package/dist/services/index.d.ts.map +1 -0
  46. package/dist/services/index.js +18 -0
  47. package/dist/services/index.js.map +1 -0
  48. package/dist/types/campaigns.d.ts +378 -0
  49. package/dist/types/campaigns.d.ts.map +1 -0
  50. package/dist/types/index.cjs +49 -0
  51. package/dist/types/index.cjs.map +1 -0
  52. package/dist/types/index.d.ts +10 -0
  53. package/dist/types/index.d.ts.map +1 -0
  54. package/dist/types/index.js +49 -0
  55. package/dist/types/index.js.map +1 -0
  56. package/dist/useCampaigns-3NxODLLs.js +98 -0
  57. package/dist/useCampaigns-3NxODLLs.js.map +1 -0
  58. package/dist/useCampaigns-BNOHpETm.cjs +97 -0
  59. package/dist/useCampaigns-BNOHpETm.cjs.map +1 -0
  60. package/package.json +90 -0
@@ -0,0 +1,378 @@
1
+ import { Timestamp } from 'firebase/firestore';
2
+ /**
3
+ * Product type classification
4
+ */
5
+ export type ProductType = 'extension' | 'android' | 'ios' | 'web';
6
+ /**
7
+ * Product information for advertising
8
+ */
9
+ export interface Product {
10
+ /** Unique product identifier */
11
+ id: string;
12
+ /** Product display name */
13
+ name: string;
14
+ /** Short tagline (marketing slogan) */
15
+ tagline: string;
16
+ /** Longer description of the product */
17
+ description: string;
18
+ /** Product type classification */
19
+ type: ProductType;
20
+ /** URL to the product (store link or website) */
21
+ url: string;
22
+ /** Brand/theme color (hex) */
23
+ color: string;
24
+ /** Key features list (3-4 items) */
25
+ features: string[];
26
+ /** Inline SVG icon (64px) */
27
+ icon64?: string;
28
+ /** Inline SVG icon (128px) */
29
+ icon128?: string;
30
+ /** Chrome Web Store URL */
31
+ chromeStoreUrl?: string;
32
+ /** Google Play Store URL */
33
+ playStoreUrl?: string;
34
+ /** Apple App Store URL */
35
+ appStoreUrl?: string;
36
+ /** Web app URL */
37
+ webUrl?: string;
38
+ /** Whether the product is active */
39
+ enabled: boolean;
40
+ /** When the product was created */
41
+ createdAt: Timestamp;
42
+ /** When the product was last updated */
43
+ updatedAt: Timestamp;
44
+ }
45
+ /**
46
+ * Campaign status values
47
+ */
48
+ export type CampaignStatus = 'active' | 'paused' | 'scheduled' | 'ended';
49
+ /**
50
+ * Target platforms for campaigns
51
+ */
52
+ export type TargetPlatform = 'web' | 'android' | 'ios' | 'extension';
53
+ /**
54
+ * Target audience for campaigns
55
+ */
56
+ export type TargetAudience = 'all' | 'authenticated' | 'anonymous';
57
+ /**
58
+ * Placement options for ads
59
+ */
60
+ export type AdPlacement = 'popup_slider' | 'options_panel' | 'onetime_modal' | 'update_modal' | 'notification' | 'footer_slider' | 'sidebar_panel' | 'home_banner';
61
+ /**
62
+ * Small panel variant styles
63
+ */
64
+ export type SmallPanelVariant = 'small_panel_1' | 'small_panel_2' | 'small_panel_3' | 'small_panel_4' | 'small_panel_5';
65
+ /**
66
+ * Large slider variant styles
67
+ */
68
+ export type LargePanelVariant = 'large_slider_1' | 'large_slider_2' | 'large_slider_3' | 'large_slider_4' | 'large_slider_5';
69
+ /**
70
+ * All ad variant types
71
+ */
72
+ export type AdVariant = SmallPanelVariant | LargePanelVariant;
73
+ /**
74
+ * Advertising campaign document
75
+ * Stored in: zaions_campaigns/{campaignId}
76
+ */
77
+ export interface Campaign {
78
+ /** Campaign document ID */
79
+ id: string;
80
+ /** Reference to product being promoted */
81
+ productId: string;
82
+ /** Campaign name (admin reference) */
83
+ name: string;
84
+ /** Current campaign status */
85
+ status: CampaignStatus;
86
+ /** Platforms where this campaign should show */
87
+ targetPlatforms: TargetPlatform[];
88
+ /** Audience type to target */
89
+ targetAudience: TargetAudience;
90
+ /** Specific projects to target (empty = all projects) */
91
+ targetProjects: string[];
92
+ /** Don't show to users already using this product */
93
+ excludeProductUsers: boolean;
94
+ /** Where the ad can be displayed */
95
+ placements: AdPlacement[];
96
+ /** Priority (1-100, higher = more important) */
97
+ priority: number;
98
+ /** Days between impressions for same user (default: 20) */
99
+ frequencyDays: number;
100
+ /** Maximum total impressions (null = unlimited) */
101
+ maxImpressions: number | null;
102
+ /** Campaign start date */
103
+ startDate: Timestamp;
104
+ /** Campaign end date (null = no end) */
105
+ endDate: Timestamp | null;
106
+ /** UI variant to use */
107
+ variant: AdVariant;
108
+ /** Custom title (overrides product name) */
109
+ customTitle?: string;
110
+ /** Custom tagline (overrides product tagline) */
111
+ customTagline?: string;
112
+ /** Custom CTA button text */
113
+ customCta?: string;
114
+ /** Custom CTA button URL (overrides product URL) */
115
+ customCtaUrl?: string;
116
+ /** Custom description (overrides product description) */
117
+ customDescription?: string;
118
+ /** Custom product color for custom products/projects */
119
+ customProductColor?: string;
120
+ /** Custom icon SVG string (for custom products) */
121
+ customIcon?: string;
122
+ /** Custom features list (for custom products) */
123
+ customFeatures?: string[];
124
+ /** Total number of impressions */
125
+ totalImpressions: number;
126
+ /** Total number of clicks */
127
+ totalClicks: number;
128
+ /** Total number of closes/dismissals */
129
+ totalCloses: number;
130
+ /** When campaign was created */
131
+ createdAt: Timestamp;
132
+ /** When campaign was last updated */
133
+ updatedAt: Timestamp;
134
+ /** Admin user ID who created */
135
+ createdBy: string;
136
+ /** Admin user ID who last updated */
137
+ updatedBy?: string;
138
+ }
139
+ /**
140
+ * Input for creating a new campaign
141
+ */
142
+ export interface CreateCampaignInput {
143
+ productId: string;
144
+ name: string;
145
+ status: CampaignStatus;
146
+ targetPlatforms: TargetPlatform[];
147
+ targetAudience: TargetAudience;
148
+ targetProjects: string[];
149
+ excludeProductUsers: boolean;
150
+ placements: AdPlacement[];
151
+ priority: number;
152
+ frequencyDays: number;
153
+ maxImpressions: number | null;
154
+ startDate: Date;
155
+ endDate: Date | null;
156
+ variant: AdVariant;
157
+ customTitle?: string;
158
+ customTagline?: string;
159
+ customCta?: string;
160
+ customCtaUrl?: string;
161
+ customDescription?: string;
162
+ customProductColor?: string;
163
+ customIcon?: string;
164
+ customFeatures?: string[];
165
+ }
166
+ /**
167
+ * Input for updating a campaign
168
+ */
169
+ export interface UpdateCampaignInput extends Partial<CreateCampaignInput> {
170
+ id: string;
171
+ }
172
+ /**
173
+ * Types of ad interactions
174
+ */
175
+ export type AdAction = 'impression' | 'click' | 'close' | 'notification_click';
176
+ /**
177
+ * Ad impression/interaction event
178
+ * Stored in: zaions_impressions/{impressionId}
179
+ */
180
+ export interface Impression {
181
+ /** Impression document ID */
182
+ id: string;
183
+ /** Campaign that generated this impression */
184
+ campaignId: string;
185
+ /** Product being advertised */
186
+ productId: string;
187
+ /** Project where impression occurred */
188
+ projectId: string;
189
+ /** User ID (null for anonymous) */
190
+ userId: string | null;
191
+ /** Device/browser fingerprint */
192
+ deviceId: string;
193
+ /** Platform where impression occurred */
194
+ platform: TargetPlatform;
195
+ /** Placement where ad was shown */
196
+ placement: AdPlacement;
197
+ /** Type of interaction */
198
+ action: AdAction;
199
+ /** When the interaction occurred */
200
+ timestamp: Timestamp;
201
+ /** UI variant that was displayed */
202
+ variant: AdVariant;
203
+ /** Session identifier */
204
+ sessionId?: string;
205
+ }
206
+ /**
207
+ * Input for recording an impression
208
+ */
209
+ export interface RecordImpressionInput {
210
+ campaignId: string;
211
+ productId: string;
212
+ placement: AdPlacement;
213
+ action: AdAction;
214
+ variant: AdVariant;
215
+ sessionId?: string;
216
+ }
217
+ /**
218
+ * Local ad history entry (for frequency capping)
219
+ */
220
+ export interface AdHistoryEntry {
221
+ /** Campaign ID */
222
+ campaignId: string;
223
+ /** Product ID */
224
+ productId: string;
225
+ /** Last seen timestamp (Unix ms) */
226
+ lastSeenAt: number;
227
+ /** Impression count */
228
+ impressionCount: number;
229
+ /** Whether clicked */
230
+ clicked: boolean;
231
+ /** Whether closed */
232
+ closed: boolean;
233
+ /** Next eligible timestamp (Unix ms) */
234
+ nextEligibleAt: number;
235
+ }
236
+ /**
237
+ * Options for fetching campaigns
238
+ */
239
+ export interface FetchCampaignsOptions {
240
+ /** Filter by placement */
241
+ placement?: AdPlacement;
242
+ /** Filter by status */
243
+ status?: CampaignStatus;
244
+ /** Filter by product */
245
+ productId?: string;
246
+ /** Maximum results */
247
+ limit?: number;
248
+ }
249
+ /**
250
+ * Campaign with resolved product data
251
+ */
252
+ export interface CampaignWithProduct extends Campaign {
253
+ /** Resolved product information */
254
+ product: Product;
255
+ }
256
+ /**
257
+ * Campaign analytics summary
258
+ */
259
+ export interface CampaignAnalytics {
260
+ campaignId: string;
261
+ campaignName: string;
262
+ productId: string;
263
+ productName: string;
264
+ /** Total impressions */
265
+ impressions: number;
266
+ /** Total clicks */
267
+ clicks: number;
268
+ /** Total closes */
269
+ closes: number;
270
+ /** Click-through rate (clicks/impressions) */
271
+ ctr: number;
272
+ /** Close rate (closes/impressions) */
273
+ closeRate: number;
274
+ /** Breakdown by platform */
275
+ byPlatform: Record<TargetPlatform, {
276
+ impressions: number;
277
+ clicks: number;
278
+ }>;
279
+ /** Breakdown by placement */
280
+ byPlacement: Record<AdPlacement, {
281
+ impressions: number;
282
+ clicks: number;
283
+ }>;
284
+ /** Breakdown by project */
285
+ byProject: Record<string, {
286
+ impressions: number;
287
+ clicks: number;
288
+ }>;
289
+ /** Daily breakdown */
290
+ byDate: Array<{
291
+ date: string;
292
+ impressions: number;
293
+ clicks: number;
294
+ closes: number;
295
+ }>;
296
+ }
297
+ /**
298
+ * Props for small panel variants
299
+ */
300
+ export interface SmallPanelProps {
301
+ campaign: Campaign;
302
+ product: Product;
303
+ variant: SmallPanelVariant;
304
+ onClose: () => void;
305
+ onClick: () => void;
306
+ }
307
+ /**
308
+ * Props for large panel variants
309
+ */
310
+ export interface LargePanelProps {
311
+ campaign: Campaign;
312
+ product: Product;
313
+ variant: LargePanelVariant;
314
+ onClose: () => void;
315
+ onClick: () => void;
316
+ }
317
+ /**
318
+ * Props for ad slider component
319
+ */
320
+ export interface AdSliderProps {
321
+ placement: AdPlacement;
322
+ variant?: SmallPanelVariant;
323
+ autoplay?: boolean;
324
+ interval?: number;
325
+ maxCampaigns?: number;
326
+ className?: string;
327
+ }
328
+ /**
329
+ * Props for ad modal component
330
+ */
331
+ export interface AdModalProps {
332
+ open: boolean;
333
+ onOpenChange: (open: boolean) => void;
334
+ campaign: CampaignWithProduct | null;
335
+ variant?: LargePanelVariant;
336
+ }
337
+ /**
338
+ * Props for ad panel component
339
+ */
340
+ export interface AdPanelProps {
341
+ placement: AdPlacement;
342
+ variant?: SmallPanelVariant;
343
+ className?: string;
344
+ }
345
+ /**
346
+ * Default frequency cap in days
347
+ */
348
+ export declare const DEFAULT_FREQUENCY_DAYS = 20;
349
+ /**
350
+ * Default campaign priority
351
+ */
352
+ export declare const DEFAULT_CAMPAIGN_PRIORITY = 50;
353
+ /**
354
+ * Variant display names
355
+ */
356
+ export declare const VARIANT_NAMES: Record<AdVariant, string>;
357
+ /**
358
+ * Placement display names
359
+ */
360
+ export declare const PLACEMENT_NAMES: Record<AdPlacement, string>;
361
+ /**
362
+ * Platform display names
363
+ */
364
+ export declare const PLATFORM_NAMES: Record<TargetPlatform, string>;
365
+ /**
366
+ * Collection names for shared features
367
+ */
368
+ export declare const COLLECTIONS: {
369
+ readonly CAMPAIGNS: "zaions_campaigns";
370
+ readonly PRODUCTS: "zaions_products";
371
+ readonly IMPRESSIONS: "zaions_impressions";
372
+ readonly CONTACTS: "zaions_contacts";
373
+ readonly FEATURE_REQUESTS: "zaions_feature_requests";
374
+ readonly PAYMENT_OPTIONS: "zaions_payment_options";
375
+ readonly SOCIAL_LINKS: "zaions_social_links";
376
+ readonly DEVELOPER_INFO: "zaions_developer_info";
377
+ };
378
+ //# sourceMappingURL=campaigns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/types/campaigns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAM/C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,SAAS,CAAC;CACtB;AAMD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,WAAW,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,eAAe,GAAG,WAAW,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,eAAe,GACf,eAAe,GACf,cAAc,GACd,cAAc,GACd,eAAe,GACf,eAAe,GACf,aAAa,CAAC;AAElB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IAGvB,gDAAgD;IAChD,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,8BAA8B;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qDAAqD;IACrD,mBAAmB,EAAE,OAAO,CAAC;IAG7B,oCAAoC;IACpC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAG9B,0BAA0B;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAG1B,wBAAwB;IACxB,OAAO,EAAE,SAAS,CAAC;IACnB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAG1B,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IAGpB,gCAAgC;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,qCAAqC;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,OAAO,CAAC,mBAAmB,CAAC;IACvE,EAAE,EAAE,MAAM,CAAC;CACZ;AAMD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,oBAAoB,CAAC;AAE/E;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAElB,mCAAmC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,cAAc,CAAC;IACzB,mCAAmC;IACnC,SAAS,EAAE,WAAW,CAAC;IAEvB,0BAA0B;IAC1B,MAAM,EAAE,QAAQ,CAAC;IACjB,oCAAoC;IACpC,SAAS,EAAE,SAAS,CAAC;IAErB,oCAAoC;IACpC,OAAO,EAAE,SAAS,CAAC;IACnB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,WAAW,CAAC;IACvB,MAAM,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,uBAAuB;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IAEpB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,sBAAsB;IACtB,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;GAEG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAWnD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CASvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAKzD,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const DEFAULT_FREQUENCY_DAYS = 20;
4
+ const DEFAULT_CAMPAIGN_PRIORITY = 50;
5
+ const VARIANT_NAMES = {
6
+ small_panel_1: "Minimal",
7
+ small_panel_2: "Tagline",
8
+ small_panel_3: "Features",
9
+ small_panel_4: "Gradient",
10
+ small_panel_5: "Card",
11
+ large_slider_1: "Hero",
12
+ large_slider_2: "Feature Grid",
13
+ large_slider_3: "Testimonial",
14
+ large_slider_4: "Comparison",
15
+ large_slider_5: "Video Placeholder"
16
+ };
17
+ const PLACEMENT_NAMES = {
18
+ popup_slider: "Extension Popup Slider",
19
+ options_panel: "Extension Options Panel",
20
+ onetime_modal: "One-Time Welcome Modal",
21
+ update_modal: "Update Announcement Modal",
22
+ notification: "Browser Notification",
23
+ footer_slider: "Web App Footer Slider",
24
+ sidebar_panel: "Web App Sidebar Panel",
25
+ home_banner: "Home Page Banner"
26
+ };
27
+ const PLATFORM_NAMES = {
28
+ web: "Web App",
29
+ android: "Android App",
30
+ ios: "iOS App",
31
+ extension: "Browser Extension"
32
+ };
33
+ const COLLECTIONS = {
34
+ CAMPAIGNS: "zaions_campaigns",
35
+ PRODUCTS: "zaions_products",
36
+ IMPRESSIONS: "zaions_impressions",
37
+ CONTACTS: "zaions_contacts",
38
+ FEATURE_REQUESTS: "zaions_feature_requests",
39
+ PAYMENT_OPTIONS: "zaions_payment_options",
40
+ SOCIAL_LINKS: "zaions_social_links",
41
+ DEVELOPER_INFO: "zaions_developer_info"
42
+ };
43
+ exports.COLLECTIONS = COLLECTIONS;
44
+ exports.DEFAULT_CAMPAIGN_PRIORITY = DEFAULT_CAMPAIGN_PRIORITY;
45
+ exports.DEFAULT_FREQUENCY_DAYS = DEFAULT_FREQUENCY_DAYS;
46
+ exports.PLACEMENT_NAMES = PLACEMENT_NAMES;
47
+ exports.PLATFORM_NAMES = PLATFORM_NAMES;
48
+ exports.VARIANT_NAMES = VARIANT_NAMES;
49
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/types/campaigns.ts"],"sourcesContent":["/**\n * Campaign/Advertising System Type Definitions\n *\n * Type definitions for the centralized advertising system including\n * Firestore document schemas, service interfaces, and UI types.\n *\n * Based on ZTools advertising system, adapted for cross-project use.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { Timestamp } from 'firebase/firestore';\n\n// ============================================================================\n// PRODUCT TYPES\n// ============================================================================\n\n/**\n * Product type classification\n */\nexport type ProductType = 'extension' | 'android' | 'ios' | 'web';\n\n/**\n * Product information for advertising\n */\nexport interface Product {\n /** Unique product identifier */\n id: string;\n /** Product display name */\n name: string;\n /** Short tagline (marketing slogan) */\n tagline: string;\n /** Longer description of the product */\n description: string;\n /** Product type classification */\n type: ProductType;\n /** URL to the product (store link or website) */\n url: string;\n /** Brand/theme color (hex) */\n color: string;\n /** Key features list (3-4 items) */\n features: string[];\n /** Inline SVG icon (64px) */\n icon64?: string;\n /** Inline SVG icon (128px) */\n icon128?: string;\n /** Chrome Web Store URL */\n chromeStoreUrl?: string;\n /** Google Play Store URL */\n playStoreUrl?: string;\n /** Apple App Store URL */\n appStoreUrl?: string;\n /** Web app URL */\n webUrl?: string;\n /** Whether the product is active */\n enabled: boolean;\n /** When the product was created */\n createdAt: Timestamp;\n /** When the product was last updated */\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// CAMPAIGN TYPES\n// ============================================================================\n\n/**\n * Campaign status values\n */\nexport type CampaignStatus = 'active' | 'paused' | 'scheduled' | 'ended';\n\n/**\n * Target platforms for campaigns\n */\nexport type TargetPlatform = 'web' | 'android' | 'ios' | 'extension';\n\n/**\n * Target audience for campaigns\n */\nexport type TargetAudience = 'all' | 'authenticated' | 'anonymous';\n\n/**\n * Placement options for ads\n */\nexport type AdPlacement =\n | 'popup_slider'\n | 'options_panel'\n | 'onetime_modal'\n | 'update_modal'\n | 'notification'\n | 'footer_slider'\n | 'sidebar_panel'\n | 'home_banner';\n\n/**\n * Small panel variant styles\n */\nexport type SmallPanelVariant =\n | 'small_panel_1' // Minimal\n | 'small_panel_2' // Tagline\n | 'small_panel_3' // Features\n | 'small_panel_4' // Gradient\n | 'small_panel_5'; // Card\n\n/**\n * Large slider variant styles\n */\nexport type LargePanelVariant =\n | 'large_slider_1' // Hero\n | 'large_slider_2' // Feature Grid\n | 'large_slider_3' // Testimonial\n | 'large_slider_4' // Comparison\n | 'large_slider_5'; // Video Placeholder\n\n/**\n * All ad variant types\n */\nexport type AdVariant = SmallPanelVariant | LargePanelVariant;\n\n/**\n * Advertising campaign document\n * Stored in: zaions_campaigns/{campaignId}\n */\nexport interface Campaign {\n /** Campaign document ID */\n id: string;\n /** Reference to product being promoted */\n productId: string;\n /** Campaign name (admin reference) */\n name: string;\n /** Current campaign status */\n status: CampaignStatus;\n\n // === TARGETING ===\n /** Platforms where this campaign should show */\n targetPlatforms: TargetPlatform[];\n /** Audience type to target */\n targetAudience: TargetAudience;\n /** Specific projects to target (empty = all projects) */\n targetProjects: string[];\n /** Don't show to users already using this product */\n excludeProductUsers: boolean;\n\n // === DISPLAY RULES ===\n /** Where the ad can be displayed */\n placements: AdPlacement[];\n /** Priority (1-100, higher = more important) */\n priority: number;\n /** Days between impressions for same user (default: 20) */\n frequencyDays: number;\n /** Maximum total impressions (null = unlimited) */\n maxImpressions: number | null;\n\n // === TIMELINE ===\n /** Campaign start date */\n startDate: Timestamp;\n /** Campaign end date (null = no end) */\n endDate: Timestamp | null;\n\n // === CREATIVE ===\n /** UI variant to use */\n variant: AdVariant;\n /** Custom title (overrides product name) */\n customTitle?: string;\n /** Custom tagline (overrides product tagline) */\n customTagline?: string;\n /** Custom CTA button text */\n customCta?: string;\n /** Custom CTA button URL (overrides product URL) */\n customCtaUrl?: string;\n /** Custom description (overrides product description) */\n customDescription?: string;\n /** Custom product color for custom products/projects */\n customProductColor?: string;\n /** Custom icon SVG string (for custom products) */\n customIcon?: string;\n /** Custom features list (for custom products) */\n customFeatures?: string[];\n\n // === METRICS (Denormalized) ===\n /** Total number of impressions */\n totalImpressions: number;\n /** Total number of clicks */\n totalClicks: number;\n /** Total number of closes/dismissals */\n totalCloses: number;\n\n // === METADATA ===\n /** When campaign was created */\n createdAt: Timestamp;\n /** When campaign was last updated */\n updatedAt: Timestamp;\n /** Admin user ID who created */\n createdBy: string;\n /** Admin user ID who last updated */\n updatedBy?: string;\n}\n\n/**\n * Input for creating a new campaign\n */\nexport interface CreateCampaignInput {\n productId: string;\n name: string;\n status: CampaignStatus;\n targetPlatforms: TargetPlatform[];\n targetAudience: TargetAudience;\n targetProjects: string[];\n excludeProductUsers: boolean;\n placements: AdPlacement[];\n priority: number;\n frequencyDays: number;\n maxImpressions: number | null;\n startDate: Date;\n endDate: Date | null;\n variant: AdVariant;\n customTitle?: string;\n customTagline?: string;\n customCta?: string;\n customCtaUrl?: string;\n customDescription?: string;\n customProductColor?: string;\n customIcon?: string;\n customFeatures?: string[];\n}\n\n/**\n * Input for updating a campaign\n */\nexport interface UpdateCampaignInput extends Partial<CreateCampaignInput> {\n id: string;\n}\n\n// ============================================================================\n// IMPRESSION TYPES\n// ============================================================================\n\n/**\n * Types of ad interactions\n */\nexport type AdAction = 'impression' | 'click' | 'close' | 'notification_click';\n\n/**\n * Ad impression/interaction event\n * Stored in: zaions_impressions/{impressionId}\n */\nexport interface Impression {\n /** Impression document ID */\n id: string;\n /** Campaign that generated this impression */\n campaignId: string;\n /** Product being advertised */\n productId: string;\n /** Project where impression occurred */\n projectId: string;\n\n /** User ID (null for anonymous) */\n userId: string | null;\n /** Device/browser fingerprint */\n deviceId: string;\n /** Platform where impression occurred */\n platform: TargetPlatform;\n /** Placement where ad was shown */\n placement: AdPlacement;\n\n /** Type of interaction */\n action: AdAction;\n /** When the interaction occurred */\n timestamp: Timestamp;\n\n /** UI variant that was displayed */\n variant: AdVariant;\n /** Session identifier */\n sessionId?: string;\n}\n\n/**\n * Input for recording an impression\n */\nexport interface RecordImpressionInput {\n campaignId: string;\n productId: string;\n placement: AdPlacement;\n action: AdAction;\n variant: AdVariant;\n sessionId?: string;\n}\n\n// ============================================================================\n// AD HISTORY TYPES\n// ============================================================================\n\n/**\n * Local ad history entry (for frequency capping)\n */\nexport interface AdHistoryEntry {\n /** Campaign ID */\n campaignId: string;\n /** Product ID */\n productId: string;\n /** Last seen timestamp (Unix ms) */\n lastSeenAt: number;\n /** Impression count */\n impressionCount: number;\n /** Whether clicked */\n clicked: boolean;\n /** Whether closed */\n closed: boolean;\n /** Next eligible timestamp (Unix ms) */\n nextEligibleAt: number;\n}\n\n// ============================================================================\n// SERVICE TYPES\n// ============================================================================\n\n/**\n * Options for fetching campaigns\n */\nexport interface FetchCampaignsOptions {\n /** Filter by placement */\n placement?: AdPlacement;\n /** Filter by status */\n status?: CampaignStatus;\n /** Filter by product */\n productId?: string;\n /** Maximum results */\n limit?: number;\n}\n\n/**\n * Campaign with resolved product data\n */\nexport interface CampaignWithProduct extends Campaign {\n /** Resolved product information */\n product: Product;\n}\n\n// ============================================================================\n// ANALYTICS TYPES\n// ============================================================================\n\n/**\n * Campaign analytics summary\n */\nexport interface CampaignAnalytics {\n campaignId: string;\n campaignName: string;\n productId: string;\n productName: string;\n\n /** Total impressions */\n impressions: number;\n /** Total clicks */\n clicks: number;\n /** Total closes */\n closes: number;\n /** Click-through rate (clicks/impressions) */\n ctr: number;\n /** Close rate (closes/impressions) */\n closeRate: number;\n\n /** Breakdown by platform */\n byPlatform: Record<TargetPlatform, { impressions: number; clicks: number }>;\n /** Breakdown by placement */\n byPlacement: Record<AdPlacement, { impressions: number; clicks: number }>;\n /** Breakdown by project */\n byProject: Record<string, { impressions: number; clicks: number }>;\n /** Daily breakdown */\n byDate: Array<{\n date: string;\n impressions: number;\n clicks: number;\n closes: number;\n }>;\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\n/**\n * Props for small panel variants\n */\nexport interface SmallPanelProps {\n campaign: Campaign;\n product: Product;\n variant: SmallPanelVariant;\n onClose: () => void;\n onClick: () => void;\n}\n\n/**\n * Props for large panel variants\n */\nexport interface LargePanelProps {\n campaign: Campaign;\n product: Product;\n variant: LargePanelVariant;\n onClose: () => void;\n onClick: () => void;\n}\n\n/**\n * Props for ad slider component\n */\nexport interface AdSliderProps {\n placement: AdPlacement;\n variant?: SmallPanelVariant;\n autoplay?: boolean;\n interval?: number;\n maxCampaigns?: number;\n className?: string;\n}\n\n/**\n * Props for ad modal component\n */\nexport interface AdModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n campaign: CampaignWithProduct | null;\n variant?: LargePanelVariant;\n}\n\n/**\n * Props for ad panel component\n */\nexport interface AdPanelProps {\n placement: AdPlacement;\n variant?: SmallPanelVariant;\n className?: string;\n}\n\n// ============================================================================\n// DEFAULT VALUES\n// ============================================================================\n\n/**\n * Default frequency cap in days\n */\nexport const DEFAULT_FREQUENCY_DAYS = 20;\n\n/**\n * Default campaign priority\n */\nexport const DEFAULT_CAMPAIGN_PRIORITY = 50;\n\n/**\n * Variant display names\n */\nexport const VARIANT_NAMES: Record<AdVariant, string> = {\n small_panel_1: 'Minimal',\n small_panel_2: 'Tagline',\n small_panel_3: 'Features',\n small_panel_4: 'Gradient',\n small_panel_5: 'Card',\n large_slider_1: 'Hero',\n large_slider_2: 'Feature Grid',\n large_slider_3: 'Testimonial',\n large_slider_4: 'Comparison',\n large_slider_5: 'Video Placeholder',\n};\n\n/**\n * Placement display names\n */\nexport const PLACEMENT_NAMES: Record<AdPlacement, string> = {\n popup_slider: 'Extension Popup Slider',\n options_panel: 'Extension Options Panel',\n onetime_modal: 'One-Time Welcome Modal',\n update_modal: 'Update Announcement Modal',\n notification: 'Browser Notification',\n footer_slider: 'Web App Footer Slider',\n sidebar_panel: 'Web App Sidebar Panel',\n home_banner: 'Home Page Banner',\n};\n\n/**\n * Platform display names\n */\nexport const PLATFORM_NAMES: Record<TargetPlatform, string> = {\n web: 'Web App',\n android: 'Android App',\n ios: 'iOS App',\n extension: 'Browser Extension',\n};\n\n// ============================================================================\n// FIREBASE COLLECTION NAMES\n// ============================================================================\n\n/**\n * Collection names for shared features\n */\nexport const COLLECTIONS = {\n CAMPAIGNS: 'zaions_campaigns',\n PRODUCTS: 'zaions_products',\n IMPRESSIONS: 'zaions_impressions',\n CONTACTS: 'zaions_contacts',\n FEATURE_REQUESTS: 'zaions_feature_requests',\n PAYMENT_OPTIONS: 'zaions_payment_options',\n SOCIAL_LINKS: 'zaions_social_links',\n DEVELOPER_INFO: 'zaions_developer_info',\n} as const;\n"],"names":[],"mappings":";;AAybO,MAAM,yBAAyB;AAK/B,MAAM,4BAA4B;AAKlC,MAAM,gBAA2C;AAAA,EACtD,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAKO,MAAM,kBAA+C;AAAA,EAC1D,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AACf;AAKO,MAAM,iBAAiD;AAAA,EAC5D,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,WAAW;AACb;AASO,MAAM,cAAc;AAAA,EACzB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,gBAAgB;AAClB;;;;;;;"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Type Definitions Index
3
+ *
4
+ * Re-exports all type definitions from the shared-features package.
5
+ *
6
+ * @author Ahsan Mahmood <aoneahsan@gmail.com>
7
+ */
8
+ export * from './campaigns';
9
+ export type { FirebaseConfig, ConsumerPlatform, SharedFeaturesConfig, SharedFeaturesState, } from '../firebase/config';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,cAAc,aAAa,CAAC;AAG5B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,49 @@
1
+ const DEFAULT_FREQUENCY_DAYS = 20;
2
+ const DEFAULT_CAMPAIGN_PRIORITY = 50;
3
+ const VARIANT_NAMES = {
4
+ small_panel_1: "Minimal",
5
+ small_panel_2: "Tagline",
6
+ small_panel_3: "Features",
7
+ small_panel_4: "Gradient",
8
+ small_panel_5: "Card",
9
+ large_slider_1: "Hero",
10
+ large_slider_2: "Feature Grid",
11
+ large_slider_3: "Testimonial",
12
+ large_slider_4: "Comparison",
13
+ large_slider_5: "Video Placeholder"
14
+ };
15
+ const PLACEMENT_NAMES = {
16
+ popup_slider: "Extension Popup Slider",
17
+ options_panel: "Extension Options Panel",
18
+ onetime_modal: "One-Time Welcome Modal",
19
+ update_modal: "Update Announcement Modal",
20
+ notification: "Browser Notification",
21
+ footer_slider: "Web App Footer Slider",
22
+ sidebar_panel: "Web App Sidebar Panel",
23
+ home_banner: "Home Page Banner"
24
+ };
25
+ const PLATFORM_NAMES = {
26
+ web: "Web App",
27
+ android: "Android App",
28
+ ios: "iOS App",
29
+ extension: "Browser Extension"
30
+ };
31
+ const COLLECTIONS = {
32
+ CAMPAIGNS: "zaions_campaigns",
33
+ PRODUCTS: "zaions_products",
34
+ IMPRESSIONS: "zaions_impressions",
35
+ CONTACTS: "zaions_contacts",
36
+ FEATURE_REQUESTS: "zaions_feature_requests",
37
+ PAYMENT_OPTIONS: "zaions_payment_options",
38
+ SOCIAL_LINKS: "zaions_social_links",
39
+ DEVELOPER_INFO: "zaions_developer_info"
40
+ };
41
+ export {
42
+ COLLECTIONS,
43
+ DEFAULT_CAMPAIGN_PRIORITY,
44
+ DEFAULT_FREQUENCY_DAYS,
45
+ PLACEMENT_NAMES,
46
+ PLATFORM_NAMES,
47
+ VARIANT_NAMES
48
+ };
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/types/campaigns.ts"],"sourcesContent":["/**\n * Campaign/Advertising System Type Definitions\n *\n * Type definitions for the centralized advertising system including\n * Firestore document schemas, service interfaces, and UI types.\n *\n * Based on ZTools advertising system, adapted for cross-project use.\n *\n * @author Ahsan Mahmood <aoneahsan@gmail.com>\n */\n\nimport { Timestamp } from 'firebase/firestore';\n\n// ============================================================================\n// PRODUCT TYPES\n// ============================================================================\n\n/**\n * Product type classification\n */\nexport type ProductType = 'extension' | 'android' | 'ios' | 'web';\n\n/**\n * Product information for advertising\n */\nexport interface Product {\n /** Unique product identifier */\n id: string;\n /** Product display name */\n name: string;\n /** Short tagline (marketing slogan) */\n tagline: string;\n /** Longer description of the product */\n description: string;\n /** Product type classification */\n type: ProductType;\n /** URL to the product (store link or website) */\n url: string;\n /** Brand/theme color (hex) */\n color: string;\n /** Key features list (3-4 items) */\n features: string[];\n /** Inline SVG icon (64px) */\n icon64?: string;\n /** Inline SVG icon (128px) */\n icon128?: string;\n /** Chrome Web Store URL */\n chromeStoreUrl?: string;\n /** Google Play Store URL */\n playStoreUrl?: string;\n /** Apple App Store URL */\n appStoreUrl?: string;\n /** Web app URL */\n webUrl?: string;\n /** Whether the product is active */\n enabled: boolean;\n /** When the product was created */\n createdAt: Timestamp;\n /** When the product was last updated */\n updatedAt: Timestamp;\n}\n\n// ============================================================================\n// CAMPAIGN TYPES\n// ============================================================================\n\n/**\n * Campaign status values\n */\nexport type CampaignStatus = 'active' | 'paused' | 'scheduled' | 'ended';\n\n/**\n * Target platforms for campaigns\n */\nexport type TargetPlatform = 'web' | 'android' | 'ios' | 'extension';\n\n/**\n * Target audience for campaigns\n */\nexport type TargetAudience = 'all' | 'authenticated' | 'anonymous';\n\n/**\n * Placement options for ads\n */\nexport type AdPlacement =\n | 'popup_slider'\n | 'options_panel'\n | 'onetime_modal'\n | 'update_modal'\n | 'notification'\n | 'footer_slider'\n | 'sidebar_panel'\n | 'home_banner';\n\n/**\n * Small panel variant styles\n */\nexport type SmallPanelVariant =\n | 'small_panel_1' // Minimal\n | 'small_panel_2' // Tagline\n | 'small_panel_3' // Features\n | 'small_panel_4' // Gradient\n | 'small_panel_5'; // Card\n\n/**\n * Large slider variant styles\n */\nexport type LargePanelVariant =\n | 'large_slider_1' // Hero\n | 'large_slider_2' // Feature Grid\n | 'large_slider_3' // Testimonial\n | 'large_slider_4' // Comparison\n | 'large_slider_5'; // Video Placeholder\n\n/**\n * All ad variant types\n */\nexport type AdVariant = SmallPanelVariant | LargePanelVariant;\n\n/**\n * Advertising campaign document\n * Stored in: zaions_campaigns/{campaignId}\n */\nexport interface Campaign {\n /** Campaign document ID */\n id: string;\n /** Reference to product being promoted */\n productId: string;\n /** Campaign name (admin reference) */\n name: string;\n /** Current campaign status */\n status: CampaignStatus;\n\n // === TARGETING ===\n /** Platforms where this campaign should show */\n targetPlatforms: TargetPlatform[];\n /** Audience type to target */\n targetAudience: TargetAudience;\n /** Specific projects to target (empty = all projects) */\n targetProjects: string[];\n /** Don't show to users already using this product */\n excludeProductUsers: boolean;\n\n // === DISPLAY RULES ===\n /** Where the ad can be displayed */\n placements: AdPlacement[];\n /** Priority (1-100, higher = more important) */\n priority: number;\n /** Days between impressions for same user (default: 20) */\n frequencyDays: number;\n /** Maximum total impressions (null = unlimited) */\n maxImpressions: number | null;\n\n // === TIMELINE ===\n /** Campaign start date */\n startDate: Timestamp;\n /** Campaign end date (null = no end) */\n endDate: Timestamp | null;\n\n // === CREATIVE ===\n /** UI variant to use */\n variant: AdVariant;\n /** Custom title (overrides product name) */\n customTitle?: string;\n /** Custom tagline (overrides product tagline) */\n customTagline?: string;\n /** Custom CTA button text */\n customCta?: string;\n /** Custom CTA button URL (overrides product URL) */\n customCtaUrl?: string;\n /** Custom description (overrides product description) */\n customDescription?: string;\n /** Custom product color for custom products/projects */\n customProductColor?: string;\n /** Custom icon SVG string (for custom products) */\n customIcon?: string;\n /** Custom features list (for custom products) */\n customFeatures?: string[];\n\n // === METRICS (Denormalized) ===\n /** Total number of impressions */\n totalImpressions: number;\n /** Total number of clicks */\n totalClicks: number;\n /** Total number of closes/dismissals */\n totalCloses: number;\n\n // === METADATA ===\n /** When campaign was created */\n createdAt: Timestamp;\n /** When campaign was last updated */\n updatedAt: Timestamp;\n /** Admin user ID who created */\n createdBy: string;\n /** Admin user ID who last updated */\n updatedBy?: string;\n}\n\n/**\n * Input for creating a new campaign\n */\nexport interface CreateCampaignInput {\n productId: string;\n name: string;\n status: CampaignStatus;\n targetPlatforms: TargetPlatform[];\n targetAudience: TargetAudience;\n targetProjects: string[];\n excludeProductUsers: boolean;\n placements: AdPlacement[];\n priority: number;\n frequencyDays: number;\n maxImpressions: number | null;\n startDate: Date;\n endDate: Date | null;\n variant: AdVariant;\n customTitle?: string;\n customTagline?: string;\n customCta?: string;\n customCtaUrl?: string;\n customDescription?: string;\n customProductColor?: string;\n customIcon?: string;\n customFeatures?: string[];\n}\n\n/**\n * Input for updating a campaign\n */\nexport interface UpdateCampaignInput extends Partial<CreateCampaignInput> {\n id: string;\n}\n\n// ============================================================================\n// IMPRESSION TYPES\n// ============================================================================\n\n/**\n * Types of ad interactions\n */\nexport type AdAction = 'impression' | 'click' | 'close' | 'notification_click';\n\n/**\n * Ad impression/interaction event\n * Stored in: zaions_impressions/{impressionId}\n */\nexport interface Impression {\n /** Impression document ID */\n id: string;\n /** Campaign that generated this impression */\n campaignId: string;\n /** Product being advertised */\n productId: string;\n /** Project where impression occurred */\n projectId: string;\n\n /** User ID (null for anonymous) */\n userId: string | null;\n /** Device/browser fingerprint */\n deviceId: string;\n /** Platform where impression occurred */\n platform: TargetPlatform;\n /** Placement where ad was shown */\n placement: AdPlacement;\n\n /** Type of interaction */\n action: AdAction;\n /** When the interaction occurred */\n timestamp: Timestamp;\n\n /** UI variant that was displayed */\n variant: AdVariant;\n /** Session identifier */\n sessionId?: string;\n}\n\n/**\n * Input for recording an impression\n */\nexport interface RecordImpressionInput {\n campaignId: string;\n productId: string;\n placement: AdPlacement;\n action: AdAction;\n variant: AdVariant;\n sessionId?: string;\n}\n\n// ============================================================================\n// AD HISTORY TYPES\n// ============================================================================\n\n/**\n * Local ad history entry (for frequency capping)\n */\nexport interface AdHistoryEntry {\n /** Campaign ID */\n campaignId: string;\n /** Product ID */\n productId: string;\n /** Last seen timestamp (Unix ms) */\n lastSeenAt: number;\n /** Impression count */\n impressionCount: number;\n /** Whether clicked */\n clicked: boolean;\n /** Whether closed */\n closed: boolean;\n /** Next eligible timestamp (Unix ms) */\n nextEligibleAt: number;\n}\n\n// ============================================================================\n// SERVICE TYPES\n// ============================================================================\n\n/**\n * Options for fetching campaigns\n */\nexport interface FetchCampaignsOptions {\n /** Filter by placement */\n placement?: AdPlacement;\n /** Filter by status */\n status?: CampaignStatus;\n /** Filter by product */\n productId?: string;\n /** Maximum results */\n limit?: number;\n}\n\n/**\n * Campaign with resolved product data\n */\nexport interface CampaignWithProduct extends Campaign {\n /** Resolved product information */\n product: Product;\n}\n\n// ============================================================================\n// ANALYTICS TYPES\n// ============================================================================\n\n/**\n * Campaign analytics summary\n */\nexport interface CampaignAnalytics {\n campaignId: string;\n campaignName: string;\n productId: string;\n productName: string;\n\n /** Total impressions */\n impressions: number;\n /** Total clicks */\n clicks: number;\n /** Total closes */\n closes: number;\n /** Click-through rate (clicks/impressions) */\n ctr: number;\n /** Close rate (closes/impressions) */\n closeRate: number;\n\n /** Breakdown by platform */\n byPlatform: Record<TargetPlatform, { impressions: number; clicks: number }>;\n /** Breakdown by placement */\n byPlacement: Record<AdPlacement, { impressions: number; clicks: number }>;\n /** Breakdown by project */\n byProject: Record<string, { impressions: number; clicks: number }>;\n /** Daily breakdown */\n byDate: Array<{\n date: string;\n impressions: number;\n clicks: number;\n closes: number;\n }>;\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\n/**\n * Props for small panel variants\n */\nexport interface SmallPanelProps {\n campaign: Campaign;\n product: Product;\n variant: SmallPanelVariant;\n onClose: () => void;\n onClick: () => void;\n}\n\n/**\n * Props for large panel variants\n */\nexport interface LargePanelProps {\n campaign: Campaign;\n product: Product;\n variant: LargePanelVariant;\n onClose: () => void;\n onClick: () => void;\n}\n\n/**\n * Props for ad slider component\n */\nexport interface AdSliderProps {\n placement: AdPlacement;\n variant?: SmallPanelVariant;\n autoplay?: boolean;\n interval?: number;\n maxCampaigns?: number;\n className?: string;\n}\n\n/**\n * Props for ad modal component\n */\nexport interface AdModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n campaign: CampaignWithProduct | null;\n variant?: LargePanelVariant;\n}\n\n/**\n * Props for ad panel component\n */\nexport interface AdPanelProps {\n placement: AdPlacement;\n variant?: SmallPanelVariant;\n className?: string;\n}\n\n// ============================================================================\n// DEFAULT VALUES\n// ============================================================================\n\n/**\n * Default frequency cap in days\n */\nexport const DEFAULT_FREQUENCY_DAYS = 20;\n\n/**\n * Default campaign priority\n */\nexport const DEFAULT_CAMPAIGN_PRIORITY = 50;\n\n/**\n * Variant display names\n */\nexport const VARIANT_NAMES: Record<AdVariant, string> = {\n small_panel_1: 'Minimal',\n small_panel_2: 'Tagline',\n small_panel_3: 'Features',\n small_panel_4: 'Gradient',\n small_panel_5: 'Card',\n large_slider_1: 'Hero',\n large_slider_2: 'Feature Grid',\n large_slider_3: 'Testimonial',\n large_slider_4: 'Comparison',\n large_slider_5: 'Video Placeholder',\n};\n\n/**\n * Placement display names\n */\nexport const PLACEMENT_NAMES: Record<AdPlacement, string> = {\n popup_slider: 'Extension Popup Slider',\n options_panel: 'Extension Options Panel',\n onetime_modal: 'One-Time Welcome Modal',\n update_modal: 'Update Announcement Modal',\n notification: 'Browser Notification',\n footer_slider: 'Web App Footer Slider',\n sidebar_panel: 'Web App Sidebar Panel',\n home_banner: 'Home Page Banner',\n};\n\n/**\n * Platform display names\n */\nexport const PLATFORM_NAMES: Record<TargetPlatform, string> = {\n web: 'Web App',\n android: 'Android App',\n ios: 'iOS App',\n extension: 'Browser Extension',\n};\n\n// ============================================================================\n// FIREBASE COLLECTION NAMES\n// ============================================================================\n\n/**\n * Collection names for shared features\n */\nexport const COLLECTIONS = {\n CAMPAIGNS: 'zaions_campaigns',\n PRODUCTS: 'zaions_products',\n IMPRESSIONS: 'zaions_impressions',\n CONTACTS: 'zaions_contacts',\n FEATURE_REQUESTS: 'zaions_feature_requests',\n PAYMENT_OPTIONS: 'zaions_payment_options',\n SOCIAL_LINKS: 'zaions_social_links',\n DEVELOPER_INFO: 'zaions_developer_info',\n} as const;\n"],"names":[],"mappings":"AAybO,MAAM,yBAAyB;AAK/B,MAAM,4BAA4B;AAKlC,MAAM,gBAA2C;AAAA,EACtD,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAKO,MAAM,kBAA+C;AAAA,EAC1D,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AACf;AAKO,MAAM,iBAAiD;AAAA,EAC5D,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,WAAW;AACb;AASO,MAAM,cAAc;AAAA,EACzB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,gBAAgB;AAClB;"}