@hayanmind/monetai-react-native 0.4.1-beta.0 → 1.0.0-beta.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/android/src/main/java/com/hayanmind/monetaireactnative/MonetaiReactNativeModule.kt +14 -0
- package/ios/MonetaiReactNative.mm +3 -4
- package/ios/MonetaiReactNative.swift +10 -3
- package/lib/commonjs/ApiRequest.js +63 -3
- package/lib/commonjs/ApiRequest.js.map +1 -1
- package/lib/commonjs/MonetaiSDK.js +57 -0
- package/lib/commonjs/MonetaiSDK.js.map +1 -1
- package/lib/commonjs/lib.js +2 -2
- package/lib/module/ApiRequest.js +59 -2
- package/lib/module/ApiRequest.js.map +1 -1
- package/lib/module/MonetaiSDK.js +58 -1
- package/lib/module/MonetaiSDK.js.map +1 -1
- package/lib/module/lib.js +2 -2
- package/lib/typescript/commonjs/src/ApiRequest.d.ts +23 -1
- package/lib/typescript/commonjs/src/ApiRequest.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/MonetaiSDK.d.ts +14 -1
- package/lib/typescript/commonjs/src/MonetaiSDK.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +1 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types.d.ts +11 -0
- package/lib/typescript/commonjs/src/types.d.ts.map +1 -1
- package/lib/typescript/module/src/ApiRequest.d.ts +23 -1
- package/lib/typescript/module/src/ApiRequest.d.ts.map +1 -1
- package/lib/typescript/module/src/MonetaiSDK.d.ts +14 -1
- package/lib/typescript/module/src/MonetaiSDK.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +1 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/types.d.ts +11 -0
- package/lib/typescript/module/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ApiRequest.ts +87 -1
- package/src/MonetaiSDK.ts +89 -11
- package/src/index.tsx +1 -0
- package/src/types.ts +13 -0
|
@@ -412,6 +412,20 @@ class MonetaiReactNativeModule(reactContext: ReactApplicationContext) :
|
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
414
|
|
|
415
|
+
@ReactMethod
|
|
416
|
+
fun getAppVersion(promise: Promise) {
|
|
417
|
+
try {
|
|
418
|
+
val packageInfo = reactApplicationContext.packageManager
|
|
419
|
+
.getPackageInfo(reactApplicationContext.packageName, 0)
|
|
420
|
+
val versionName = packageInfo.versionName
|
|
421
|
+
Log.d(TAG, "getAppVersion: ${versionName ?: "null"}")
|
|
422
|
+
promise.resolve(versionName)
|
|
423
|
+
} catch (e: Exception) {
|
|
424
|
+
Log.e(TAG, "getAppVersion 실패: ${e.message}")
|
|
425
|
+
promise.resolve(null)
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
415
429
|
companion object {
|
|
416
430
|
const val NAME = "MonetaiReactNative"
|
|
417
431
|
}
|
|
@@ -2,10 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
@interface RCT_EXTERN_MODULE(MonetaiReactNative, NSObject)
|
|
4
4
|
|
|
5
|
-
RCT_EXTERN_METHOD(multiply:(float)a withB:(float)b
|
|
6
|
-
withResolver:(RCTPromiseResolveBlock)resolve
|
|
7
|
-
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
8
|
-
|
|
9
5
|
RCT_EXTERN_METHOD(startObserving:(BOOL)useStoreKit2
|
|
10
6
|
withResolver:(RCTPromiseResolveBlock)resolve
|
|
11
7
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
@@ -30,6 +26,9 @@ RCT_EXTERN_METHOD(sendReceipt:(RCTPromiseResolveBlock)resolve
|
|
|
30
26
|
RCT_EXTERN_METHOD(reset:(RCTPromiseResolveBlock)resolve
|
|
31
27
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
32
28
|
|
|
29
|
+
RCT_EXTERN_METHOD(getAppVersion:(RCTPromiseResolveBlock)resolve
|
|
30
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
31
|
+
|
|
33
32
|
+ (BOOL)requiresMainQueueSetup
|
|
34
33
|
{
|
|
35
34
|
return NO;
|
|
@@ -316,19 +316,26 @@ class MonetaiReactNative: NSObject {
|
|
|
316
316
|
kSecClass as String: kSecClassGenericPassword,
|
|
317
317
|
kSecAttrAccount as String: "MonetaiAppAccountToken"
|
|
318
318
|
]
|
|
319
|
-
|
|
319
|
+
|
|
320
320
|
let sdkKeyQuery: [String: Any] = [
|
|
321
321
|
kSecClass as String: kSecClassGenericPassword,
|
|
322
322
|
kSecAttrAccount as String: "MonetaiSdkKey"
|
|
323
323
|
]
|
|
324
|
-
|
|
324
|
+
|
|
325
325
|
SecItemDelete(tokenQuery as CFDictionary)
|
|
326
326
|
SecItemDelete(sdkKeyQuery as CFDictionary)
|
|
327
|
-
|
|
327
|
+
|
|
328
328
|
print("[Monetai][Debug] userId와 sdkKey가 초기화되었습니다")
|
|
329
329
|
resolve(nil)
|
|
330
330
|
}
|
|
331
331
|
|
|
332
|
+
@objc(getAppVersion:withRejecter:)
|
|
333
|
+
func getAppVersion(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
|
|
334
|
+
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
|
|
335
|
+
print("[Monetai][Debug] getAppVersion: \(appVersion ?? "nil")")
|
|
336
|
+
resolve(appVersion)
|
|
337
|
+
}
|
|
338
|
+
|
|
332
339
|
@objc
|
|
333
340
|
static func requiresMainQueueSetup() -> Bool {
|
|
334
341
|
return false
|
|
@@ -3,14 +3,29 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.predict = exports.initialize = exports.getAppUserDiscount = exports.createEvent = exports.createAppUserDiscount = void 0;
|
|
6
|
+
exports.setAppVersionHeader = exports.predict = exports.initialize = exports.getPriceDecision = exports.getAppUserDiscount = exports.createViewProductItemEvent = exports.createEvent = exports.createAppUserDiscount = void 0;
|
|
7
7
|
var _axios = _interopRequireDefault(require("axios"));
|
|
8
8
|
var _lib = require("./lib.js");
|
|
9
9
|
var _reactNative = require("react-native");
|
|
10
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
const axiosInstance = _axios.default.create({
|
|
12
|
-
baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk'
|
|
12
|
+
baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk',
|
|
13
|
+
// 필요에 따라 베이스 URL 설정
|
|
14
|
+
headers: {
|
|
15
|
+
'X-SDK-Platform': 'react_native',
|
|
16
|
+
'X-SDK-Version': (0, _lib.getSDKVersion)(),
|
|
17
|
+
'X-Device-OS': _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' : _reactNative.Platform.OS
|
|
18
|
+
}
|
|
13
19
|
});
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* X-App-Version 헤더를 설정합니다.
|
|
23
|
+
* SDK 초기화 시점에 호출되어야 합니다.
|
|
24
|
+
*/
|
|
25
|
+
const setAppVersionHeader = version => {
|
|
26
|
+
axiosInstance.defaults.headers.common['X-App-Version'] = version;
|
|
27
|
+
};
|
|
28
|
+
exports.setAppVersionHeader = setAppVersionHeader;
|
|
14
29
|
const initialize = async ({
|
|
15
30
|
sdkKey,
|
|
16
31
|
userId
|
|
@@ -24,7 +39,7 @@ const initialize = async ({
|
|
|
24
39
|
const abTestGroupResponse = await axiosInstance.post('/ab-test', {
|
|
25
40
|
sdkKey,
|
|
26
41
|
userId,
|
|
27
|
-
platform: _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' :
|
|
42
|
+
platform: _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' : _reactNative.Platform.OS
|
|
28
43
|
});
|
|
29
44
|
return {
|
|
30
45
|
organizationId: response.data.organization_id,
|
|
@@ -61,6 +76,29 @@ const createEvent = async ({
|
|
|
61
76
|
}
|
|
62
77
|
};
|
|
63
78
|
exports.createEvent = createEvent;
|
|
79
|
+
const createViewProductItemEvent = async ({
|
|
80
|
+
sdkKey,
|
|
81
|
+
userId,
|
|
82
|
+
params,
|
|
83
|
+
createdAt
|
|
84
|
+
}) => {
|
|
85
|
+
try {
|
|
86
|
+
await axiosInstance.post('/events/view-product-item', {
|
|
87
|
+
sdkKey,
|
|
88
|
+
userId,
|
|
89
|
+
productId: params.productId,
|
|
90
|
+
price: params.price,
|
|
91
|
+
regularPrice: params.regularPrice,
|
|
92
|
+
currencyCode: params.currencyCode,
|
|
93
|
+
month: params.month,
|
|
94
|
+
createdAt: createdAt ?? new Date(),
|
|
95
|
+
platform: _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' : _reactNative.Platform.OS
|
|
96
|
+
});
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error('Failed to log view product item event:', error.message);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
exports.createViewProductItemEvent = createViewProductItemEvent;
|
|
64
102
|
const predict = async ({
|
|
65
103
|
userId,
|
|
66
104
|
sdkKey
|
|
@@ -114,5 +152,27 @@ const getAppUserDiscount = async ({
|
|
|
114
152
|
throw new Error(error.response?.data?.message || 'Failed to get discount info');
|
|
115
153
|
}
|
|
116
154
|
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
158
|
+
* API POST /dynamic-pricing/decision 엔드포인트를 호출합니다.
|
|
159
|
+
*/
|
|
117
160
|
exports.getAppUserDiscount = getAppUserDiscount;
|
|
161
|
+
const getPriceDecision = async ({
|
|
162
|
+
sdkKey,
|
|
163
|
+
userId
|
|
164
|
+
}) => {
|
|
165
|
+
try {
|
|
166
|
+
const response = await axiosInstance.post('/dynamic-pricing/decision', {
|
|
167
|
+
sdkKey,
|
|
168
|
+
userId,
|
|
169
|
+
platform: _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' : _reactNative.Platform.OS
|
|
170
|
+
});
|
|
171
|
+
return response.data;
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.error('Failed to get price decision:', error.message);
|
|
174
|
+
throw new Error(error.response?.data?.message || 'Failed to get price decision');
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
exports.getPriceDecision = getPriceDecision;
|
|
118
178
|
//# sourceMappingURL=ApiRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_axios","_interopRequireDefault","require","_lib","_reactNative","e","__esModule","default","axiosInstance","axios","create","baseURL","
|
|
1
|
+
{"version":3,"names":["_axios","_interopRequireDefault","require","_lib","_reactNative","e","__esModule","default","axiosInstance","axios","create","baseURL","headers","getSDKVersion","Platform","OS","setAppVersionHeader","version","defaults","common","exports","initialize","sdkKey","userId","response","post","platform","abTestGroupResponse","organizationId","data","organization_id","group","campaign","error","console","message","Error","createEvent","eventName","params","createdAt","Date","createViewProductItemEvent","productId","price","regularPrice","currencyCode","month","predict","createAppUserDiscount","discountInfo","appUserId","startedAt","endedAt","discount","getAppUserDiscount","get","getPriceDecision"],"sourceRoot":"../../src","sources":["ApiRequest.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -67,6 +67,16 @@ class MonetaiSDK {
|
|
|
67
67
|
// userId 설정
|
|
68
68
|
await MonetaiReactNative.setUserId(userId);
|
|
69
69
|
|
|
70
|
+
// 앱 버전을 가져와서 API 헤더에 설정
|
|
71
|
+
try {
|
|
72
|
+
const appVersion = await MonetaiReactNative.getAppVersion();
|
|
73
|
+
if (appVersion) {
|
|
74
|
+
(0, _ApiRequest.setAppVersionHeader)(appVersion);
|
|
75
|
+
}
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.warn('[MonetaiSDK] Failed to get app version:', error);
|
|
78
|
+
}
|
|
79
|
+
|
|
70
80
|
// 트랜잭션 관찰 시작
|
|
71
81
|
await MonetaiReactNative.startObserving(useStoreKit2);
|
|
72
82
|
|
|
@@ -134,6 +144,37 @@ class MonetaiSDK {
|
|
|
134
144
|
console.log('[MonetaiSDK] Logged event', eventName, params);
|
|
135
145
|
}
|
|
136
146
|
|
|
147
|
+
/**
|
|
148
|
+
* 사용자가 구매 아이템을 조회했을 때 호출하는 이벤트입니다.
|
|
149
|
+
* @param params ViewProductItemParams
|
|
150
|
+
*/
|
|
151
|
+
async logViewProductItem(params) {
|
|
152
|
+
const sdkKey = await this.getSdkKey();
|
|
153
|
+
const userId = await this.getUserId();
|
|
154
|
+
if (!sdkKey || !userId) {
|
|
155
|
+
// SDK가 초기화되지 않았거나 키가 없는 경우, 일반 이벤트 큐에 저장해두었다가
|
|
156
|
+
// 나중에 initialize 시점에 일반 logEvent로 처리하거나,
|
|
157
|
+
// 별도의 큐 처리가 필요할 수 있습니다.
|
|
158
|
+
// 현재 구조상 pendingEvents는 logEvent 형태(이벤트명+파라미터)를 저장하므로,
|
|
159
|
+
// 여기서도 'ma_view_product_item' 이름으로 저장해두면
|
|
160
|
+
// 추후 initialize()에서 processPendingEvents 할 때
|
|
161
|
+
// createEvent를 호출하게 되는데, 이때 'ma_' prefix 때문에 서버에서 거절될 수 있습니다.
|
|
162
|
+
//
|
|
163
|
+
// 해결책: pendingEvents 처리 로직도 'ma_' 여부를 체크해서 분기하거나,
|
|
164
|
+
// 단순하게는 여기서도 'ma_' 이벤트를 큐에 넣되,
|
|
165
|
+
// initialize()의 pending 처리 로직을 수정해야 합니다.
|
|
166
|
+
// 일단은 콘솔 경고를 남기고 리턴하거나, 큐에 넣습니다.
|
|
167
|
+
console.warn('[MonetaiSDK] SDK not initialized. ViewProductItem event will be ignored or queued.');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
await ApiRequest.createViewProductItemEvent({
|
|
171
|
+
sdkKey,
|
|
172
|
+
userId,
|
|
173
|
+
params,
|
|
174
|
+
createdAt: new Date()
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
137
178
|
// Non-Purchaser 예측
|
|
138
179
|
async predict() {
|
|
139
180
|
const sdkKey = await this.getSdkKey();
|
|
@@ -165,6 +206,22 @@ class MonetaiSDK {
|
|
|
165
206
|
}
|
|
166
207
|
return result;
|
|
167
208
|
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
212
|
+
* @returns productId와 할인율
|
|
213
|
+
*/
|
|
214
|
+
async getPriceDecision() {
|
|
215
|
+
const sdkKey = await this.getSdkKey();
|
|
216
|
+
const userId = await this.getUserId();
|
|
217
|
+
if (!sdkKey || !userId) {
|
|
218
|
+
throw new Error('MonetaiSDK is not initialized. Call initialize() first.');
|
|
219
|
+
}
|
|
220
|
+
return await ApiRequest.getPriceDecision({
|
|
221
|
+
sdkKey,
|
|
222
|
+
userId
|
|
223
|
+
});
|
|
224
|
+
}
|
|
168
225
|
getInitialized() {
|
|
169
226
|
return this.initialized;
|
|
170
227
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_mitt","_interopRequireDefault","_dayjs","_ApiRequest","_interopRequireWildcard","ApiRequest","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LINKING_ERROR","Platform","select","ios","MonetaiReactNative","NativeModules","Proxy","Error","MonetaiSDK","exposureTimeSec","initialized","pendingEvents","emitter","mitt","getEmitter","getExposureTimeSec","initialize","sdkKey","userId","useStoreKit2","setSdkKey","setUserId","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_mitt","_interopRequireDefault","_dayjs","_ApiRequest","_interopRequireWildcard","ApiRequest","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LINKING_ERROR","Platform","select","ios","MonetaiReactNative","NativeModules","Proxy","Error","MonetaiSDK","exposureTimeSec","initialized","pendingEvents","emitter","mitt","getEmitter","getExposureTimeSec","initialize","sdkKey","userId","useStoreKit2","setSdkKey","setUserId","appVersion","getAppVersion","setAppVersionHeader","error","console","warn","startObserving","sendReceipt","catch","err","result","campaign","exposure_time_sec","pendingPromises","map","eventName","params","createdAt","createEvent","log","Promise","all","then","emit","organizationId","platform","version","group","logEvent","getSdkKey","getUserId","push","Date","logViewProductItem","createViewProductItemEvent","predict","prediction","discountInfo","getAppUserDiscount","hasActiveDiscount","app_user_id","dayjs","ended_at","isAfter","startedAt","endedAt","clone","add","createAppUserDiscount","toDate","getPriceDecision","getInitialized","reset","monetaiSDK","_default","exports"],"sourceRoot":"../../src","sources":["MonetaiSDK.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/lib.js
CHANGED
|
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.getSDKVersion = getSDKVersion;
|
|
7
7
|
function getSDKVersion() {
|
|
8
8
|
// __SDK_VERSION__이 정의되어 있으면 해당 값을 사용
|
|
9
|
-
if (typeof "0.
|
|
10
|
-
return "0.
|
|
9
|
+
if (typeof "1.0.0-beta.1" === 'string') {
|
|
10
|
+
return "1.0.0-beta.1";
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
// 그렇지 않으면, package.json을 lazy하게 불러와 version을 반환
|
package/lib/module/ApiRequest.js
CHANGED
|
@@ -4,8 +4,22 @@ import axios from 'axios';
|
|
|
4
4
|
import { getSDKVersion } from "./lib.js";
|
|
5
5
|
import { Platform } from 'react-native';
|
|
6
6
|
const axiosInstance = axios.create({
|
|
7
|
-
baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk'
|
|
7
|
+
baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk',
|
|
8
|
+
// 필요에 따라 베이스 URL 설정
|
|
9
|
+
headers: {
|
|
10
|
+
'X-SDK-Platform': 'react_native',
|
|
11
|
+
'X-SDK-Version': getSDKVersion(),
|
|
12
|
+
'X-Device-OS': Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' : Platform.OS
|
|
13
|
+
}
|
|
8
14
|
});
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* X-App-Version 헤더를 설정합니다.
|
|
18
|
+
* SDK 초기화 시점에 호출되어야 합니다.
|
|
19
|
+
*/
|
|
20
|
+
export const setAppVersionHeader = version => {
|
|
21
|
+
axiosInstance.defaults.headers.common['X-App-Version'] = version;
|
|
22
|
+
};
|
|
9
23
|
export const initialize = async ({
|
|
10
24
|
sdkKey,
|
|
11
25
|
userId
|
|
@@ -19,7 +33,7 @@ export const initialize = async ({
|
|
|
19
33
|
const abTestGroupResponse = await axiosInstance.post('/ab-test', {
|
|
20
34
|
sdkKey,
|
|
21
35
|
userId,
|
|
22
|
-
platform: Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' :
|
|
36
|
+
platform: Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' : Platform.OS
|
|
23
37
|
});
|
|
24
38
|
return {
|
|
25
39
|
organizationId: response.data.organization_id,
|
|
@@ -54,6 +68,28 @@ export const createEvent = async ({
|
|
|
54
68
|
throw new Error(error.response?.data?.message || 'Failed to log event');
|
|
55
69
|
}
|
|
56
70
|
};
|
|
71
|
+
export const createViewProductItemEvent = async ({
|
|
72
|
+
sdkKey,
|
|
73
|
+
userId,
|
|
74
|
+
params,
|
|
75
|
+
createdAt
|
|
76
|
+
}) => {
|
|
77
|
+
try {
|
|
78
|
+
await axiosInstance.post('/events/view-product-item', {
|
|
79
|
+
sdkKey,
|
|
80
|
+
userId,
|
|
81
|
+
productId: params.productId,
|
|
82
|
+
price: params.price,
|
|
83
|
+
regularPrice: params.regularPrice,
|
|
84
|
+
currencyCode: params.currencyCode,
|
|
85
|
+
month: params.month,
|
|
86
|
+
createdAt: createdAt ?? new Date(),
|
|
87
|
+
platform: Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' : Platform.OS
|
|
88
|
+
});
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error('Failed to log view product item event:', error.message);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
57
93
|
export const predict = async ({
|
|
58
94
|
userId,
|
|
59
95
|
sdkKey
|
|
@@ -105,4 +141,25 @@ export const getAppUserDiscount = async ({
|
|
|
105
141
|
throw new Error(error.response?.data?.message || 'Failed to get discount info');
|
|
106
142
|
}
|
|
107
143
|
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
147
|
+
* API POST /dynamic-pricing/decision 엔드포인트를 호출합니다.
|
|
148
|
+
*/
|
|
149
|
+
export const getPriceDecision = async ({
|
|
150
|
+
sdkKey,
|
|
151
|
+
userId
|
|
152
|
+
}) => {
|
|
153
|
+
try {
|
|
154
|
+
const response = await axiosInstance.post('/dynamic-pricing/decision', {
|
|
155
|
+
sdkKey,
|
|
156
|
+
userId,
|
|
157
|
+
platform: Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' : Platform.OS
|
|
158
|
+
});
|
|
159
|
+
return response.data;
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.error('Failed to get price decision:', error.message);
|
|
162
|
+
throw new Error(error.response?.data?.message || 'Failed to get price decision');
|
|
163
|
+
}
|
|
164
|
+
};
|
|
108
165
|
//# sourceMappingURL=ApiRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["axios","getSDKVersion","Platform","axiosInstance","create","baseURL","initialize","sdkKey","userId","response","post","platform","
|
|
1
|
+
{"version":3,"names":["axios","getSDKVersion","Platform","axiosInstance","create","baseURL","headers","OS","setAppVersionHeader","version","defaults","common","initialize","sdkKey","userId","response","post","platform","abTestGroupResponse","organizationId","data","organization_id","group","campaign","error","console","message","Error","createEvent","eventName","params","createdAt","Date","createViewProductItemEvent","productId","price","regularPrice","currencyCode","month","predict","createAppUserDiscount","discountInfo","appUserId","startedAt","endedAt","discount","getAppUserDiscount","get","getPriceDecision"],"sourceRoot":"../../src","sources":["ApiRequest.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/MonetaiSDK.js
CHANGED
|
@@ -4,7 +4,7 @@ import { NativeModules, Platform } from 'react-native';
|
|
|
4
4
|
import mitt from 'mitt';
|
|
5
5
|
import dayjs from 'dayjs';
|
|
6
6
|
import * as ApiRequest from "./ApiRequest.js";
|
|
7
|
-
import { createAppUserDiscount } from "./ApiRequest.js";
|
|
7
|
+
import { createAppUserDiscount, setAppVersionHeader } from "./ApiRequest.js";
|
|
8
8
|
const LINKING_ERROR = `The package '@hayanmind/monetai-react-native' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
9
9
|
ios: "- You have run 'pod install'\n",
|
|
10
10
|
default: ''
|
|
@@ -61,6 +61,16 @@ class MonetaiSDK {
|
|
|
61
61
|
// userId 설정
|
|
62
62
|
await MonetaiReactNative.setUserId(userId);
|
|
63
63
|
|
|
64
|
+
// 앱 버전을 가져와서 API 헤더에 설정
|
|
65
|
+
try {
|
|
66
|
+
const appVersion = await MonetaiReactNative.getAppVersion();
|
|
67
|
+
if (appVersion) {
|
|
68
|
+
setAppVersionHeader(appVersion);
|
|
69
|
+
}
|
|
70
|
+
} catch (error) {
|
|
71
|
+
console.warn('[MonetaiSDK] Failed to get app version:', error);
|
|
72
|
+
}
|
|
73
|
+
|
|
64
74
|
// 트랜잭션 관찰 시작
|
|
65
75
|
await MonetaiReactNative.startObserving(useStoreKit2);
|
|
66
76
|
|
|
@@ -128,6 +138,37 @@ class MonetaiSDK {
|
|
|
128
138
|
console.log('[MonetaiSDK] Logged event', eventName, params);
|
|
129
139
|
}
|
|
130
140
|
|
|
141
|
+
/**
|
|
142
|
+
* 사용자가 구매 아이템을 조회했을 때 호출하는 이벤트입니다.
|
|
143
|
+
* @param params ViewProductItemParams
|
|
144
|
+
*/
|
|
145
|
+
async logViewProductItem(params) {
|
|
146
|
+
const sdkKey = await this.getSdkKey();
|
|
147
|
+
const userId = await this.getUserId();
|
|
148
|
+
if (!sdkKey || !userId) {
|
|
149
|
+
// SDK가 초기화되지 않았거나 키가 없는 경우, 일반 이벤트 큐에 저장해두었다가
|
|
150
|
+
// 나중에 initialize 시점에 일반 logEvent로 처리하거나,
|
|
151
|
+
// 별도의 큐 처리가 필요할 수 있습니다.
|
|
152
|
+
// 현재 구조상 pendingEvents는 logEvent 형태(이벤트명+파라미터)를 저장하므로,
|
|
153
|
+
// 여기서도 'ma_view_product_item' 이름으로 저장해두면
|
|
154
|
+
// 추후 initialize()에서 processPendingEvents 할 때
|
|
155
|
+
// createEvent를 호출하게 되는데, 이때 'ma_' prefix 때문에 서버에서 거절될 수 있습니다.
|
|
156
|
+
//
|
|
157
|
+
// 해결책: pendingEvents 처리 로직도 'ma_' 여부를 체크해서 분기하거나,
|
|
158
|
+
// 단순하게는 여기서도 'ma_' 이벤트를 큐에 넣되,
|
|
159
|
+
// initialize()의 pending 처리 로직을 수정해야 합니다.
|
|
160
|
+
// 일단은 콘솔 경고를 남기고 리턴하거나, 큐에 넣습니다.
|
|
161
|
+
console.warn('[MonetaiSDK] SDK not initialized. ViewProductItem event will be ignored or queued.');
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
await ApiRequest.createViewProductItemEvent({
|
|
165
|
+
sdkKey,
|
|
166
|
+
userId,
|
|
167
|
+
params,
|
|
168
|
+
createdAt: new Date()
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
131
172
|
// Non-Purchaser 예측
|
|
132
173
|
async predict() {
|
|
133
174
|
const sdkKey = await this.getSdkKey();
|
|
@@ -159,6 +200,22 @@ class MonetaiSDK {
|
|
|
159
200
|
}
|
|
160
201
|
return result;
|
|
161
202
|
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
206
|
+
* @returns productId와 할인율
|
|
207
|
+
*/
|
|
208
|
+
async getPriceDecision() {
|
|
209
|
+
const sdkKey = await this.getSdkKey();
|
|
210
|
+
const userId = await this.getUserId();
|
|
211
|
+
if (!sdkKey || !userId) {
|
|
212
|
+
throw new Error('MonetaiSDK is not initialized. Call initialize() first.');
|
|
213
|
+
}
|
|
214
|
+
return await ApiRequest.getPriceDecision({
|
|
215
|
+
sdkKey,
|
|
216
|
+
userId
|
|
217
|
+
});
|
|
218
|
+
}
|
|
162
219
|
getInitialized() {
|
|
163
220
|
return this.initialized;
|
|
164
221
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","mitt","dayjs","ApiRequest","createAppUserDiscount","LINKING_ERROR","select","ios","default","MonetaiReactNative","Proxy","get","Error","MonetaiSDK","exposureTimeSec","initialized","pendingEvents","emitter","getEmitter","getExposureTimeSec","initialize","sdkKey","userId","useStoreKit2","setSdkKey","setUserId","
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","mitt","dayjs","ApiRequest","createAppUserDiscount","setAppVersionHeader","LINKING_ERROR","select","ios","default","MonetaiReactNative","Proxy","get","Error","MonetaiSDK","exposureTimeSec","initialized","pendingEvents","emitter","getEmitter","getExposureTimeSec","initialize","sdkKey","userId","useStoreKit2","setSdkKey","setUserId","appVersion","getAppVersion","error","console","warn","startObserving","sendReceipt","catch","err","result","campaign","exposure_time_sec","pendingPromises","map","eventName","params","createdAt","createEvent","log","Promise","all","then","emit","organizationId","platform","version","group","logEvent","getSdkKey","getUserId","push","Date","logViewProductItem","createViewProductItemEvent","predict","prediction","discountInfo","getAppUserDiscount","hasActiveDiscount","app_user_id","ended_at","isAfter","startedAt","endedAt","clone","add","toDate","getPriceDecision","getInitialized","reset","monetaiSDK"],"sourceRoot":"../../src","sources":["MonetaiSDK.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/lib.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
export function getSDKVersion() {
|
|
4
4
|
// __SDK_VERSION__이 정의되어 있으면 해당 값을 사용
|
|
5
|
-
if (typeof "0.
|
|
6
|
-
return "0.
|
|
5
|
+
if (typeof "1.0.0-beta.1" === 'string') {
|
|
6
|
+
return "1.0.0-beta.1";
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
// 그렇지 않으면, package.json을 lazy하게 불러와 version을 반환
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type { ABTestGroup, AppUserDiscountResponse, PredictResult } from './types';
|
|
1
|
+
import type { ABTestGroup, AppUserDiscountResponse, PredictResult, ViewProductItemParams } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* X-App-Version 헤더를 설정합니다.
|
|
4
|
+
* SDK 초기화 시점에 호출되어야 합니다.
|
|
5
|
+
*/
|
|
6
|
+
export declare const setAppVersionHeader: (version: string) => void;
|
|
2
7
|
export declare const initialize: ({ sdkKey, userId, }: {
|
|
3
8
|
sdkKey: string;
|
|
4
9
|
userId: string;
|
|
@@ -28,6 +33,12 @@ export declare const createEvent: ({ sdkKey, userId, eventName, params, createdA
|
|
|
28
33
|
params?: Record<string, any>;
|
|
29
34
|
createdAt?: Date;
|
|
30
35
|
}) => Promise<void>;
|
|
36
|
+
export declare const createViewProductItemEvent: ({ sdkKey, userId, params, createdAt, }: {
|
|
37
|
+
sdkKey: string;
|
|
38
|
+
userId: string;
|
|
39
|
+
params: ViewProductItemParams;
|
|
40
|
+
createdAt?: Date;
|
|
41
|
+
}) => Promise<void>;
|
|
31
42
|
export declare const predict: ({ userId, sdkKey, }: {
|
|
32
43
|
userId: string;
|
|
33
44
|
sdkKey: string;
|
|
@@ -49,4 +60,15 @@ export declare const getAppUserDiscount: ({ sdkKey, userId, }: {
|
|
|
49
60
|
sdkKey: string;
|
|
50
61
|
userId: string;
|
|
51
62
|
}) => Promise<AppUserDiscountResponse | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
65
|
+
* API POST /dynamic-pricing/decision 엔드포인트를 호출합니다.
|
|
66
|
+
*/
|
|
67
|
+
export declare const getPriceDecision: ({ sdkKey, userId, }: {
|
|
68
|
+
sdkKey: string;
|
|
69
|
+
userId: string;
|
|
70
|
+
}) => Promise<{
|
|
71
|
+
productId: string;
|
|
72
|
+
discount: number;
|
|
73
|
+
}>;
|
|
52
74
|
//# sourceMappingURL=ApiRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiRequest.d.ts","sourceRoot":"","sources":["../../../../src/ApiRequest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,aAAa,
|
|
1
|
+
{"version":3,"file":"ApiRequest.d.ts","sourceRoot":"","sources":["../../../../src/ApiRequest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAkBjB;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,SAElD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,qBAG9B;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;;;;;;YAeW,MAAM;oBACE,IAAI,GAAG,IAAI;yBACN,MAAM;uBACR,MAAM;oBACT,IAAI,GAAG,IAAI;kBACb,IAAI,GAAG,IAAI;uBACN,MAAM;0BACH,MAAM;wBACR,MAAM;2BACH,MAAM;wBACT,MAAM,GAAG,IAAI;;EA0BpC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,mDAM/B;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,kBAmBA,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAU,wCAK9C;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,kBAqBA,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,qBAG3B;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;gBAGiB,aAAa;eACd,WAAW,GAAG,IAAI;EAalC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,cAAc;IACxD,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,qCAiBA,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAU,qBAGtC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,4CAcA,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAU,qBAGpC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;eAGgB,MAAM;cACP,MAAM;EAkBrB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ABTestGroup, type PredictResult, type LogEventOptions } from './types';
|
|
1
|
+
import { type ABTestGroup, type PredictResult, type LogEventOptions, type ViewProductItemParams } from './types';
|
|
2
2
|
type MonetaiEvents = {
|
|
3
3
|
LOAD_DISCOUNT_INFO: void;
|
|
4
4
|
};
|
|
@@ -29,10 +29,23 @@ declare class MonetaiSDK {
|
|
|
29
29
|
group: ABTestGroup | null;
|
|
30
30
|
}>;
|
|
31
31
|
logEvent({ eventName, params }: LogEventOptions): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 사용자가 구매 아이템을 조회했을 때 호출하는 이벤트입니다.
|
|
34
|
+
* @param params ViewProductItemParams
|
|
35
|
+
*/
|
|
36
|
+
logViewProductItem(params: ViewProductItemParams): Promise<void>;
|
|
32
37
|
predict(): Promise<{
|
|
33
38
|
prediction: PredictResult;
|
|
34
39
|
testGroup: ABTestGroup | null;
|
|
35
40
|
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
43
|
+
* @returns productId와 할인율
|
|
44
|
+
*/
|
|
45
|
+
getPriceDecision(): Promise<{
|
|
46
|
+
productId: string;
|
|
47
|
+
discount: number;
|
|
48
|
+
}>;
|
|
36
49
|
getInitialized(): boolean;
|
|
37
50
|
getUserId(): Promise<string | null>;
|
|
38
51
|
getSdkKey(): Promise<string | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonetaiSDK.d.ts","sourceRoot":"","sources":["../../../../src/MonetaiSDK.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"MonetaiSDK.d.ts","sourceRoot":"","sources":["../../../../src/MonetaiSDK.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,SAAS,CAAC;AAiCjB,KAAK,aAAa,GAAG;IACnB,kBAAkB,EAAE,IAAI,CAAC;CAC1B,CAAC;AAEF,cAAM,UAAU;IACd,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,aAAa,CAIb;IAGR,OAAO,CAAC,OAAO,CAAyB;IAGjC,UAAU;IAIV,kBAAkB;IAIzB;;;;;;;OAOG;IACU,UAAU,CAAC,EACtB,MAAM,EACN,MAAM,EACN,YAAoB,GACrB,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,cAAc,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;KAC3B,CAAC;IAiEW,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,eAAe;IAmB5D;;;OAGG;IACU,kBAAkB,CAAC,MAAM,EAAE,qBAAqB;IAgChD,OAAO,IAAI,OAAO,CAAC;QAC9B,UAAU,EAAE,aAAa,CAAC;QAC1B,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;KAC/B,CAAC;IAqCF;;;OAGG;IACU,gBAAgB,IAAI,OAAO,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAaK,cAAc;IAIR,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,KAAK;CAInB;AAGD,QAAA,MAAM,UAAU,YAAmB,CAAC;AACpC,eAAe,UAAU,CAAC"}
|
|
@@ -7,5 +7,5 @@ import { useBanner } from './hooks/useBanner';
|
|
|
7
7
|
import { usePaywall } from './hooks/usePaywall';
|
|
8
8
|
export default MonetaiSDK;
|
|
9
9
|
export { MonetaiProvider, Banner, Paywall, useBanner, usePaywall, CompactPaywallWrapper, HighlightBenefitsPaywallWrapper, KeyFeatureSummaryPaywallWrapper, TextFocusedPaywallWrapper, };
|
|
10
|
-
export type { ABTestGroup, PredictResult, EventParams, LogEventOptions, DiscountInfo, AppUserDiscountResponse, PaywallConfig, Feature, BannerParams, PaywallParams, PaywallStyle, } from './types';
|
|
10
|
+
export type { ABTestGroup, PredictResult, EventParams, LogEventOptions, DiscountInfo, AppUserDiscountResponse, PaywallConfig, Feature, BannerParams, PaywallParams, PaywallStyle, PriceDecision, } from './types';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,OAAO,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAe,UAAU,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,GAC1B,CAAC;AAGF,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,aAAa,EACb,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,OAAO,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAe,UAAU,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,GAC1B,CAAC;AAGF,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export type ABTestGroup = 'baseline' | 'monetai' | 'unknown';
|
|
2
2
|
export type PredictResult = 'non-purchaser' | 'purchaser' | null;
|
|
3
|
+
export interface PriceDecision {
|
|
4
|
+
productId: string;
|
|
5
|
+
discount: number;
|
|
6
|
+
}
|
|
3
7
|
export type PaywallStyle = 'compact' | 'highlight-benefits' | 'key-feature-summary' | 'text-focused';
|
|
4
8
|
export interface Feature {
|
|
5
9
|
title: string;
|
|
@@ -13,6 +17,13 @@ export interface LogEventOptions {
|
|
|
13
17
|
eventName: string;
|
|
14
18
|
params?: EventParams;
|
|
15
19
|
}
|
|
20
|
+
export interface ViewProductItemParams {
|
|
21
|
+
productId: string;
|
|
22
|
+
price: number;
|
|
23
|
+
regularPrice: number;
|
|
24
|
+
currencyCode: string;
|
|
25
|
+
month?: number | null;
|
|
26
|
+
}
|
|
16
27
|
export interface DiscountInfo {
|
|
17
28
|
startedAt: Date;
|
|
18
29
|
endedAt: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,WAAW,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import type { ABTestGroup, AppUserDiscountResponse, PredictResult } from './types';
|
|
1
|
+
import type { ABTestGroup, AppUserDiscountResponse, PredictResult, ViewProductItemParams } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* X-App-Version 헤더를 설정합니다.
|
|
4
|
+
* SDK 초기화 시점에 호출되어야 합니다.
|
|
5
|
+
*/
|
|
6
|
+
export declare const setAppVersionHeader: (version: string) => void;
|
|
2
7
|
export declare const initialize: ({ sdkKey, userId, }: {
|
|
3
8
|
sdkKey: string;
|
|
4
9
|
userId: string;
|
|
@@ -28,6 +33,12 @@ export declare const createEvent: ({ sdkKey, userId, eventName, params, createdA
|
|
|
28
33
|
params?: Record<string, any>;
|
|
29
34
|
createdAt?: Date;
|
|
30
35
|
}) => Promise<void>;
|
|
36
|
+
export declare const createViewProductItemEvent: ({ sdkKey, userId, params, createdAt, }: {
|
|
37
|
+
sdkKey: string;
|
|
38
|
+
userId: string;
|
|
39
|
+
params: ViewProductItemParams;
|
|
40
|
+
createdAt?: Date;
|
|
41
|
+
}) => Promise<void>;
|
|
31
42
|
export declare const predict: ({ userId, sdkKey, }: {
|
|
32
43
|
userId: string;
|
|
33
44
|
sdkKey: string;
|
|
@@ -49,4 +60,15 @@ export declare const getAppUserDiscount: ({ sdkKey, userId, }: {
|
|
|
49
60
|
sdkKey: string;
|
|
50
61
|
userId: string;
|
|
51
62
|
}) => Promise<AppUserDiscountResponse | null>;
|
|
63
|
+
/**
|
|
64
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
65
|
+
* API POST /dynamic-pricing/decision 엔드포인트를 호출합니다.
|
|
66
|
+
*/
|
|
67
|
+
export declare const getPriceDecision: ({ sdkKey, userId, }: {
|
|
68
|
+
sdkKey: string;
|
|
69
|
+
userId: string;
|
|
70
|
+
}) => Promise<{
|
|
71
|
+
productId: string;
|
|
72
|
+
discount: number;
|
|
73
|
+
}>;
|
|
52
74
|
//# sourceMappingURL=ApiRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiRequest.d.ts","sourceRoot":"","sources":["../../../../src/ApiRequest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,aAAa,
|
|
1
|
+
{"version":3,"file":"ApiRequest.d.ts","sourceRoot":"","sources":["../../../../src/ApiRequest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAkBjB;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,SAElD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,qBAG9B;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;;;;;;YAeW,MAAM;oBACE,IAAI,GAAG,IAAI;yBACN,MAAM;uBACR,MAAM;oBACT,IAAI,GAAG,IAAI;kBACb,IAAI,GAAG,IAAI;uBACN,MAAM;0BACH,MAAM;wBACR,MAAM;2BACH,MAAM;wBACT,MAAM,GAAG,IAAI;;EA0BpC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,mDAM/B;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,kBAmBA,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAU,wCAK9C;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,kBAqBA,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,qBAG3B;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;gBAGiB,aAAa;eACd,WAAW,GAAG,IAAI;EAalC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAU,cAAc;IACxD,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,qCAiBA,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAU,qBAGtC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,4CAcA,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAU,qBAGpC;IACD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;eAGgB,MAAM;cACP,MAAM;EAkBrB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ABTestGroup, type PredictResult, type LogEventOptions } from './types';
|
|
1
|
+
import { type ABTestGroup, type PredictResult, type LogEventOptions, type ViewProductItemParams } from './types';
|
|
2
2
|
type MonetaiEvents = {
|
|
3
3
|
LOAD_DISCOUNT_INFO: void;
|
|
4
4
|
};
|
|
@@ -29,10 +29,23 @@ declare class MonetaiSDK {
|
|
|
29
29
|
group: ABTestGroup | null;
|
|
30
30
|
}>;
|
|
31
31
|
logEvent({ eventName, params }: LogEventOptions): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 사용자가 구매 아이템을 조회했을 때 호출하는 이벤트입니다.
|
|
34
|
+
* @param params ViewProductItemParams
|
|
35
|
+
*/
|
|
36
|
+
logViewProductItem(params: ViewProductItemParams): Promise<void>;
|
|
32
37
|
predict(): Promise<{
|
|
33
38
|
prediction: PredictResult;
|
|
34
39
|
testGroup: ABTestGroup | null;
|
|
35
40
|
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
43
|
+
* @returns productId와 할인율
|
|
44
|
+
*/
|
|
45
|
+
getPriceDecision(): Promise<{
|
|
46
|
+
productId: string;
|
|
47
|
+
discount: number;
|
|
48
|
+
}>;
|
|
36
49
|
getInitialized(): boolean;
|
|
37
50
|
getUserId(): Promise<string | null>;
|
|
38
51
|
getSdkKey(): Promise<string | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonetaiSDK.d.ts","sourceRoot":"","sources":["../../../../src/MonetaiSDK.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"MonetaiSDK.d.ts","sourceRoot":"","sources":["../../../../src/MonetaiSDK.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,SAAS,CAAC;AAiCjB,KAAK,aAAa,GAAG;IACnB,kBAAkB,EAAE,IAAI,CAAC;CAC1B,CAAC;AAEF,cAAM,UAAU;IACd,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,aAAa,CAIb;IAGR,OAAO,CAAC,OAAO,CAAyB;IAGjC,UAAU;IAIV,kBAAkB;IAIzB;;;;;;;OAOG;IACU,UAAU,CAAC,EACtB,MAAM,EACN,MAAM,EACN,YAAoB,GACrB,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,cAAc,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;KAC3B,CAAC;IAiEW,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,eAAe;IAmB5D;;;OAGG;IACU,kBAAkB,CAAC,MAAM,EAAE,qBAAqB;IAgChD,OAAO,IAAI,OAAO,CAAC;QAC9B,UAAU,EAAE,aAAa,CAAC;QAC1B,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;KAC/B,CAAC;IAqCF;;;OAGG;IACU,gBAAgB,IAAI,OAAO,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAaK,cAAc;IAIR,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,KAAK;CAInB;AAGD,QAAA,MAAM,UAAU,YAAmB,CAAC;AACpC,eAAe,UAAU,CAAC"}
|
|
@@ -7,5 +7,5 @@ import { useBanner } from './hooks/useBanner';
|
|
|
7
7
|
import { usePaywall } from './hooks/usePaywall';
|
|
8
8
|
export default MonetaiSDK;
|
|
9
9
|
export { MonetaiProvider, Banner, Paywall, useBanner, usePaywall, CompactPaywallWrapper, HighlightBenefitsPaywallWrapper, KeyFeatureSummaryPaywallWrapper, TextFocusedPaywallWrapper, };
|
|
10
|
-
export type { ABTestGroup, PredictResult, EventParams, LogEventOptions, DiscountInfo, AppUserDiscountResponse, PaywallConfig, Feature, BannerParams, PaywallParams, PaywallStyle, } from './types';
|
|
10
|
+
export type { ABTestGroup, PredictResult, EventParams, LogEventOptions, DiscountInfo, AppUserDiscountResponse, PaywallConfig, Feature, BannerParams, PaywallParams, PaywallStyle, PriceDecision, } from './types';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,OAAO,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAe,UAAU,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,GAC1B,CAAC;AAGF,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,aAAa,EACb,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,OAAO,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAe,UAAU,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,+BAA+B,EAC/B,+BAA+B,EAC/B,yBAAyB,GAC1B,CAAC;AAGF,YAAY,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,uBAAuB,EACvB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export type ABTestGroup = 'baseline' | 'monetai' | 'unknown';
|
|
2
2
|
export type PredictResult = 'non-purchaser' | 'purchaser' | null;
|
|
3
|
+
export interface PriceDecision {
|
|
4
|
+
productId: string;
|
|
5
|
+
discount: number;
|
|
6
|
+
}
|
|
3
7
|
export type PaywallStyle = 'compact' | 'highlight-benefits' | 'key-feature-summary' | 'text-focused';
|
|
4
8
|
export interface Feature {
|
|
5
9
|
title: string;
|
|
@@ -13,6 +17,13 @@ export interface LogEventOptions {
|
|
|
13
17
|
eventName: string;
|
|
14
18
|
params?: EventParams;
|
|
15
19
|
}
|
|
20
|
+
export interface ViewProductItemParams {
|
|
21
|
+
productId: string;
|
|
22
|
+
price: number;
|
|
23
|
+
regularPrice: number;
|
|
24
|
+
currencyCode: string;
|
|
25
|
+
month?: number | null;
|
|
26
|
+
}
|
|
16
27
|
export interface DiscountInfo {
|
|
17
28
|
startedAt: Date;
|
|
18
29
|
endedAt: Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,WAAW,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/ApiRequest.ts
CHANGED
|
@@ -3,14 +3,33 @@ import type {
|
|
|
3
3
|
ABTestGroup,
|
|
4
4
|
AppUserDiscountResponse,
|
|
5
5
|
PredictResult,
|
|
6
|
+
ViewProductItemParams,
|
|
6
7
|
} from './types';
|
|
7
8
|
import { getSDKVersion } from './lib';
|
|
8
9
|
import { Platform } from 'react-native';
|
|
9
10
|
|
|
10
11
|
const axiosInstance = axios.create({
|
|
11
12
|
baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk', // 필요에 따라 베이스 URL 설정
|
|
13
|
+
headers: {
|
|
14
|
+
'X-SDK-Platform': 'react_native',
|
|
15
|
+
'X-SDK-Version': getSDKVersion(),
|
|
16
|
+
'X-Device-OS':
|
|
17
|
+
Platform.OS === 'ios'
|
|
18
|
+
? 'ios'
|
|
19
|
+
: Platform.OS === 'android'
|
|
20
|
+
? 'android'
|
|
21
|
+
: Platform.OS,
|
|
22
|
+
},
|
|
12
23
|
});
|
|
13
24
|
|
|
25
|
+
/**
|
|
26
|
+
* X-App-Version 헤더를 설정합니다.
|
|
27
|
+
* SDK 초기화 시점에 호출되어야 합니다.
|
|
28
|
+
*/
|
|
29
|
+
export const setAppVersionHeader = (version: string) => {
|
|
30
|
+
axiosInstance.defaults.headers.common['X-App-Version'] = version;
|
|
31
|
+
};
|
|
32
|
+
|
|
14
33
|
export const initialize = async ({
|
|
15
34
|
sdkKey,
|
|
16
35
|
userId,
|
|
@@ -52,7 +71,7 @@ export const initialize = async ({
|
|
|
52
71
|
? 'ios'
|
|
53
72
|
: Platform.OS === 'android'
|
|
54
73
|
? 'android'
|
|
55
|
-
:
|
|
74
|
+
: Platform.OS,
|
|
56
75
|
});
|
|
57
76
|
|
|
58
77
|
return {
|
|
@@ -103,6 +122,39 @@ export const createEvent = async ({
|
|
|
103
122
|
}
|
|
104
123
|
};
|
|
105
124
|
|
|
125
|
+
export const createViewProductItemEvent = async ({
|
|
126
|
+
sdkKey,
|
|
127
|
+
userId,
|
|
128
|
+
params,
|
|
129
|
+
createdAt,
|
|
130
|
+
}: {
|
|
131
|
+
sdkKey: string;
|
|
132
|
+
userId: string;
|
|
133
|
+
params: ViewProductItemParams;
|
|
134
|
+
createdAt?: Date;
|
|
135
|
+
}) => {
|
|
136
|
+
try {
|
|
137
|
+
await axiosInstance.post('/events/view-product-item', {
|
|
138
|
+
sdkKey,
|
|
139
|
+
userId,
|
|
140
|
+
productId: params.productId,
|
|
141
|
+
price: params.price,
|
|
142
|
+
regularPrice: params.regularPrice,
|
|
143
|
+
currencyCode: params.currencyCode,
|
|
144
|
+
month: params.month,
|
|
145
|
+
createdAt: createdAt ?? new Date(),
|
|
146
|
+
platform:
|
|
147
|
+
Platform.OS === 'ios'
|
|
148
|
+
? 'ios'
|
|
149
|
+
: Platform.OS === 'android'
|
|
150
|
+
? 'android'
|
|
151
|
+
: Platform.OS,
|
|
152
|
+
});
|
|
153
|
+
} catch (error: any) {
|
|
154
|
+
console.error('Failed to log view product item event:', error.message);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
106
158
|
export const predict = async ({
|
|
107
159
|
userId,
|
|
108
160
|
sdkKey,
|
|
@@ -177,3 +229,37 @@ export const getAppUserDiscount = async ({
|
|
|
177
229
|
);
|
|
178
230
|
}
|
|
179
231
|
};
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
235
|
+
* API POST /dynamic-pricing/decision 엔드포인트를 호출합니다.
|
|
236
|
+
*/
|
|
237
|
+
export const getPriceDecision = async ({
|
|
238
|
+
sdkKey,
|
|
239
|
+
userId,
|
|
240
|
+
}: {
|
|
241
|
+
sdkKey: string;
|
|
242
|
+
userId: string;
|
|
243
|
+
}) => {
|
|
244
|
+
try {
|
|
245
|
+
const response = await axiosInstance.post<{
|
|
246
|
+
productId: string;
|
|
247
|
+
discount: number;
|
|
248
|
+
}>('/dynamic-pricing/decision', {
|
|
249
|
+
sdkKey,
|
|
250
|
+
userId,
|
|
251
|
+
platform:
|
|
252
|
+
Platform.OS === 'ios'
|
|
253
|
+
? 'ios'
|
|
254
|
+
: Platform.OS === 'android'
|
|
255
|
+
? 'android'
|
|
256
|
+
: Platform.OS,
|
|
257
|
+
});
|
|
258
|
+
return response.data;
|
|
259
|
+
} catch (error: any) {
|
|
260
|
+
console.error('Failed to get price decision:', error.message);
|
|
261
|
+
throw new Error(
|
|
262
|
+
error.response?.data?.message || 'Failed to get price decision'
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
};
|
package/src/MonetaiSDK.ts
CHANGED
|
@@ -6,8 +6,9 @@ import {
|
|
|
6
6
|
type ABTestGroup,
|
|
7
7
|
type PredictResult,
|
|
8
8
|
type LogEventOptions,
|
|
9
|
+
type ViewProductItemParams,
|
|
9
10
|
} from './types';
|
|
10
|
-
import { createAppUserDiscount } from './ApiRequest';
|
|
11
|
+
import { createAppUserDiscount, setAppVersionHeader } from './ApiRequest';
|
|
11
12
|
|
|
12
13
|
const LINKING_ERROR =
|
|
13
14
|
`The package '@hayanmind/monetai-react-native' doesn't seem to be linked. Make sure: \n\n` +
|
|
@@ -15,16 +16,28 @@ const LINKING_ERROR =
|
|
|
15
16
|
'- You rebuilt the app after installing the package\n' +
|
|
16
17
|
'- You are not using Expo Go\n';
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
interface MonetaiReactNativeModule {
|
|
20
|
+
setUserId(userId: string): Promise<void>;
|
|
21
|
+
getUserId(): Promise<string | null>;
|
|
22
|
+
setSdkKey(sdkKey: string): Promise<void>;
|
|
23
|
+
getSdkKey(): Promise<string | null>;
|
|
24
|
+
startObserving(useStoreKit2: boolean): Promise<void>;
|
|
25
|
+
sendReceipt(): Promise<void>;
|
|
26
|
+
reset(): Promise<void>;
|
|
27
|
+
getAppVersion(): Promise<string | null>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const MonetaiReactNative: MonetaiReactNativeModule =
|
|
31
|
+
NativeModules.MonetaiReactNative
|
|
32
|
+
? NativeModules.MonetaiReactNative
|
|
33
|
+
: new Proxy(
|
|
34
|
+
{},
|
|
35
|
+
{
|
|
36
|
+
get() {
|
|
37
|
+
throw new Error(LINKING_ERROR);
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
);
|
|
28
41
|
|
|
29
42
|
// Emitter로 사용할 이벤트 타입 정의
|
|
30
43
|
type MonetaiEvents = {
|
|
@@ -90,6 +103,16 @@ class MonetaiSDK {
|
|
|
90
103
|
// userId 설정
|
|
91
104
|
await MonetaiReactNative.setUserId(userId);
|
|
92
105
|
|
|
106
|
+
// 앱 버전을 가져와서 API 헤더에 설정
|
|
107
|
+
try {
|
|
108
|
+
const appVersion = await MonetaiReactNative.getAppVersion();
|
|
109
|
+
if (appVersion) {
|
|
110
|
+
setAppVersionHeader(appVersion);
|
|
111
|
+
}
|
|
112
|
+
} catch (error) {
|
|
113
|
+
console.warn('[MonetaiSDK] Failed to get app version:', error);
|
|
114
|
+
}
|
|
115
|
+
|
|
93
116
|
// 트랜잭션 관찰 시작
|
|
94
117
|
await MonetaiReactNative.startObserving(useStoreKit2);
|
|
95
118
|
|
|
@@ -150,6 +173,41 @@ class MonetaiSDK {
|
|
|
150
173
|
console.log('[MonetaiSDK] Logged event', eventName, params);
|
|
151
174
|
}
|
|
152
175
|
|
|
176
|
+
/**
|
|
177
|
+
* 사용자가 구매 아이템을 조회했을 때 호출하는 이벤트입니다.
|
|
178
|
+
* @param params ViewProductItemParams
|
|
179
|
+
*/
|
|
180
|
+
public async logViewProductItem(params: ViewProductItemParams) {
|
|
181
|
+
const sdkKey = await this.getSdkKey();
|
|
182
|
+
const userId = await this.getUserId();
|
|
183
|
+
|
|
184
|
+
if (!sdkKey || !userId) {
|
|
185
|
+
// SDK가 초기화되지 않았거나 키가 없는 경우, 일반 이벤트 큐에 저장해두었다가
|
|
186
|
+
// 나중에 initialize 시점에 일반 logEvent로 처리하거나,
|
|
187
|
+
// 별도의 큐 처리가 필요할 수 있습니다.
|
|
188
|
+
// 현재 구조상 pendingEvents는 logEvent 형태(이벤트명+파라미터)를 저장하므로,
|
|
189
|
+
// 여기서도 'ma_view_product_item' 이름으로 저장해두면
|
|
190
|
+
// 추후 initialize()에서 processPendingEvents 할 때
|
|
191
|
+
// createEvent를 호출하게 되는데, 이때 'ma_' prefix 때문에 서버에서 거절될 수 있습니다.
|
|
192
|
+
//
|
|
193
|
+
// 해결책: pendingEvents 처리 로직도 'ma_' 여부를 체크해서 분기하거나,
|
|
194
|
+
// 단순하게는 여기서도 'ma_' 이벤트를 큐에 넣되,
|
|
195
|
+
// initialize()의 pending 처리 로직을 수정해야 합니다.
|
|
196
|
+
// 일단은 콘솔 경고를 남기고 리턴하거나, 큐에 넣습니다.
|
|
197
|
+
console.warn(
|
|
198
|
+
'[MonetaiSDK] SDK not initialized. ViewProductItem event will be ignored or queued.'
|
|
199
|
+
);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
await ApiRequest.createViewProductItemEvent({
|
|
204
|
+
sdkKey,
|
|
205
|
+
userId,
|
|
206
|
+
params,
|
|
207
|
+
createdAt: new Date(),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
153
211
|
// Non-Purchaser 예측
|
|
154
212
|
public async predict(): Promise<{
|
|
155
213
|
prediction: PredictResult;
|
|
@@ -191,6 +249,26 @@ class MonetaiSDK {
|
|
|
191
249
|
return result;
|
|
192
250
|
}
|
|
193
251
|
|
|
252
|
+
/**
|
|
253
|
+
* Thompson Sampling을 사용한 최적 가격 결정
|
|
254
|
+
* @returns productId와 할인율
|
|
255
|
+
*/
|
|
256
|
+
public async getPriceDecision(): Promise<{
|
|
257
|
+
productId: string;
|
|
258
|
+
discount: number;
|
|
259
|
+
}> {
|
|
260
|
+
const sdkKey = await this.getSdkKey();
|
|
261
|
+
const userId = await this.getUserId();
|
|
262
|
+
|
|
263
|
+
if (!sdkKey || !userId) {
|
|
264
|
+
throw new Error(
|
|
265
|
+
'MonetaiSDK is not initialized. Call initialize() first.'
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return await ApiRequest.getPriceDecision({ sdkKey, userId });
|
|
270
|
+
}
|
|
271
|
+
|
|
194
272
|
public getInitialized() {
|
|
195
273
|
return this.initialized;
|
|
196
274
|
}
|
package/src/index.tsx
CHANGED
package/src/types.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
export type ABTestGroup = 'baseline' | 'monetai' | 'unknown';
|
|
2
2
|
export type PredictResult = 'non-purchaser' | 'purchaser' | null;
|
|
3
3
|
|
|
4
|
+
export interface PriceDecision {
|
|
5
|
+
productId: string; // Product ID
|
|
6
|
+
discount: number; // 할인율 (0.5 = 50%)
|
|
7
|
+
}
|
|
8
|
+
|
|
4
9
|
// Banner and Paywall style types
|
|
5
10
|
export type PaywallStyle =
|
|
6
11
|
| 'compact'
|
|
@@ -24,6 +29,14 @@ export interface LogEventOptions {
|
|
|
24
29
|
params?: EventParams;
|
|
25
30
|
}
|
|
26
31
|
|
|
32
|
+
export interface ViewProductItemParams {
|
|
33
|
+
productId: string;
|
|
34
|
+
price: number;
|
|
35
|
+
regularPrice: number;
|
|
36
|
+
currencyCode: string;
|
|
37
|
+
month?: number | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
27
40
|
export interface DiscountInfo {
|
|
28
41
|
startedAt: Date;
|
|
29
42
|
endedAt: Date;
|