@thead-vantage/react 2.0.0 → 2.1.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 +429 -84
- package/next.config.ts +7 -0
- package/package.json +23 -49
- package/postcss.config.mjs +5 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/next.svg +1 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/src/app/api/ads/route.ts +174 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +26 -0
- package/src/app/layout.tsx +34 -0
- package/src/app/page.tsx +103 -0
- package/src/components/AdBanner.tsx +119 -0
- package/src/components/AdDisplay.tsx +98 -0
- package/src/lib/ads.ts +275 -0
- package/src/lib/thead-vantage-config.ts +108 -0
- package/tsconfig.json +27 -0
- package/dist/components/AdBanner.d.ts +0 -12
- package/dist/index.d.ts +0 -1
- package/dist/index.esm.js +0 -2
- package/dist/index.esm.js.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
package/src/lib/ads.ts
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ads utility functions for fetching and tracking ads
|
|
3
|
+
* Automatically handles development mode to prevent tracking
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { getApiBaseUrl } from './thead-vantage-config';
|
|
7
|
+
|
|
8
|
+
export interface AdData {
|
|
9
|
+
id: string;
|
|
10
|
+
imageUrl: string;
|
|
11
|
+
linkUrl: string;
|
|
12
|
+
alt: string;
|
|
13
|
+
width?: number;
|
|
14
|
+
height?: number;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface Ad {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
type: string;
|
|
22
|
+
contentUrl: string;
|
|
23
|
+
targetUrl: string;
|
|
24
|
+
width?: number;
|
|
25
|
+
height?: number;
|
|
26
|
+
duration?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface AdsResponse {
|
|
30
|
+
success: boolean;
|
|
31
|
+
ad?: AdData;
|
|
32
|
+
ads?: AdData[] | Ad[];
|
|
33
|
+
dev_mode?: boolean;
|
|
34
|
+
_dev_note?: string;
|
|
35
|
+
message?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface AdBannerResponse {
|
|
39
|
+
success: boolean;
|
|
40
|
+
ad?: Ad;
|
|
41
|
+
ads?: Ad[];
|
|
42
|
+
dev_mode?: boolean;
|
|
43
|
+
_dev_note?: string;
|
|
44
|
+
message?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface FetchAdBannerParams {
|
|
48
|
+
platformId: string;
|
|
49
|
+
apiKey: string;
|
|
50
|
+
size?: 'leaderboard' | 'medium-rectangle' | 'wide-skyscraper' | 'banner';
|
|
51
|
+
apiUrl?: string;
|
|
52
|
+
userId?: string | null;
|
|
53
|
+
userSegment?: string | null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Fetch ads from TheAd Vantage platform (generic)
|
|
58
|
+
* In development mode, uses mock data and prevents tracking
|
|
59
|
+
*/
|
|
60
|
+
export async function fetchAds(params?: Record<string, string>): Promise<AdsResponse> {
|
|
61
|
+
try {
|
|
62
|
+
const searchParams = new URLSearchParams(params);
|
|
63
|
+
const response = await fetch(`/api/ads?${searchParams.toString()}`);
|
|
64
|
+
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
throw new Error(`Failed to fetch ads: ${response.statusText}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const data: AdsResponse = await response.json();
|
|
70
|
+
return data;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error('Error fetching ads:', error);
|
|
73
|
+
|
|
74
|
+
// In TheAd Vantage dev mode, return mock data
|
|
75
|
+
if (process.env.NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE === 'true') {
|
|
76
|
+
return {
|
|
77
|
+
success: true,
|
|
78
|
+
dev_mode: true,
|
|
79
|
+
ad: {
|
|
80
|
+
id: 'dev-ad-1',
|
|
81
|
+
imageUrl: '/placeholder-ad.png',
|
|
82
|
+
linkUrl: '#',
|
|
83
|
+
alt: 'Development Ad - No Tracking',
|
|
84
|
+
width: 300,
|
|
85
|
+
height: 250,
|
|
86
|
+
},
|
|
87
|
+
message: 'Development mode: Using mock ad',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Fetch ad banner from TheAd Vantage platform
|
|
97
|
+
* Supports three modes: Production, Platform Developer Dev, TheAd Vantage Dev
|
|
98
|
+
*/
|
|
99
|
+
export async function fetchAdBanner(params: FetchAdBannerParams): Promise<AdBannerResponse> {
|
|
100
|
+
try {
|
|
101
|
+
// Build query parameters
|
|
102
|
+
const searchParams = new URLSearchParams({
|
|
103
|
+
platform_id: params.platformId,
|
|
104
|
+
api_key: params.apiKey,
|
|
105
|
+
size: params.size || 'banner',
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
if (params.userId) {
|
|
109
|
+
searchParams.append('user_id', params.userId);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (params.userSegment) {
|
|
113
|
+
searchParams.append('user_segment', params.userSegment);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Add explicit API URL if provided
|
|
117
|
+
if (params.apiUrl) {
|
|
118
|
+
searchParams.append('apiUrl', params.apiUrl);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const url = `/api/ads?${searchParams.toString()}`;
|
|
122
|
+
|
|
123
|
+
// Log the request (without exposing the API key)
|
|
124
|
+
const logUrl = url.replace(new RegExp(`api_key=${params.apiKey}`, 'g'), 'api_key=***');
|
|
125
|
+
console.log('[AdBanner] Fetching ad from:', logUrl);
|
|
126
|
+
|
|
127
|
+
const response = await fetch(url, {
|
|
128
|
+
method: 'GET',
|
|
129
|
+
headers: {
|
|
130
|
+
'Content-Type': 'application/json',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (!response.ok) {
|
|
135
|
+
throw new Error(`Failed to fetch ad: ${response.status} ${response.statusText}`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const data: AdsResponse = await response.json();
|
|
139
|
+
|
|
140
|
+
// Type guard to check if an object is Ad type (for arrays that might contain either)
|
|
141
|
+
const isAd = (obj: unknown): obj is Ad => {
|
|
142
|
+
if (typeof obj !== 'object' || obj === null) return false;
|
|
143
|
+
return 'name' in obj && 'type' in obj && 'contentUrl' in obj && 'targetUrl' in obj;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// Helper to convert AdData to Ad
|
|
147
|
+
const convertToAd = (adData: AdData): Ad => {
|
|
148
|
+
return {
|
|
149
|
+
id: adData.id,
|
|
150
|
+
name: adData.alt || 'Ad',
|
|
151
|
+
type: 'image',
|
|
152
|
+
contentUrl: adData.imageUrl,
|
|
153
|
+
targetUrl: adData.linkUrl,
|
|
154
|
+
width: adData.width,
|
|
155
|
+
height: adData.height,
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// Handle both single ad and array of ads
|
|
160
|
+
if (data.ads && Array.isArray(data.ads) && data.ads.length > 0) {
|
|
161
|
+
// If we get an array, use the first ad and ensure it's Ad type
|
|
162
|
+
const firstAd = data.ads[0];
|
|
163
|
+
// Check if it's already an Ad, otherwise convert from AdData
|
|
164
|
+
const ad: Ad = isAd(firstAd)
|
|
165
|
+
? firstAd
|
|
166
|
+
: convertToAd(firstAd as AdData);
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
success: data.success,
|
|
170
|
+
ad,
|
|
171
|
+
dev_mode: data.dev_mode,
|
|
172
|
+
_dev_note: data._dev_note,
|
|
173
|
+
message: data.message,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Handle single ad response - convert AdData to Ad
|
|
178
|
+
// Since data.ad is typed as AdData, we always convert it
|
|
179
|
+
if (data.ad) {
|
|
180
|
+
const ad: Ad = convertToAd(data.ad);
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
success: data.success,
|
|
184
|
+
ad,
|
|
185
|
+
dev_mode: data.dev_mode,
|
|
186
|
+
_dev_note: data._dev_note,
|
|
187
|
+
message: data.message,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
success: data.success,
|
|
193
|
+
dev_mode: data.dev_mode,
|
|
194
|
+
_dev_note: data._dev_note,
|
|
195
|
+
message: data.message,
|
|
196
|
+
};
|
|
197
|
+
} catch (error) {
|
|
198
|
+
console.error('[AdBanner] Error fetching ad:', error);
|
|
199
|
+
|
|
200
|
+
// In TheAd Vantage dev mode, return mock data
|
|
201
|
+
if (process.env.NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE === 'true') {
|
|
202
|
+
return {
|
|
203
|
+
success: true,
|
|
204
|
+
dev_mode: true,
|
|
205
|
+
ad: {
|
|
206
|
+
id: 'dev-ad-1',
|
|
207
|
+
name: 'Development Ad',
|
|
208
|
+
type: 'image',
|
|
209
|
+
contentUrl: '/placeholder-ad.png',
|
|
210
|
+
targetUrl: '#',
|
|
211
|
+
width: 300,
|
|
212
|
+
height: 250,
|
|
213
|
+
},
|
|
214
|
+
message: 'TheAd Vantage dev mode: Using mock ad',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Track an ad impression (when ad is viewed)
|
|
224
|
+
* In development mode, this is a no-op (handled by API route)
|
|
225
|
+
*/
|
|
226
|
+
export async function trackImpression(adId: string): Promise<void> {
|
|
227
|
+
try {
|
|
228
|
+
const response = await fetch('/api/ads', {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
headers: {
|
|
231
|
+
'Content-Type': 'application/json',
|
|
232
|
+
},
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
action: 'impression',
|
|
235
|
+
adId,
|
|
236
|
+
}),
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
const data = await response.json();
|
|
240
|
+
if (data.dev_mode) {
|
|
241
|
+
console.log(`[DEV] Impression tracking skipped for ad: ${adId}`);
|
|
242
|
+
}
|
|
243
|
+
} catch (error) {
|
|
244
|
+
console.error('Error tracking impression:', error);
|
|
245
|
+
// Don't throw - tracking failures shouldn't break the app
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Track an ad click
|
|
251
|
+
* In development mode, this is a no-op (handled by API route)
|
|
252
|
+
*/
|
|
253
|
+
export async function trackClick(adId: string): Promise<void> {
|
|
254
|
+
try {
|
|
255
|
+
const response = await fetch('/api/ads', {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers: {
|
|
258
|
+
'Content-Type': 'application/json',
|
|
259
|
+
},
|
|
260
|
+
body: JSON.stringify({
|
|
261
|
+
action: 'click',
|
|
262
|
+
adId,
|
|
263
|
+
}),
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
const data = await response.json();
|
|
267
|
+
if (data.dev_mode) {
|
|
268
|
+
console.log(`[DEV] Click tracking skipped for ad: ${adId}`);
|
|
269
|
+
}
|
|
270
|
+
} catch (error) {
|
|
271
|
+
console.error('Error tracking click:', error);
|
|
272
|
+
// Don't throw - tracking failures shouldn't break the app
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TheAd Vantage Configuration Utility
|
|
3
|
+
*
|
|
4
|
+
* Handles three distinct modes of operation:
|
|
5
|
+
* 1. Production Mode (default) - hits https://thead-vantage.com/api/ads
|
|
6
|
+
* 2. Platform Developer Dev Mode - custom API URL via env var or prop
|
|
7
|
+
* 3. TheAd Vantage Dev Mode - localhost:3001 for TheAd Vantage developers
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get the base API URL based on the current configuration
|
|
12
|
+
*
|
|
13
|
+
* Priority order:
|
|
14
|
+
* 1. Explicit API URL override (passed as parameter)
|
|
15
|
+
* 2. NEXT_PUBLIC_THEAD_VANTAGE_API_URL environment variable
|
|
16
|
+
* 3. TheAd Vantage dev mode (NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE=true)
|
|
17
|
+
* 4. Production mode (default)
|
|
18
|
+
*/
|
|
19
|
+
export function getApiBaseUrl(explicitApiUrl?: string): string {
|
|
20
|
+
// Priority 1: Explicit API URL override (highest priority)
|
|
21
|
+
if (explicitApiUrl) {
|
|
22
|
+
return explicitApiUrl;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Priority 2: Environment variable for custom API URL
|
|
26
|
+
// This allows platform developers to point to their own platform
|
|
27
|
+
if (typeof window !== 'undefined') {
|
|
28
|
+
// Check runtime config first (for browser contexts)
|
|
29
|
+
const runtimeUrl = (window as any).__THEAD_VANTAGE_API_URL__;
|
|
30
|
+
if (runtimeUrl) {
|
|
31
|
+
return runtimeUrl;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Check environment variable (works in both server and client)
|
|
36
|
+
const customUrl = process.env.NEXT_PUBLIC_THEAD_VANTAGE_API_URL;
|
|
37
|
+
if (customUrl) {
|
|
38
|
+
return customUrl;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Priority 3: TheAd Vantage dev mode
|
|
42
|
+
// Only for TheAd Vantage developers testing locally
|
|
43
|
+
const isDevMode = typeof window !== 'undefined'
|
|
44
|
+
? (window as any).__THEAD_VANTAGE_DEV_MODE__ === true ||
|
|
45
|
+
process.env.NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE === 'true'
|
|
46
|
+
: process.env.NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE === 'true';
|
|
47
|
+
|
|
48
|
+
if (isDevMode) {
|
|
49
|
+
return 'http://localhost:3001/api/ads';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Priority 4: Production mode (default)
|
|
53
|
+
// Platform developers use this by default
|
|
54
|
+
return 'https://thead-vantage.com/api/ads';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Check if we're in TheAd Vantage dev mode
|
|
59
|
+
*/
|
|
60
|
+
export function isTheadVantageDevMode(): boolean {
|
|
61
|
+
if (typeof window !== 'undefined') {
|
|
62
|
+
return (window as any).__THEAD_VANTAGE_DEV_MODE__ === true ||
|
|
63
|
+
process.env.NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE === 'true';
|
|
64
|
+
}
|
|
65
|
+
return process.env.NEXT_PUBLIC_THEAD_VANTAGE_DEV_MODE === 'true';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check if we're in development mode (NODE_ENV)
|
|
70
|
+
*/
|
|
71
|
+
export function isDevelopmentMode(): boolean {
|
|
72
|
+
return process.env.NODE_ENV === 'development';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Runtime configuration interface
|
|
77
|
+
*/
|
|
78
|
+
export interface TheadVantageConfig {
|
|
79
|
+
apiUrl?: string;
|
|
80
|
+
devMode?: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
let globalConfig: TheadVantageConfig = {};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Set runtime configuration (useful for browser-only contexts)
|
|
87
|
+
*/
|
|
88
|
+
export function setTheadVantageConfig(config: TheadVantageConfig): void {
|
|
89
|
+
globalConfig = { ...globalConfig, ...config };
|
|
90
|
+
|
|
91
|
+
// Also set on window for browser contexts
|
|
92
|
+
if (typeof window !== 'undefined') {
|
|
93
|
+
if (config.apiUrl !== undefined) {
|
|
94
|
+
(window as any).__THEAD_VANTAGE_API_URL__ = config.apiUrl;
|
|
95
|
+
}
|
|
96
|
+
if (config.devMode !== undefined) {
|
|
97
|
+
(window as any).__THEAD_VANTAGE_DEV_MODE__ = config.devMode;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Get current runtime configuration
|
|
104
|
+
*/
|
|
105
|
+
export function getTheadVantageConfig(): TheadVantageConfig {
|
|
106
|
+
return globalConfig;
|
|
107
|
+
}
|
|
108
|
+
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"paths": {
|
|
22
|
+
"@/*": ["./src/*"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
26
|
+
"exclude": ["node_modules"]
|
|
27
|
+
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
interface AdBannerProps {
|
|
2
|
-
platformId: string;
|
|
3
|
-
apiKey: string;
|
|
4
|
-
size?: 'leaderboard' | 'medium-rectangle' | 'wide-skyscraper';
|
|
5
|
-
className?: string;
|
|
6
|
-
libraryDev?: boolean;
|
|
7
|
-
platformDev?: boolean;
|
|
8
|
-
impressionMetadata?: object;
|
|
9
|
-
clickMetadata?: object;
|
|
10
|
-
}
|
|
11
|
-
export declare const AdBanner: ({ platformId, apiKey, size, className, libraryDev, platformDev, impressionMetadata, clickMetadata, }: AdBannerProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
-
export {};
|
package/dist/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { AdBanner } from './components/AdBanner';
|
package/dist/index.esm.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useState as r,useCallback as n,useRef as o,useEffect as i}from"react";var a=function(){return a=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};function s(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))}function c(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}"function"==typeof SuppressedError&&SuppressedError;var l={leaderboard:{width:728,height:90},"medium-rectangle":{width:300,height:250},"wide-skyscraper":{width:160,height:600}};function u(){try{return JSON.stringify({ua:navigator.userAgent,lang:navigator.language,tz:Intl.DateTimeFormat().resolvedOptions().timeZone,width:window.innerWidth,height:window.innerHeight,id:localStorage.getItem("thead_sig")||(e=Math.random().toString(36).slice(2),localStorage.setItem("thead_sig",e),e)})}catch(e){return""}var e}var d=function(d){var h=d.platformId,p=d.apiKey,f=d.size,g=void 0===f?"leaderboard":f,v=d.className,m=void 0===v?"":v,b=d.libraryDev,w=void 0!==b&&b,y=d.platformDev,x=void 0!==y&&y,k=d.impressionMetadata,I=d.clickMetadata,N=w&&"development"===process.env.NODE_ENV,S=r([]),E=S[0],O=S[1],D=r(0),j=D[0];D[1];var R=r(null),T=R[0],F=R[1],_=r(!1),C=_[0],V=_[1],z=r(!1),P=z[0],W=z[1],A=r(0),B=A[0],H=A[1],U=r(null),J=U[0],M=U[1],q=n((function(e){M(e)}),[]),G=o(null),K=o(null),X=r(!1),Z=X[0],L=X[1],Q="development"===process.env.NODE_ENV?"http://localhost:3001":"https://www.thead-vantage.com";l[g].width,l[g].height;var Y=l[g].width,$=l[g].height;i((function(){s(void 0,void 0,void 0,(function(){var e,t,r,n;return c(this,(function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),e=u(),[4,fetch("".concat(Q,"/api/ads"),{method:"GET",headers:{Authorization:"Bearer ".concat(p),"X-Platform-ID":h,"X-Client-Signature":e}})];case 1:if(!(t=o.sent()).ok)throw new Error("Failed to fetch ads");return[4,t.json()];case 2:return r=o.sent(),O(r.ads),[3,4];case 3:return n=o.sent(),F(n instanceof Error?n.message:"Failed to load ads"),[3,4];case 4:return[2]}}))}))}),[h,p,Q]),i((function(){return N&&console.log("adDiv:",J),J?(N&&console.log("Setting up intersection observer"),G.current=new IntersectionObserver((function(e){var t=e[0];N&&console.log("Intersection callback fired:",{isIntersecting:t.isIntersecting,intersectionRatio:t.intersectionRatio,boundingClientRect:t.boundingClientRect,rootBounds:t.rootBounds});var r=t.isIntersecting&&t.intersectionRatio>=.1;L(!r),r&&!C?K.current||(K.current=setInterval((function(){H((function(e){var t=e+1;return N&&console.log("View time:",t),t}))}),1e3)):K.current&&(clearInterval(K.current),K.current=null)}),{threshold:.1}),G.current.observe(J)):!J&&N&&console.warn("adDiv is not set when trying to observe"),function(){G.current&&G.current.disconnect(),K.current&&(clearInterval(K.current),K.current=null)}}),[J,N,C]),i((function(){var e=E[j];if(e){var t=e.duration||3;N&&console.log("Checking impression conditions:",{viewTime:B,requiredViewTime:t,impressionRecorded:C,isRecordingImpression:P,notVisible:Z}),B>=t&&!C&&!P&&!Z&&(N&&console.log("Starting impression recording"),W(!0),ee(e.id))}}),[B,j,E,C,P,Z,N]);var ee=function(e){return s(void 0,void 0,void 0,(function(){var t,r,n,o;return c(this,(function(i){switch(i.label){case 0:if(console.log("trackImpression",e),x)return N&&console.log("Skipping impression in platformDev mode"),W(!1),V(!0),[2];i.label=1;case 1:return i.trys.push([1,6,7,8]),N&&console.log("Sending impression request"),t=u(),[4,fetch("".concat(Q,"/api/impressions"),{method:"POST",headers:{Authorization:"Bearer ".concat(p),"Content-Type":"application/json"},body:JSON.stringify({adId:e,platformId:h,apiKey:p,clientSignature:t,metadata:a(a({},k),{_mode:{libraryDev:N,platformDev:x,isProduction:"production"===process.env.NODE_ENV,isTheadVantage:Q.includes("thead-vantage.com")}})})})];case 2:return r=i.sent(),console.log("response",r),r.ok?(N&&console.log("Impression recorded successfully"),V(!0),[3,5]):[3,3];case 3:return[4,r.text()];case 4:n=i.sent(),N&&console.error("Failed to record impression:",n),F("Failed to record impression: ".concat(n)),i.label=5;case 5:return[3,8];case 6:return o=i.sent(),N&&console.error("Failed to track impression:",o),F("Failed to track impression: ".concat(o instanceof Error?o.message:"Unknown error")),[3,8];case 7:return W(!1),[7];case 8:return[2]}}))}))};if(T)return e("div",a({className:"text-red-500"},{children:["Error: ",T]}));if(0===E.length)return t("div",a({className:"bg-gray-100 flex items-center justify-center w-full",style:{aspectRatio:"".concat(l[g].width," / ").concat(l[g].height),maxWidth:Y,maxHeight:$}},{children:t("span",a({className:"text-gray-400"},{children:"No ads available"}))}));var te=E[j];return e("div",a({className:"flex flex-col items-start w-full ".concat(m),style:{aspectRatio:"".concat(l[g].width," / ").concat(l[g].height),maxWidth:Y,maxHeight:$}},{children:[(P||C||Z)&&t("div",a({className:"mb-1 px-2 py-0.5 rounded-full font-semibold text-xs border bg-white/70 backdrop-blur-sm shadow-sm pointer-events-none",style:{minWidth:"fit-content",maxWidth:"80%",whiteSpace:"nowrap"}},{children:P?"🔄 Recording...":C?"✅ Recorded":"⚠️ 10% visible"})),t("div",a({className:"relative w-full h-full overflow-hidden flex items-center justify-center",ref:q,style:{width:"100%",height:"100%"}},{children:e("a",a({href:te.targetUrl,target:"_blank",rel:"noopener noreferrer",onClick:function(){return e=te,s(void 0,void 0,void 0,(function(){var t,r;return c(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),t=u(),[4,fetch("".concat(Q,"/api/ad-click"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({adId:e.id,platformId:h,clientSignature:t,metadata:I})})];case 1:return n.sent(),window.open(e.targetUrl,"_blank","noopener,noreferrer"),[3,3];case 2:return r=n.sent(),N&&console.error("Failed to track ad click:",r),[3,3];case 3:return[2]}}))}));var e},style:{display:"block",width:"100%",height:"100%",zIndex:5}},{children:[e("div",a({className:"absolute inset-0 pointer-events-none z-10"},{children:[P&&t("div",{className:"absolute top-0 left-0 right-0 h-2 bg-blue-500 animate-pulse pointer-events-none"}),C&&!P&&t("div",{className:"absolute top-0 left-0 right-0 h-2 bg-green-500 pointer-events-none"})]})),t("img",{src:te.contentUrl,alt:"Advertisement",width:te.width,height:te.height,className:"w-full h-full object-contain cursor-pointer",style:{pointerEvents:"auto",maxWidth:"100%",maxHeight:"100%"}})]}))}))]}))};export{d as AdBanner};
|
|
2
|
-
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../../node_modules/tslib/tslib.es6.mjs","../src/components/AdBanner.tsx"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","\"use client\"\r\n\r\nimport React, { useEffect, useState, useRef, useCallback } from 'react';\r\n\r\ninterface Ad {\r\n id: string;\r\n contentUrl: string;\r\n targetUrl: string;\r\n width: number;\r\n height: number;\r\n duration?: number;\r\n}\r\n\r\ninterface AdBannerProps {\r\n platformId: string;\r\n apiKey: string;\r\n size?: 'leaderboard' | 'medium-rectangle' | 'wide-skyscraper';\r\n className?: string;\r\n libraryDev?: boolean; // for local library/platform dev\r\n platformDev?: boolean; // for platform devs using the library\r\n impressionMetadata?: object;\r\n clickMetadata?: object;\r\n}\r\n\r\nconst sizeMap = {\r\n 'leaderboard': { width: 728, height: 90 },\r\n 'medium-rectangle': { width: 300, height: 250 },\r\n 'wide-skyscraper': { width: 160, height: 600 }\r\n};\r\n\r\nfunction getClientSignature() {\r\n try {\r\n return JSON.stringify({\r\n ua: navigator.userAgent,\r\n lang: navigator.language,\r\n tz: Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n id: localStorage.getItem('thead_sig') || (() => {\r\n const id = Math.random().toString(36).slice(2);\r\n localStorage.setItem('thead_sig', id);\r\n return id;\r\n })()\r\n });\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\nexport const AdBanner = ({\r\n platformId,\r\n apiKey,\r\n size = 'leaderboard',\r\n className = '',\r\n libraryDev = false,\r\n platformDev = false,\r\n impressionMetadata,\r\n clickMetadata,\r\n}: AdBannerProps) => {\r\n // Only allow libraryDev if NODE_ENV is development\r\n const actuallyLibraryDev = libraryDev && process.env.NODE_ENV === 'development';\r\n\r\n const [ads, setAds] = useState<Ad[]>([]);\r\n const [currentAdIndex, setCurrentAdIndex] = useState(0);\r\n const [error, setError] = useState<string | null>(null);\r\n const [impressionRecorded, setImpressionRecorded] = useState(false);\r\n const [isRecordingImpression, setIsRecordingImpression] = useState(false);\r\n const [viewTime, setViewTime] = useState(0);\r\n const [adDiv, setAdDiv] = useState<HTMLDivElement | null>(null);\r\n const adRef = useCallback((node: HTMLDivElement | null) => {\r\n setAdDiv(node);\r\n }, []);\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n const timerRef = useRef<NodeJS.Timeout | null>(null);\r\n const [notVisible, setNotVisible] = useState(false);\r\n\r\n const baseUrl = process.env.NODE_ENV === 'development'\r\n ? 'http://localhost:3001'\r\n : 'https://www.thead-vantage.com';\r\n\r\n const aspectRatio = sizeMap[size].width / sizeMap[size].height;\r\n const maxWidth = sizeMap[size].width;\r\n const maxHeight = sizeMap[size].height;\r\n\r\n useEffect(() => {\r\n const fetchAds = async () => {\r\n try {\r\n const signature = getClientSignature();\r\n const response = await fetch(`${baseUrl}/api/ads`, {\r\n method: 'GET',\r\n headers: {\r\n 'Authorization': `Bearer ${apiKey}`,\r\n 'X-Platform-ID': platformId,\r\n 'X-Client-Signature': signature\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('Failed to fetch ads');\r\n }\r\n\r\n const data = await response.json();\r\n setAds(data.ads);\r\n } catch (err) {\r\n setError(err instanceof Error ? err.message : 'Failed to load ads');\r\n }\r\n };\r\n\r\n fetchAds();\r\n }, [platformId, apiKey, baseUrl]);\r\n\r\n useEffect(() => {\r\n // Set up intersection observer for viewability tracking\r\n if (actuallyLibraryDev) console.log('adDiv:', adDiv);\r\n if (adDiv) {\r\n if (actuallyLibraryDev) console.log('Setting up intersection observer');\r\n observerRef.current = new IntersectionObserver(\r\n (entries) => {\r\n const entry = entries[0];\r\n if (actuallyLibraryDev) console.log('Intersection callback fired:', {\r\n isIntersecting: entry.isIntersecting,\r\n intersectionRatio: entry.intersectionRatio,\r\n boundingClientRect: entry.boundingClientRect,\r\n rootBounds: entry.rootBounds\r\n });\r\n \r\n const isVisible = entry.isIntersecting && entry.intersectionRatio >= 0.1;\r\n setNotVisible(!isVisible);\r\n \r\n if (isVisible && !impressionRecorded) {\r\n // Start timer when ad is visible and impression not recorded\r\n if (!timerRef.current) {\r\n timerRef.current = setInterval(() => {\r\n setViewTime(prev => {\r\n const newTime = prev + 1;\r\n if (actuallyLibraryDev) console.log('View time:', newTime);\r\n return newTime;\r\n });\r\n }, 1000);\r\n }\r\n } else {\r\n // Clear timer when ad is not visible or impression is recorded\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n }\r\n },\r\n { threshold: 0.1 }\r\n );\r\n\r\n observerRef.current.observe(adDiv);\r\n } else {\r\n if (!adDiv && actuallyLibraryDev) {\r\n console.warn('adDiv is not set when trying to observe');\r\n }\r\n }\r\n\r\n return () => {\r\n if (observerRef.current) {\r\n observerRef.current.disconnect();\r\n }\r\n if (timerRef.current) {\r\n clearInterval(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n };\r\n }, [adDiv, actuallyLibraryDev, impressionRecorded]);\r\n\r\n useEffect(() => {\r\n const currentAd = ads[currentAdIndex];\r\n if (!currentAd) return;\r\n\r\n const requiredViewTime = currentAd.duration || 3; // 3 seconds for images, full duration for videos\r\n if (actuallyLibraryDev) console.log('Checking impression conditions:', {\r\n viewTime,\r\n requiredViewTime,\r\n impressionRecorded,\r\n isRecordingImpression,\r\n notVisible\r\n });\r\n\r\n if (viewTime >= requiredViewTime && !impressionRecorded && !isRecordingImpression && !notVisible) {\r\n if (actuallyLibraryDev) console.log('Starting impression recording');\r\n setIsRecordingImpression(true);\r\n trackImpression(currentAd.id);\r\n }\r\n }, [viewTime, currentAdIndex, ads, impressionRecorded, isRecordingImpression, notVisible, actuallyLibraryDev]);\r\n\r\n const trackImpression = async (adId: string) => {\r\n console.log('trackImpression', adId);\r\n // Skip recording in platformDev mode (when developing the platform)\r\n if (platformDev) {\r\n if (actuallyLibraryDev) console.log('Skipping impression in platformDev mode');\r\n setIsRecordingImpression(false);\r\n setImpressionRecorded(true);\r\n return;\r\n }\r\n\r\n try {\r\n if (actuallyLibraryDev) console.log('Sending impression request');\r\n const signature = getClientSignature();\r\n const response = await fetch(`${baseUrl}/api/impressions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n adId,\r\n platformId,\r\n apiKey,\r\n clientSignature: signature,\r\n metadata: {\r\n ...impressionMetadata,\r\n // Add mode information to help the server determine if impression should be payable\r\n _mode: {\r\n libraryDev: actuallyLibraryDev,\r\n platformDev: platformDev,\r\n isProduction: process.env.NODE_ENV === 'production',\r\n isTheadVantage: baseUrl.includes('thead-vantage.com')\r\n }\r\n }\r\n })\r\n });\r\n\r\n console.log('response', response);\r\n if (response.ok) {\r\n if (actuallyLibraryDev) console.log('Impression recorded successfully');\r\n setImpressionRecorded(true);\r\n } else {\r\n const errorText = await response.text();\r\n if (actuallyLibraryDev) console.error('Failed to record impression:', errorText);\r\n setError(`Failed to record impression: ${errorText}`);\r\n }\r\n } catch (err) {\r\n if (actuallyLibraryDev) console.error('Failed to track impression:', err);\r\n setError(`Failed to track impression: ${err instanceof Error ? err.message : 'Unknown error'}`);\r\n } finally {\r\n setIsRecordingImpression(false);\r\n }\r\n };\r\n\r\n const handleAdClick = async (ad: Ad) => {\r\n // Track the click\r\n try {\r\n const signature = getClientSignature();\r\n await fetch(`${baseUrl}/api/ad-click`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n adId: ad.id,\r\n platformId: platformId,\r\n clientSignature: signature,\r\n metadata: clickMetadata\r\n }),\r\n });\r\n window.open(ad.targetUrl, '_blank', 'noopener,noreferrer');\r\n } catch (err) {\r\n if (actuallyLibraryDev) console.error('Failed to track ad click:', err);\r\n }\r\n };\r\n\r\n if (error) {\r\n return <div className=\"text-red-500\">Error: {error}</div>;\r\n }\r\n\r\n if (ads.length === 0) {\r\n return <div\r\n className=\"bg-gray-100 flex items-center justify-center w-full\"\r\n style={{ aspectRatio: `${sizeMap[size].width} / ${sizeMap[size].height}`, maxWidth, maxHeight }}\r\n >\r\n <span className=\"text-gray-400\">No ads available</span>\r\n </div>;\r\n }\r\n\r\n const currentAd = ads[currentAdIndex];\r\n\r\n return (\r\n <div\r\n className={`flex flex-col items-start w-full ${className}`}\r\n style={{ aspectRatio: `${sizeMap[size].width} / ${sizeMap[size].height}`, maxWidth, maxHeight }}\r\n >\r\n {/* Notification badge above the ad, left-aligned */}\r\n {(isRecordingImpression || impressionRecorded || notVisible) && (\r\n <div\r\n className=\"mb-1 px-2 py-0.5 rounded-full font-semibold text-xs border bg-white/70 backdrop-blur-sm shadow-sm pointer-events-none\"\r\n style={{ minWidth: 'fit-content', maxWidth: '80%', whiteSpace: 'nowrap' }}\r\n >\r\n {isRecordingImpression\r\n ? '🔄 Recording...'\r\n : impressionRecorded\r\n ? '✅ Recorded'\r\n : '⚠️ 10% visible'}\r\n </div>\r\n )}\r\n <div\r\n className=\"relative w-full h-full overflow-hidden flex items-center justify-center\"\r\n ref={adRef}\r\n style={{ width: '100%', height: '100%' }}\r\n >\r\n <a\r\n href={currentAd.targetUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n onClick={() => handleAdClick(currentAd)}\r\n style={{ display: 'block', width: '100%', height: '100%', zIndex: 5 }}\r\n >\r\n {/* Overlay OUTSIDE the anchor */}\r\n <div className=\"absolute inset-0 pointer-events-none z-10\">\r\n {isRecordingImpression && (\r\n <div className=\"absolute top-0 left-0 right-0 h-2 bg-blue-500 animate-pulse pointer-events-none\" />\r\n )}\r\n {impressionRecorded && !isRecordingImpression && (\r\n <div className=\"absolute top-0 left-0 right-0 h-2 bg-green-500 pointer-events-none\" />\r\n )}\r\n </div>\r\n <img\r\n src={currentAd.contentUrl}\r\n alt=\"Advertisement\"\r\n width={currentAd.width}\r\n height={currentAd.height}\r\n className=\"w-full h-full object-contain cursor-pointer\"\r\n style={{ pointerEvents: 'auto', maxWidth: '100%', maxHeight: '100%' }}\r\n />\r\n </a>\r\n </div>\r\n </div>\r\n );\r\n};"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","SuppressedError","sizeMap","leaderboard","width","height","getClientSignature","JSON","stringify","ua","navigator","userAgent","lang","language","tz","Intl","DateTimeFormat","resolvedOptions","timeZone","window","innerWidth","innerHeight","id","localStorage","getItem","Math","random","toString","slice","setItem","_a","AdBanner","platformId","apiKey","_b","size","_c","className","_d","libraryDev","_e","platformDev","impressionMetadata","clickMetadata","actuallyLibraryDev","process","env","NODE_ENV","_f","useState","ads","setAds","_g","currentAdIndex","_h","error","setError","_j","impressionRecorded","setImpressionRecorded","_k","isRecordingImpression","setIsRecordingImpression","_l","viewTime","setViewTime","_m","adDiv","setAdDiv","adRef","useCallback","node","observerRef","useRef","timerRef","_o","notVisible","setNotVisible","baseUrl","maxWidth","maxHeight","useEffect","signature","fetch","concat","method","headers","Authorization","response","ok","Error","json","data","err_1","message","console","log","current","IntersectionObserver","entries","entry","isIntersecting","intersectionRatio","boundingClientRect","rootBounds","isVisible","setInterval","prev","newTime","clearInterval","threshold","observe","warn","disconnect","currentAd","requiredViewTime","duration","trackImpression","adId","clientSignature","metadata","_mode","isProduction","isTheadVantage","includes","text","errorText","err_2","_jsxs","children","_jsx","style","aspectRatio","minWidth","whiteSpace","ref","href","targetUrl","target","rel","onClick","ad","open","err_3","display","zIndex","src","contentUrl","alt","pointerEvents"],"mappings":"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"}
|
package/dist/index.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),r=function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)};function n(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))}function o(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(c){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&s[0]?n.return:s[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,s[1])).done)return o;switch(n=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,n=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],n=0}finally{r=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,c])}}}"function"==typeof SuppressedError&&SuppressedError;var i={leaderboard:{width:728,height:90},"medium-rectangle":{width:300,height:250},"wide-skyscraper":{width:160,height:600}};function a(){try{return JSON.stringify({ua:navigator.userAgent,lang:navigator.language,tz:Intl.DateTimeFormat().resolvedOptions().timeZone,width:window.innerWidth,height:window.innerHeight,id:localStorage.getItem("thead_sig")||(e=Math.random().toString(36).slice(2),localStorage.setItem("thead_sig",e),e)})}catch(e){return""}var e}exports.AdBanner=function(s){var c=s.platformId,l=s.apiKey,u=s.size,d=void 0===u?"leaderboard":u,h=s.className,f=void 0===h?"":h,p=s.libraryDev,g=void 0!==p&&p,v=s.platformDev,m=void 0!==v&&v,b=s.impressionMetadata,w=s.clickMetadata,y=g&&"development"===process.env.NODE_ENV,x=t.useState([]),S=x[0],k=x[1],j=t.useState(0),I=j[0];j[1];var N=t.useState(null),E=N[0],O=N[1],R=t.useState(!1),D=R[0],T=R[1],_=t.useState(!1),C=_[0],F=_[1],P=t.useState(0),V=P[0],z=P[1],W=t.useState(null),A=W[0],B=W[1],q=t.useCallback((function(e){B(e)}),[]),H=t.useRef(null),M=t.useRef(null),U=t.useState(!1),J=U[0],G=U[1],K="development"===process.env.NODE_ENV?"http://localhost:3001":"https://www.thead-vantage.com";i[d].width,i[d].height;var X=i[d].width,Z=i[d].height;t.useEffect((function(){n(void 0,void 0,void 0,(function(){var e,t,r,n;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),e=a(),[4,fetch("".concat(K,"/api/ads"),{method:"GET",headers:{Authorization:"Bearer ".concat(l),"X-Platform-ID":c,"X-Client-Signature":e}})];case 1:if(!(t=o.sent()).ok)throw new Error("Failed to fetch ads");return[4,t.json()];case 2:return r=o.sent(),k(r.ads),[3,4];case 3:return n=o.sent(),O(n instanceof Error?n.message:"Failed to load ads"),[3,4];case 4:return[2]}}))}))}),[c,l,K]),t.useEffect((function(){return y&&console.log("adDiv:",A),A?(y&&console.log("Setting up intersection observer"),H.current=new IntersectionObserver((function(e){var t=e[0];y&&console.log("Intersection callback fired:",{isIntersecting:t.isIntersecting,intersectionRatio:t.intersectionRatio,boundingClientRect:t.boundingClientRect,rootBounds:t.rootBounds});var r=t.isIntersecting&&t.intersectionRatio>=.1;G(!r),r&&!D?M.current||(M.current=setInterval((function(){z((function(e){var t=e+1;return y&&console.log("View time:",t),t}))}),1e3)):M.current&&(clearInterval(M.current),M.current=null)}),{threshold:.1}),H.current.observe(A)):!A&&y&&console.warn("adDiv is not set when trying to observe"),function(){H.current&&H.current.disconnect(),M.current&&(clearInterval(M.current),M.current=null)}}),[A,y,D]),t.useEffect((function(){var e=S[I];if(e){var t=e.duration||3;y&&console.log("Checking impression conditions:",{viewTime:V,requiredViewTime:t,impressionRecorded:D,isRecordingImpression:C,notVisible:J}),V>=t&&!D&&!C&&!J&&(y&&console.log("Starting impression recording"),F(!0),L(e.id))}}),[V,I,S,D,C,J,y]);var L=function(e){return n(void 0,void 0,void 0,(function(){var t,n,i,s;return o(this,(function(o){switch(o.label){case 0:if(console.log("trackImpression",e),m)return y&&console.log("Skipping impression in platformDev mode"),F(!1),T(!0),[2];o.label=1;case 1:return o.trys.push([1,6,7,8]),y&&console.log("Sending impression request"),t=a(),[4,fetch("".concat(K,"/api/impressions"),{method:"POST",headers:{Authorization:"Bearer ".concat(l),"Content-Type":"application/json"},body:JSON.stringify({adId:e,platformId:c,apiKey:l,clientSignature:t,metadata:r(r({},b),{_mode:{libraryDev:y,platformDev:m,isProduction:"production"===process.env.NODE_ENV,isTheadVantage:K.includes("thead-vantage.com")}})})})];case 2:return n=o.sent(),console.log("response",n),n.ok?(y&&console.log("Impression recorded successfully"),T(!0),[3,5]):[3,3];case 3:return[4,n.text()];case 4:i=o.sent(),y&&console.error("Failed to record impression:",i),O("Failed to record impression: ".concat(i)),o.label=5;case 5:return[3,8];case 6:return s=o.sent(),y&&console.error("Failed to track impression:",s),O("Failed to track impression: ".concat(s instanceof Error?s.message:"Unknown error")),[3,8];case 7:return F(!1),[7];case 8:return[2]}}))}))};if(E)return e.jsxs("div",r({className:"text-red-500"},{children:["Error: ",E]}));if(0===S.length)return e.jsx("div",r({className:"bg-gray-100 flex items-center justify-center w-full",style:{aspectRatio:"".concat(i[d].width," / ").concat(i[d].height),maxWidth:X,maxHeight:Z}},{children:e.jsx("span",r({className:"text-gray-400"},{children:"No ads available"}))}));var Q=S[I];return e.jsxs("div",r({className:"flex flex-col items-start w-full ".concat(f),style:{aspectRatio:"".concat(i[d].width," / ").concat(i[d].height),maxWidth:X,maxHeight:Z}},{children:[(C||D||J)&&e.jsx("div",r({className:"mb-1 px-2 py-0.5 rounded-full font-semibold text-xs border bg-white/70 backdrop-blur-sm shadow-sm pointer-events-none",style:{minWidth:"fit-content",maxWidth:"80%",whiteSpace:"nowrap"}},{children:C?"🔄 Recording...":D?"✅ Recorded":"⚠️ 10% visible"})),e.jsx("div",r({className:"relative w-full h-full overflow-hidden flex items-center justify-center",ref:q,style:{width:"100%",height:"100%"}},{children:e.jsxs("a",r({href:Q.targetUrl,target:"_blank",rel:"noopener noreferrer",onClick:function(){return e=Q,n(void 0,void 0,void 0,(function(){var t,r;return o(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),t=a(),[4,fetch("".concat(K,"/api/ad-click"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({adId:e.id,platformId:c,clientSignature:t,metadata:w})})];case 1:return n.sent(),window.open(e.targetUrl,"_blank","noopener,noreferrer"),[3,3];case 2:return r=n.sent(),y&&console.error("Failed to track ad click:",r),[3,3];case 3:return[2]}}))}));var e},style:{display:"block",width:"100%",height:"100%",zIndex:5}},{children:[e.jsxs("div",r({className:"absolute inset-0 pointer-events-none z-10"},{children:[C&&e.jsx("div",{className:"absolute top-0 left-0 right-0 h-2 bg-blue-500 animate-pulse pointer-events-none"}),D&&!C&&e.jsx("div",{className:"absolute top-0 left-0 right-0 h-2 bg-green-500 pointer-events-none"})]})),e.jsx("img",{src:Q.contentUrl,alt:"Advertisement",width:Q.width,height:Q.height,className:"w-full h-full object-contain cursor-pointer",style:{pointerEvents:"auto",maxWidth:"100%",maxHeight:"100%"}})]}))}))]}))};
|
|
2
|
-
//# sourceMappingURL=index.js.map
|