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.
- package/README.md +200 -0
- package/dist/AdPanel-D0BiV6Xb.cjs +88 -0
- package/dist/AdPanel-D0BiV6Xb.cjs.map +1 -0
- package/dist/AdPanel-RGRBf4ub.js +89 -0
- package/dist/AdPanel-RGRBf4ub.js.map +1 -0
- package/dist/analytics-6shJHRZG.cjs +463 -0
- package/dist/analytics-6shJHRZG.cjs.map +1 -0
- package/dist/analytics-Bbmodnm_.js +442 -0
- package/dist/analytics-Bbmodnm_.js.map +1 -0
- package/dist/components/ads/AdPanel.d.ts +12 -0
- package/dist/components/ads/AdPanel.d.ts.map +1 -0
- package/dist/components/ads/index.d.ts +9 -0
- package/dist/components/ads/index.d.ts.map +1 -0
- package/dist/components/index.cjs +5 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +5 -0
- package/dist/components/index.js.map +1 -0
- package/dist/firebase/config.d.ts +77 -0
- package/dist/firebase/config.d.ts.map +1 -0
- package/dist/firebase/init.d.ts +55 -0
- package/dist/firebase/init.d.ts.map +1 -0
- package/dist/hooks/index.cjs +6 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useCampaigns.d.ts +59 -0
- package/dist/hooks/useCampaigns.d.ts.map +1 -0
- package/dist/index.cjs +37 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/services/analytics.d.ts +32 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/campaigns.d.ts +31 -0
- package/dist/services/campaigns.d.ts.map +1 -0
- package/dist/services/index.cjs +18 -0
- package/dist/services/index.cjs.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/types/campaigns.d.ts +378 -0
- package/dist/types/campaigns.d.ts.map +1 -0
- package/dist/types/index.cjs +49 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +49 -0
- package/dist/types/index.js.map +1 -0
- package/dist/useCampaigns-3NxODLLs.js +98 -0
- package/dist/useCampaigns-3NxODLLs.js.map +1 -0
- package/dist/useCampaigns-BNOHpETm.cjs +97 -0
- package/dist/useCampaigns-BNOHpETm.cjs.map +1 -0
- 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":"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"}
|
|
@@ -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;"}
|