@adstage/web-sdk 2.4.0 → 2.4.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/dist/index.cjs.js +3 -8
- package/dist/index.d.ts +3 -10
- package/dist/index.esm.js +3 -8
- package/dist/index.standalone.js +3 -8
- package/package.json +1 -1
- package/src/react/AdStageProvider.tsx +117 -0
- package/src/react/index.ts +11 -0
- package/src/renderers/base-renderer.ts +2 -0
- package/src/types/advertisement.ts +4 -17
- package/src/types/api.ts +1 -5
package/dist/index.cjs.js
CHANGED
|
@@ -19,15 +19,8 @@ var Platform;
|
|
|
19
19
|
// 광고 이벤트 타입
|
|
20
20
|
var AdEventType;
|
|
21
21
|
(function (AdEventType) {
|
|
22
|
-
AdEventType["IMPRESSION"] = "IMPRESSION";
|
|
23
|
-
AdEventType["CLICK"] = "CLICK";
|
|
24
|
-
AdEventType["HOVER"] = "HOVER";
|
|
25
22
|
AdEventType["VIEWABLE"] = "VIEWABLE";
|
|
26
|
-
AdEventType["
|
|
27
|
-
AdEventType["COMPLETED"] = "COMPLETED";
|
|
28
|
-
AdEventType["VIDEO_START"] = "VIDEO_START";
|
|
29
|
-
AdEventType["VIDEO_COMPLETE"] = "VIDEO_COMPLETE";
|
|
30
|
-
AdEventType["ERROR"] = "ERROR";
|
|
23
|
+
AdEventType["CLICK"] = "CLICK";
|
|
31
24
|
})(AdEventType || (AdEventType = {}));
|
|
32
25
|
// 디바이스 타입
|
|
33
26
|
var DeviceType;
|
|
@@ -1085,6 +1078,7 @@ class BaseAdRenderer {
|
|
|
1085
1078
|
display: 'block',
|
|
1086
1079
|
'max-width': '100%',
|
|
1087
1080
|
height: 'auto',
|
|
1081
|
+
'object-position': 'center', // 🎯 이미지 항상 중앙 정렬
|
|
1088
1082
|
};
|
|
1089
1083
|
// 사용자가 컨테이너 크기를 지정한 경우에만 크기 제한
|
|
1090
1084
|
const parsedWidth = this.parseSizeValue(slot?.width);
|
|
@@ -1093,6 +1087,7 @@ class BaseAdRenderer {
|
|
|
1093
1087
|
styles.width = '100%';
|
|
1094
1088
|
styles.height = '100%';
|
|
1095
1089
|
styles['object-fit'] = 'cover';
|
|
1090
|
+
styles['object-position'] = 'center'; // 🎯 크기 조정 시에도 중앙 정렬
|
|
1096
1091
|
}
|
|
1097
1092
|
return styles;
|
|
1098
1093
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -68,15 +68,8 @@ declare enum Platform {
|
|
|
68
68
|
MOBILE = "MOBILE"
|
|
69
69
|
}
|
|
70
70
|
declare enum AdEventType {
|
|
71
|
-
IMPRESSION = "IMPRESSION",
|
|
72
|
-
CLICK = "CLICK",
|
|
73
|
-
HOVER = "HOVER",
|
|
74
71
|
VIEWABLE = "VIEWABLE",
|
|
75
|
-
|
|
76
|
-
COMPLETED = "COMPLETED",
|
|
77
|
-
VIDEO_START = "VIDEO_START",
|
|
78
|
-
VIDEO_COMPLETE = "VIDEO_COMPLETE",
|
|
79
|
-
ERROR = "ERROR"
|
|
72
|
+
CLICK = "CLICK"
|
|
80
73
|
}
|
|
81
74
|
declare enum DeviceType {
|
|
82
75
|
DESKTOP = "DESKTOP",
|
|
@@ -123,7 +116,7 @@ interface ViewabilityMetrics {
|
|
|
123
116
|
isViewable: boolean;
|
|
124
117
|
visibilityRatio: number;
|
|
125
118
|
duration: number;
|
|
126
|
-
|
|
119
|
+
viewables: number;
|
|
127
120
|
attentionTime: number;
|
|
128
121
|
scrollDepth: number;
|
|
129
122
|
completionRate: number;
|
|
@@ -199,7 +192,7 @@ interface AdSlot {
|
|
|
199
192
|
config?: AdSlotConfig;
|
|
200
193
|
advertisement?: Advertisement;
|
|
201
194
|
isViewable?: boolean;
|
|
202
|
-
|
|
195
|
+
viewableSent?: boolean;
|
|
203
196
|
loadTime?: number;
|
|
204
197
|
renderTime?: number;
|
|
205
198
|
events?: AdEvent[];
|
package/dist/index.esm.js
CHANGED
|
@@ -17,15 +17,8 @@ var Platform;
|
|
|
17
17
|
// 광고 이벤트 타입
|
|
18
18
|
var AdEventType;
|
|
19
19
|
(function (AdEventType) {
|
|
20
|
-
AdEventType["IMPRESSION"] = "IMPRESSION";
|
|
21
|
-
AdEventType["CLICK"] = "CLICK";
|
|
22
|
-
AdEventType["HOVER"] = "HOVER";
|
|
23
20
|
AdEventType["VIEWABLE"] = "VIEWABLE";
|
|
24
|
-
AdEventType["
|
|
25
|
-
AdEventType["COMPLETED"] = "COMPLETED";
|
|
26
|
-
AdEventType["VIDEO_START"] = "VIDEO_START";
|
|
27
|
-
AdEventType["VIDEO_COMPLETE"] = "VIDEO_COMPLETE";
|
|
28
|
-
AdEventType["ERROR"] = "ERROR";
|
|
21
|
+
AdEventType["CLICK"] = "CLICK";
|
|
29
22
|
})(AdEventType || (AdEventType = {}));
|
|
30
23
|
// 디바이스 타입
|
|
31
24
|
var DeviceType;
|
|
@@ -1083,6 +1076,7 @@ class BaseAdRenderer {
|
|
|
1083
1076
|
display: 'block',
|
|
1084
1077
|
'max-width': '100%',
|
|
1085
1078
|
height: 'auto',
|
|
1079
|
+
'object-position': 'center', // 🎯 이미지 항상 중앙 정렬
|
|
1086
1080
|
};
|
|
1087
1081
|
// 사용자가 컨테이너 크기를 지정한 경우에만 크기 제한
|
|
1088
1082
|
const parsedWidth = this.parseSizeValue(slot?.width);
|
|
@@ -1091,6 +1085,7 @@ class BaseAdRenderer {
|
|
|
1091
1085
|
styles.width = '100%';
|
|
1092
1086
|
styles.height = '100%';
|
|
1093
1087
|
styles['object-fit'] = 'cover';
|
|
1088
|
+
styles['object-position'] = 'center'; // 🎯 크기 조정 시에도 중앙 정렬
|
|
1094
1089
|
}
|
|
1095
1090
|
return styles;
|
|
1096
1091
|
}
|
package/dist/index.standalone.js
CHANGED
|
@@ -17,15 +17,8 @@ var Platform;
|
|
|
17
17
|
// 광고 이벤트 타입
|
|
18
18
|
var AdEventType;
|
|
19
19
|
(function (AdEventType) {
|
|
20
|
-
AdEventType["IMPRESSION"] = "IMPRESSION";
|
|
21
|
-
AdEventType["CLICK"] = "CLICK";
|
|
22
|
-
AdEventType["HOVER"] = "HOVER";
|
|
23
20
|
AdEventType["VIEWABLE"] = "VIEWABLE";
|
|
24
|
-
AdEventType["
|
|
25
|
-
AdEventType["COMPLETED"] = "COMPLETED";
|
|
26
|
-
AdEventType["VIDEO_START"] = "VIDEO_START";
|
|
27
|
-
AdEventType["VIDEO_COMPLETE"] = "VIDEO_COMPLETE";
|
|
28
|
-
AdEventType["ERROR"] = "ERROR";
|
|
21
|
+
AdEventType["CLICK"] = "CLICK";
|
|
29
22
|
})(AdEventType || (AdEventType = {}));
|
|
30
23
|
// 디바이스 타입
|
|
31
24
|
var DeviceType;
|
|
@@ -1083,6 +1076,7 @@ class BaseAdRenderer {
|
|
|
1083
1076
|
display: 'block',
|
|
1084
1077
|
'max-width': '100%',
|
|
1085
1078
|
height: 'auto',
|
|
1079
|
+
'object-position': 'center', // 🎯 이미지 항상 중앙 정렬
|
|
1086
1080
|
};
|
|
1087
1081
|
// 사용자가 컨테이너 크기를 지정한 경우에만 크기 제한
|
|
1088
1082
|
const parsedWidth = this.parseSizeValue(slot?.width);
|
|
@@ -1091,6 +1085,7 @@ class BaseAdRenderer {
|
|
|
1091
1085
|
styles.width = '100%';
|
|
1092
1086
|
styles.height = '100%';
|
|
1093
1087
|
styles['object-fit'] = 'cover';
|
|
1088
|
+
styles['object-position'] = 'center'; // 🎯 크기 조정 시에도 중앙 정렬
|
|
1094
1089
|
}
|
|
1095
1090
|
return styles;
|
|
1096
1091
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdStage SDK - React Provider
|
|
3
|
+
* React 애플리케이션에서 AdStage SDK를 쉽게 사용할 수 있도록 하는 Provider 컴포넌트
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { createContext, useContext, useEffect, useState, ReactNode } from 'react';
|
|
7
|
+
import AdStage from '../core/AdStage';
|
|
8
|
+
import { AdStageConfig } from '../types/config';
|
|
9
|
+
|
|
10
|
+
interface AdStageContextType {
|
|
11
|
+
isInitialized: boolean;
|
|
12
|
+
config: AdStageConfig | null;
|
|
13
|
+
initialize: (config: AdStageConfig) => void;
|
|
14
|
+
reset: () => void;
|
|
15
|
+
error: string | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const AdStageContext = createContext<AdStageContextType | null>(null);
|
|
19
|
+
|
|
20
|
+
interface AdStageProviderProps {
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
/**
|
|
23
|
+
* 자동 초기화를 위한 설정 (선택사항)
|
|
24
|
+
* 제공되면 Provider 마운트 시 자동으로 초기화됩니다.
|
|
25
|
+
*/
|
|
26
|
+
config?: AdStageConfig;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function AdStageProvider({ children, config }: AdStageProviderProps) {
|
|
30
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
31
|
+
const [currentConfig, setCurrentConfig] = useState<AdStageConfig | null>(null);
|
|
32
|
+
const [error, setError] = useState<string | null>(null);
|
|
33
|
+
|
|
34
|
+
const initialize = (newConfig: AdStageConfig) => {
|
|
35
|
+
try {
|
|
36
|
+
setError(null);
|
|
37
|
+
|
|
38
|
+
// 기존 인스턴스가 있으면 리셋
|
|
39
|
+
if (isInitialized) {
|
|
40
|
+
AdStage.reset();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
AdStage.init(newConfig);
|
|
44
|
+
|
|
45
|
+
setCurrentConfig(newConfig);
|
|
46
|
+
setIsInitialized(true);
|
|
47
|
+
|
|
48
|
+
if (newConfig.debug) {
|
|
49
|
+
console.log('✅ AdStage SDK initialized successfully via React Provider');
|
|
50
|
+
}
|
|
51
|
+
} catch (err) {
|
|
52
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
53
|
+
setError(errorMessage);
|
|
54
|
+
console.error('❌ AdStage SDK initialization failed:', err);
|
|
55
|
+
setIsInitialized(false);
|
|
56
|
+
setCurrentConfig(null);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const reset = () => {
|
|
61
|
+
try {
|
|
62
|
+
AdStage.reset();
|
|
63
|
+
setIsInitialized(false);
|
|
64
|
+
setCurrentConfig(null);
|
|
65
|
+
setError(null);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
console.error('❌ AdStage SDK reset failed:', err);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// 자동 초기화
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (config && !isInitialized) {
|
|
74
|
+
initialize(config);
|
|
75
|
+
}
|
|
76
|
+
}, [config, isInitialized]);
|
|
77
|
+
|
|
78
|
+
const contextValue: AdStageContextType = {
|
|
79
|
+
isInitialized,
|
|
80
|
+
config: currentConfig,
|
|
81
|
+
initialize,
|
|
82
|
+
reset,
|
|
83
|
+
error
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<AdStageContext.Provider value={contextValue}>
|
|
88
|
+
{children}
|
|
89
|
+
</AdStageContext.Provider>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* AdStage Context Hook
|
|
95
|
+
* AdStageProvider 내에서 SDK 상태에 접근할 수 있습니다.
|
|
96
|
+
*/
|
|
97
|
+
export function useAdStage(): AdStageContextType {
|
|
98
|
+
const context = useContext(AdStageContext);
|
|
99
|
+
if (!context) {
|
|
100
|
+
throw new Error('useAdStage must be used within an AdStageProvider');
|
|
101
|
+
}
|
|
102
|
+
return context;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* AdStage SDK Hook
|
|
107
|
+
* 초기화된 AdStage 인스턴스에 직접 접근할 수 있습니다.
|
|
108
|
+
*/
|
|
109
|
+
export function useAdStageSDK() {
|
|
110
|
+
const { isInitialized } = useAdStage();
|
|
111
|
+
|
|
112
|
+
if (!isInitialized) {
|
|
113
|
+
throw new Error('AdStage SDK is not initialized. Please call initialize() first or provide config to AdStageProvider.');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return AdStage;
|
|
117
|
+
}
|
package/src/react/index.ts
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdStage Web SDK - React Integration
|
|
3
|
+
* React 애플리케이션을 위한 컴포넌트와 훅들
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { AdStageProvider, useAdStage, useAdStageSDK } from './AdStageProvider';
|
|
7
|
+
|
|
8
|
+
// 타입들도 재export
|
|
9
|
+
export type { AdStageConfig, ModuleName, BaseModule } from '../types/config';
|
|
10
|
+
export type { AdOptions } from '../modules/ads/AdsModule';
|
|
11
|
+
export type { AdType, AdEventType, Advertisement, AdSlot } from '../types/advertisement';
|
|
@@ -110,6 +110,7 @@ export abstract class BaseAdRenderer implements AdRenderer {
|
|
|
110
110
|
display: 'block',
|
|
111
111
|
'max-width': '100%',
|
|
112
112
|
height: 'auto',
|
|
113
|
+
'object-position': 'center', // 🎯 이미지 항상 중앙 정렬
|
|
113
114
|
};
|
|
114
115
|
|
|
115
116
|
// 사용자가 컨테이너 크기를 지정한 경우에만 크기 제한
|
|
@@ -120,6 +121,7 @@ export abstract class BaseAdRenderer implements AdRenderer {
|
|
|
120
121
|
styles.width = '100%';
|
|
121
122
|
styles.height = '100%';
|
|
122
123
|
styles['object-fit'] = 'cover';
|
|
124
|
+
styles['object-position'] = 'center'; // 🎯 크기 조정 시에도 중앙 정렬
|
|
123
125
|
}
|
|
124
126
|
|
|
125
127
|
return styles;
|
|
@@ -16,15 +16,8 @@ export enum Platform {
|
|
|
16
16
|
|
|
17
17
|
// 광고 이벤트 타입
|
|
18
18
|
export enum AdEventType {
|
|
19
|
-
IMPRESSION = 'IMPRESSION',
|
|
20
|
-
CLICK = 'CLICK',
|
|
21
|
-
HOVER = 'HOVER',
|
|
22
19
|
VIEWABLE = 'VIEWABLE',
|
|
23
|
-
|
|
24
|
-
COMPLETED = 'COMPLETED',
|
|
25
|
-
VIDEO_START = 'VIDEO_START',
|
|
26
|
-
VIDEO_COMPLETE = 'VIDEO_COMPLETE',
|
|
27
|
-
ERROR = 'ERROR',
|
|
20
|
+
CLICK = 'CLICK',
|
|
28
21
|
}
|
|
29
22
|
|
|
30
23
|
// 디바이스 타입
|
|
@@ -79,7 +72,7 @@ export interface ViewabilityMetrics {
|
|
|
79
72
|
isViewable: boolean;
|
|
80
73
|
visibilityRatio: number;
|
|
81
74
|
duration: number;
|
|
82
|
-
|
|
75
|
+
viewables: number;
|
|
83
76
|
attentionTime: number;
|
|
84
77
|
scrollDepth: number;
|
|
85
78
|
completionRate: number;
|
|
@@ -171,7 +164,7 @@ export interface AdSlot {
|
|
|
171
164
|
config?: AdSlotConfig;
|
|
172
165
|
advertisement?: Advertisement;
|
|
173
166
|
isViewable?: boolean;
|
|
174
|
-
|
|
167
|
+
viewableSent?: boolean;
|
|
175
168
|
loadTime?: number;
|
|
176
169
|
renderTime?: number;
|
|
177
170
|
events?: AdEvent[];
|
|
@@ -185,13 +178,7 @@ export interface AdSlot {
|
|
|
185
178
|
|
|
186
179
|
// 광고 성과 지표
|
|
187
180
|
export interface AdAnalytics {
|
|
188
|
-
|
|
181
|
+
viewables: number;
|
|
189
182
|
clicks: number;
|
|
190
|
-
hovers: number;
|
|
191
|
-
viewableImpressions: number;
|
|
192
|
-
errors: number;
|
|
193
183
|
ctr: number; // Click Through Rate
|
|
194
|
-
viewabilityRate: number;
|
|
195
|
-
averageViewTime: number;
|
|
196
|
-
totalViewTime: number;
|
|
197
184
|
}
|
package/src/types/api.ts
CHANGED
|
@@ -76,13 +76,9 @@ export interface AnalyticsRequest {
|
|
|
76
76
|
|
|
77
77
|
// 광고 분석 응답
|
|
78
78
|
export interface AnalyticsResponse {
|
|
79
|
-
|
|
79
|
+
viewables: number;
|
|
80
80
|
clicks: number;
|
|
81
|
-
hovers: number;
|
|
82
|
-
viewableImpressions: number;
|
|
83
|
-
errors: number;
|
|
84
81
|
ctr: number;
|
|
85
|
-
viewabilityRate: number;
|
|
86
82
|
breakdown?: Record<string, AdAnalytics>;
|
|
87
83
|
}
|
|
88
84
|
|