@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 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["VIEWABLE_IMPRESSION"] = "VIEWABLE_IMPRESSION";
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
- VIEWABLE_IMPRESSION = "VIEWABLE_IMPRESSION",
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
- impressions: number;
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
- impressionSent?: boolean;
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["VIEWABLE_IMPRESSION"] = "VIEWABLE_IMPRESSION";
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
  }
@@ -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["VIEWABLE_IMPRESSION"] = "VIEWABLE_IMPRESSION";
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adstage/web-sdk",
3
- "version": "2.4.0",
3
+ "version": "2.4.1",
4
4
  "description": "AdStage Web SDK - Production-ready marketing platform SDK with React Provider support for seamless integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs.js",
@@ -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
+ }
@@ -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
- VIEWABLE_IMPRESSION = 'VIEWABLE_IMPRESSION',
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
- impressions: number;
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
- impressionSent?: boolean;
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
- impressions: number;
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
- impressions: number;
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