@hayanmind/monetai-react-native 0.2.4

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.
Files changed (76) hide show
  1. package/LICENSE +20 -0
  2. package/MonetaiReactNative.podspec +25 -0
  3. package/README.md +31 -0
  4. package/android/build.gradle +81 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/AndroidManifestNew.xml +2 -0
  8. package/android/src/main/java/com/hayanmind/monetaireactnative/MonetaiReactNativeModule.kt +110 -0
  9. package/android/src/main/java/com/hayanmind/monetaireactnative/MonetaiReactNativePackage.kt +17 -0
  10. package/ios/MonetaiReactNative-Bridging-Header.h +2 -0
  11. package/ios/MonetaiReactNative.mm +38 -0
  12. package/ios/MonetaiReactNative.swift +336 -0
  13. package/lib/commonjs/ApiRequest.js +120 -0
  14. package/lib/commonjs/ApiRequest.js.map +1 -0
  15. package/lib/commonjs/MonetaiProvider.js +67 -0
  16. package/lib/commonjs/MonetaiProvider.js.map +1 -0
  17. package/lib/commonjs/MonetaiSDK.js +198 -0
  18. package/lib/commonjs/MonetaiSDK.js.map +1 -0
  19. package/lib/commonjs/index.js +17 -0
  20. package/lib/commonjs/index.js.map +1 -0
  21. package/lib/commonjs/lib.js +24 -0
  22. package/lib/commonjs/lib.js.map +1 -0
  23. package/lib/commonjs/package.json +1 -0
  24. package/lib/commonjs/types/global.d.js +2 -0
  25. package/lib/commonjs/types/global.d.js.map +1 -0
  26. package/lib/commonjs/types.js +2 -0
  27. package/lib/commonjs/types.js.map +1 -0
  28. package/lib/module/ApiRequest.js +110 -0
  29. package/lib/module/ApiRequest.js.map +1 -0
  30. package/lib/module/MonetaiProvider.js +61 -0
  31. package/lib/module/MonetaiProvider.js.map +1 -0
  32. package/lib/module/MonetaiSDK.js +192 -0
  33. package/lib/module/MonetaiSDK.js.map +1 -0
  34. package/lib/module/index.js +7 -0
  35. package/lib/module/index.js.map +1 -0
  36. package/lib/module/lib.js +20 -0
  37. package/lib/module/lib.js.map +1 -0
  38. package/lib/module/package.json +1 -0
  39. package/lib/module/types/global.d.js +2 -0
  40. package/lib/module/types/global.d.js.map +1 -0
  41. package/lib/module/types.js +2 -0
  42. package/lib/module/types.js.map +1 -0
  43. package/lib/typescript/commonjs/package.json +1 -0
  44. package/lib/typescript/commonjs/src/ApiRequest.d.ts +52 -0
  45. package/lib/typescript/commonjs/src/ApiRequest.d.ts.map +1 -0
  46. package/lib/typescript/commonjs/src/MonetaiProvider.d.ts +18 -0
  47. package/lib/typescript/commonjs/src/MonetaiProvider.d.ts.map +1 -0
  48. package/lib/typescript/commonjs/src/MonetaiSDK.d.ts +45 -0
  49. package/lib/typescript/commonjs/src/MonetaiSDK.d.ts.map +1 -0
  50. package/lib/typescript/commonjs/src/index.d.ts +5 -0
  51. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  52. package/lib/typescript/commonjs/src/lib.d.ts +2 -0
  53. package/lib/typescript/commonjs/src/lib.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/src/types.d.ts +17 -0
  55. package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
  56. package/lib/typescript/module/package.json +1 -0
  57. package/lib/typescript/module/src/ApiRequest.d.ts +52 -0
  58. package/lib/typescript/module/src/ApiRequest.d.ts.map +1 -0
  59. package/lib/typescript/module/src/MonetaiProvider.d.ts +18 -0
  60. package/lib/typescript/module/src/MonetaiProvider.d.ts.map +1 -0
  61. package/lib/typescript/module/src/MonetaiSDK.d.ts +45 -0
  62. package/lib/typescript/module/src/MonetaiSDK.d.ts.map +1 -0
  63. package/lib/typescript/module/src/index.d.ts +5 -0
  64. package/lib/typescript/module/src/index.d.ts.map +1 -0
  65. package/lib/typescript/module/src/lib.d.ts +2 -0
  66. package/lib/typescript/module/src/lib.d.ts.map +1 -0
  67. package/lib/typescript/module/src/types.d.ts +17 -0
  68. package/lib/typescript/module/src/types.d.ts.map +1 -0
  69. package/package.json +176 -0
  70. package/src/ApiRequest.ts +182 -0
  71. package/src/MonetaiProvider.tsx +79 -0
  72. package/src/MonetaiSDK.ts +225 -0
  73. package/src/index.tsx +5 -0
  74. package/src/lib.ts +17 -0
  75. package/src/types/global.d.ts +2 -0
  76. package/src/types.ts +17 -0
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.predict = exports.initialize = exports.getAppUserDiscount = exports.createEvent = exports.createAppUserDiscount = void 0;
7
+ var _axios = _interopRequireDefault(require("axios"));
8
+ var _lib = require("./lib.js");
9
+ var _reactNative = require("react-native");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ const axiosInstance = _axios.default.create({
12
+ baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk' // 필요에 따라 베이스 URL 설정
13
+ });
14
+ const initialize = async ({
15
+ sdkKey,
16
+ userId
17
+ }) => {
18
+ try {
19
+ const response = await axiosInstance.post('/sdk-integrations', {
20
+ sdkKey,
21
+ platform: 'react_native',
22
+ version: (0, _lib.getSDKVersion)()
23
+ });
24
+ const abTestGroupResponse = await axiosInstance.post('/ab-test', {
25
+ sdkKey,
26
+ userId,
27
+ platform: _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' : null
28
+ });
29
+ return {
30
+ organizationId: response.data.organization_id,
31
+ platform: response.data.platform,
32
+ version: response.data.version,
33
+ group: abTestGroupResponse.data.group,
34
+ campaign: abTestGroupResponse.data.campaign
35
+ };
36
+ } catch (error) {
37
+ console.error('Failed to initialize integration:', error.message);
38
+ throw new Error(error.response?.data?.message || 'Integration initialization failed');
39
+ }
40
+ };
41
+ exports.initialize = initialize;
42
+ const createEvent = async ({
43
+ sdkKey,
44
+ userId,
45
+ eventName,
46
+ createdAt,
47
+ value
48
+ }) => {
49
+ try {
50
+ await axiosInstance.post('/events', {
51
+ sdkKey,
52
+ userId,
53
+ eventName,
54
+ createdAt: createdAt ?? new Date(),
55
+ value,
56
+ platform: _reactNative.Platform.OS === 'ios' ? 'ios' : _reactNative.Platform.OS === 'android' ? 'android' : null
57
+ });
58
+ } catch (error) {
59
+ console.error('Failed to log event:', error.message);
60
+ throw new Error(error.response?.data?.message || 'Failed to log event');
61
+ }
62
+ };
63
+ exports.createEvent = createEvent;
64
+ const predict = async ({
65
+ userId,
66
+ sdkKey
67
+ }) => {
68
+ console.log('Predicting user:', userId);
69
+ try {
70
+ const response = await axiosInstance.post('/predict', {
71
+ sdkKey,
72
+ userId
73
+ });
74
+ return response.data;
75
+ } catch (error) {
76
+ console.error('Failed to get A/B test group:', error.message);
77
+ throw new Error(error.response?.data?.message || 'Failed to get A/B test group');
78
+ }
79
+ };
80
+ exports.predict = predict;
81
+ const createAppUserDiscount = async discountInfo => {
82
+ try {
83
+ const response = await axiosInstance.post('/app-user-discounts', {
84
+ sdkKey: discountInfo.sdkKey,
85
+ appUserId: discountInfo.userId,
86
+ startedAt: discountInfo.startedAt,
87
+ endedAt: discountInfo.endedAt
88
+ });
89
+ console.log('response', response);
90
+ return response.data.discount;
91
+ } catch (error) {
92
+ console.error('Failed to set discount info:', error.message);
93
+ throw new Error(error.response?.data?.message || 'Failed to set discount info');
94
+ }
95
+ };
96
+
97
+ /**
98
+ * sdkKey와 app_user_id에 해당하는 가장 최근 할인 정보를 조회합니다.
99
+ * API GET /app-user-discounts/latest 엔드포인트를 호출합니다.
100
+ */
101
+ exports.createAppUserDiscount = createAppUserDiscount;
102
+ const getAppUserDiscount = async ({
103
+ sdkKey,
104
+ userId
105
+ }) => {
106
+ try {
107
+ const response = await axiosInstance.get('/app-user-discounts/latest', {
108
+ params: {
109
+ sdkKey,
110
+ appUserId: userId
111
+ }
112
+ });
113
+ return response.data.discount;
114
+ } catch (error) {
115
+ console.error('Failed to get discount info:', error.message);
116
+ throw new Error(error.response?.data?.message || 'Failed to get discount info');
117
+ }
118
+ };
119
+ exports.getAppUserDiscount = getAppUserDiscount;
120
+ //# sourceMappingURL=ApiRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_axios","_interopRequireDefault","require","_lib","_reactNative","e","__esModule","default","axiosInstance","axios","create","baseURL","initialize","sdkKey","userId","response","post","platform","version","getSDKVersion","abTestGroupResponse","Platform","OS","organizationId","data","organization_id","group","campaign","error","console","message","Error","exports","createEvent","eventName","createdAt","value","Date","predict","log","createAppUserDiscount","discountInfo","appUserId","startedAt","endedAt","discount","getAppUserDiscount","get","params"],"sourceRoot":"../../src","sources":["ApiRequest.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = MonetaiProvider;
7
+ var _react = require("react");
8
+ var _reactNative = require("react-native");
9
+ var _MonetaiSDK = _interopRequireDefault(require("./MonetaiSDK.js"));
10
+ var _ApiRequest = require("./ApiRequest.js");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ // MonetaiProvider.tsx
14
+
15
+ const styles = _reactNative.StyleSheet.create({
16
+ container: {
17
+ flex: 1
18
+ }
19
+ });
20
+ /**
21
+ * 클라이언트 측에서 이 컴포넌트로 전체 앱을 감싸주면,
22
+ * SDK 초기화 + Event Emitter 구독 + 배너 렌더링을 한곳에서 처리할 수 있음
23
+ */
24
+ function MonetaiProvider({
25
+ children,
26
+ onDiscountInfoChange
27
+ }) {
28
+ const [discountInfo, setDiscountInfo] = (0, _react.useState)(null);
29
+ (0, _react.useEffect)(() => {
30
+ const emitter = _MonetaiSDK.default.getEmitter();
31
+ const onLoadDiscountInfo = async () => {
32
+ const userId = await _MonetaiSDK.default.getUserId();
33
+ const sdkKey = await _MonetaiSDK.default.getSdkKey();
34
+ if (userId == null || sdkKey == null) {
35
+ console.warn('onLoadDiscountInfo: User ID or SDK Key is not set.');
36
+ return;
37
+ }
38
+ const discount = await (0, _ApiRequest.getAppUserDiscount)({
39
+ userId,
40
+ sdkKey
41
+ });
42
+ if (discount != null && discount.app_user_id !== userId) {
43
+ return;
44
+ }
45
+ setDiscountInfo(discount == null ? null : {
46
+ startedAt: discount.started_at,
47
+ endedAt: discount.ended_at,
48
+ userId: discount.app_user_id,
49
+ sdkKey: discount.sdk_key
50
+ });
51
+ };
52
+ emitter.on('LOAD_DISCOUNT_INFO', onLoadDiscountInfo);
53
+ return () => {
54
+ emitter.off('LOAD_DISCOUNT_INFO', onLoadDiscountInfo);
55
+ };
56
+ }, []);
57
+ (0, _react.useEffect)(() => {
58
+ if (onDiscountInfoChange) {
59
+ onDiscountInfoChange(discountInfo);
60
+ }
61
+ }, [onDiscountInfoChange, discountInfo]);
62
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
63
+ style: styles.container,
64
+ children: children
65
+ });
66
+ }
67
+ //# sourceMappingURL=MonetaiProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNative","_MonetaiSDK","_interopRequireDefault","_ApiRequest","_jsxRuntime","e","__esModule","default","styles","StyleSheet","create","container","flex","MonetaiProvider","children","onDiscountInfoChange","discountInfo","setDiscountInfo","useState","useEffect","emitter","monetaiSDK","getEmitter","onLoadDiscountInfo","userId","getUserId","sdkKey","getSdkKey","console","warn","discount","getAppUserDiscount","app_user_id","startedAt","started_at","endedAt","ended_at","sdk_key","on","off","jsx","View","style"],"sourceRoot":"../../src","sources":["MonetaiProvider.tsx"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,WAAA,GAAAJ,OAAA;AAAkD,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAG,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AALlD;;AAOA,MAAMG,MAAM,GAAGC,uBAAU,CAACC,MAAM,CAAC;EAC/BC,SAAS,EAAE;IAAEC,IAAI,EAAE;EAAE;AACvB,CAAC,CAAC;AAYF;AACA;AACA;AACA;AACe,SAASC,eAAeA,CAAC;EACtCC,QAAQ;EACRC;AACoB,CAAC,EAAE;EACvB,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAG,IAAAC,eAAQ,EAAsB,IAAI,CAAC;EAE3E,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,OAAO,GAAGC,mBAAU,CAACC,UAAU,CAAC,CAAC;IACvC,MAAMC,kBAAkB,GAAG,MAAAA,CAAA,KAAY;MACrC,MAAMC,MAAM,GAAG,MAAMH,mBAAU,CAACI,SAAS,CAAC,CAAC;MAC3C,MAAMC,MAAM,GAAG,MAAML,mBAAU,CAACM,SAAS,CAAC,CAAC;MAE3C,IAAIH,MAAM,IAAI,IAAI,IAAIE,MAAM,IAAI,IAAI,EAAE;QACpCE,OAAO,CAACC,IAAI,CAAC,oDAAoD,CAAC;QAClE;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAM,IAAAC,8BAAkB,EAAC;QAAEP,MAAM;QAAEE;MAAO,CAAC,CAAC;MAC7D,IAAII,QAAQ,IAAI,IAAI,IAAIA,QAAQ,CAACE,WAAW,KAAKR,MAAM,EAAE;QACvD;MACF;MAEAP,eAAe,CACba,QAAQ,IAAI,IAAI,GACZ,IAAI,GACJ;QACEG,SAAS,EAAEH,QAAQ,CAACI,UAAU;QAC9BC,OAAO,EAAEL,QAAQ,CAACM,QAAQ;QAC1BZ,MAAM,EAAEM,QAAQ,CAACE,WAAW;QAC5BN,MAAM,EAAEI,QAAQ,CAACO;MACnB,CACN,CAAC;IACH,CAAC;IAEDjB,OAAO,CAACkB,EAAE,CAAC,oBAAoB,EAAEf,kBAAkB,CAAC;IAEpD,OAAO,MAAM;MACXH,OAAO,CAACmB,GAAG,CAAC,oBAAoB,EAAEhB,kBAAkB,CAAC;IACvD,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,IAAAJ,gBAAS,EAAC,MAAM;IACd,IAAIJ,oBAAoB,EAAE;MACxBA,oBAAoB,CAACC,YAAY,CAAC;IACpC;EACF,CAAC,EAAE,CAACD,oBAAoB,EAAEC,YAAY,CAAC,CAAC;EAExC,oBACE,IAAAZ,WAAA,CAAAoC,GAAA,EAACxC,YAAA,CAAAyC,IAAI;IAACC,KAAK,EAAElC,MAAM,CAACG,SAAU;IAAAG,QAAA,EAE3BA;EAAQ,CACL,CAAC;AAEX","ignoreList":[]}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _mitt = _interopRequireDefault(require("mitt"));
9
+ var _dayjs = _interopRequireDefault(require("dayjs"));
10
+ var _ApiRequest = _interopRequireWildcard(require("./ApiRequest.js"));
11
+ var ApiRequest = _ApiRequest;
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ const LINKING_ERROR = `The package '@hayanmind/monetai-react-native' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
15
+ ios: "- You have run 'pod install'\n",
16
+ default: ''
17
+ }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
18
+ const MonetaiReactNative = _reactNative.NativeModules.MonetaiReactNative ? _reactNative.NativeModules.MonetaiReactNative : new Proxy({}, {
19
+ get() {
20
+ throw new Error(LINKING_ERROR);
21
+ }
22
+ });
23
+
24
+ // Emitter로 사용할 이벤트 타입 정의
25
+
26
+ class MonetaiSDK {
27
+ exposureTimeSec = null;
28
+ initialized = false;
29
+
30
+ // SDK 초기화 전에 로깅된 이벤트들을 저장할 큐
31
+ pendingEvents = [];
32
+
33
+ // Event Emitter
34
+ emitter = (0, _mitt.default)();
35
+
36
+ // emitter를 노출해서 Provider가 구독할 수 있게 함
37
+ getEmitter() {
38
+ return this.emitter;
39
+ }
40
+ getExposureTimeSec() {
41
+ return this.exposureTimeSec;
42
+ }
43
+
44
+ /**
45
+ * 모넷AI SDK를 초기화합니다
46
+ * @param userId 사용자 고유 ID (필수)
47
+ * @param useStoreKit2 StoreKit2를 사용할지 여부 (기본값: false)
48
+ * - true: iOS 15+ 기기에서 StoreKit2 사용 (권장)
49
+ * - false: 모든 기기에서 StoreKit1 사용
50
+ * @returns 성공 시 Promise<void>
51
+ */
52
+ async initialize({
53
+ sdkKey,
54
+ userId,
55
+ useStoreKit2 = false
56
+ }) {
57
+ if (!userId) {
58
+ throw new Error('userId is required');
59
+ }
60
+ if (!sdkKey) {
61
+ throw new Error('sdkKey is required');
62
+ }
63
+
64
+ // SDK 키를 네이티브에 저장
65
+ await MonetaiReactNative.setSdkKey(sdkKey);
66
+
67
+ // userId 설정
68
+ await MonetaiReactNative.setUserId(userId);
69
+
70
+ // 트랜잭션 관찰 시작
71
+ await MonetaiReactNative.startObserving(useStoreKit2);
72
+
73
+ // iOS 영수증 전송 (ios 플랫폼에서만 호출)
74
+ if (_reactNative.Platform.OS === 'ios') {
75
+ MonetaiReactNative.sendReceipt().catch(err => {
76
+ console.error('Failed to send receipt', err);
77
+ });
78
+ }
79
+ const result = await ApiRequest.initialize({
80
+ sdkKey,
81
+ userId
82
+ });
83
+ this.exposureTimeSec = result.campaign?.exposure_time_sec ?? null;
84
+ this.initialized = true;
85
+
86
+ // SDK 초기화 후, 초기화 전에 저장된 pendingEvents를 전송
87
+ const pendingPromises = this.pendingEvents.map(async ({
88
+ eventName,
89
+ value,
90
+ createdAt
91
+ }) => {
92
+ await ApiRequest.createEvent({
93
+ sdkKey,
94
+ userId,
95
+ eventName,
96
+ value,
97
+ createdAt
98
+ });
99
+ console.log('[MonetaiSDK] Logged pending event', eventName, value);
100
+ });
101
+ Promise.all(pendingPromises).then(() => {
102
+ this.pendingEvents = [];
103
+ });
104
+ this.emitter.emit('LOAD_DISCOUNT_INFO');
105
+ return {
106
+ organizationId: result.organizationId,
107
+ platform: 'react_native',
108
+ version: result.version,
109
+ userId: userId,
110
+ group: result.group
111
+ };
112
+ }
113
+ async logEvent({
114
+ eventName
115
+ }) {
116
+ const sdkKey = await this.getSdkKey();
117
+ const userId = await this.getUserId();
118
+
119
+ // SDK가 아직 초기화되지 않은 경우, 이벤트를 pendingEvents에 저장
120
+ if (!sdkKey || !userId) {
121
+ console.log('[MonetaiSDK] Pending event', eventName);
122
+ this.pendingEvents.push({
123
+ eventName,
124
+ createdAt: new Date()
125
+ });
126
+ return;
127
+ }
128
+ await ApiRequest.createEvent({
129
+ sdkKey,
130
+ userId,
131
+ eventName
132
+ });
133
+ console.log('[MonetaiSDK] Logged event', eventName);
134
+ }
135
+
136
+ // Non-Purchaser 예측
137
+ async predict() {
138
+ const sdkKey = await this.getSdkKey();
139
+ const userId = await this.getUserId();
140
+ if (!sdkKey || !userId || !this.exposureTimeSec) {
141
+ throw new Error('MonetaiSDK is not initialized. Call initialize() first.');
142
+ }
143
+ const result = await ApiRequest.predict({
144
+ userId,
145
+ sdkKey
146
+ });
147
+ if (result.prediction === 'non-purchaser') {
148
+ const discountInfo = await ApiRequest.getAppUserDiscount({
149
+ sdkKey,
150
+ userId
151
+ });
152
+ const hasActiveDiscount = discountInfo != null && discountInfo.app_user_id === userId && (0, _dayjs.default)(discountInfo.ended_at).isAfter((0, _dayjs.default)());
153
+ console.log('hasActiveDiscount', hasActiveDiscount);
154
+ if (!hasActiveDiscount) {
155
+ const startedAt = (0, _dayjs.default)();
156
+ const endedAt = startedAt.clone().add(this.exposureTimeSec, 'second');
157
+ await (0, _ApiRequest.createAppUserDiscount)({
158
+ startedAt: startedAt.toDate(),
159
+ endedAt: endedAt.toDate(),
160
+ userId,
161
+ sdkKey
162
+ });
163
+ this.emitter.emit('LOAD_DISCOUNT_INFO');
164
+ }
165
+ }
166
+ return result;
167
+ }
168
+ getInitialized() {
169
+ return this.initialized;
170
+ }
171
+ async getUserId() {
172
+ try {
173
+ const userId = await MonetaiReactNative.getUserId();
174
+ return userId;
175
+ } catch (error) {
176
+ console.error('[MonetaiSDK] getUserId error', error);
177
+ return null;
178
+ }
179
+ }
180
+ async getSdkKey() {
181
+ try {
182
+ const sdkKey = await MonetaiReactNative.getSdkKey();
183
+ return sdkKey;
184
+ } catch (error) {
185
+ console.error('[MonetaiSDK] getSdkKey error', error);
186
+ return null;
187
+ }
188
+ }
189
+ async reset() {
190
+ await MonetaiReactNative.reset();
191
+ this.initialized = false;
192
+ }
193
+ }
194
+
195
+ // 싱글턴으로 export
196
+ const monetaiSDK = new MonetaiSDK();
197
+ var _default = exports.default = monetaiSDK;
198
+ //# sourceMappingURL=MonetaiSDK.js.map
@@ -0,0 +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","startObserving","OS","sendReceipt","catch","err","console","error","result","campaign","exposure_time_sec","pendingPromises","map","eventName","value","createdAt","createEvent","log","Promise","all","then","emit","organizationId","platform","version","group","logEvent","getSdkKey","getUserId","push","Date","predict","prediction","discountInfo","getAppUserDiscount","hasActiveDiscount","app_user_id","dayjs","ended_at","isAfter","startedAt","endedAt","clone","add","createAppUserDiscount","toDate","getInitialized","reset","monetaiSDK","_default","exports"],"sourceRoot":"../../src","sources":["MonetaiSDK.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "MonetaiProvider", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _MonetaiProvider.default;
10
+ }
11
+ });
12
+ exports.default = void 0;
13
+ var _MonetaiSDK = _interopRequireDefault(require("./MonetaiSDK.js"));
14
+ var _MonetaiProvider = _interopRequireDefault(require("./MonetaiProvider.js"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ var _default = exports.default = _MonetaiSDK.default;
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_MonetaiSDK","_interopRequireDefault","require","_MonetaiProvider","e","__esModule","default","_default","exports","MonetaiSDK"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAAgD,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAF,OAAA,GAEjCG,mBAAU","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getSDKVersion = getSDKVersion;
7
+ function getSDKVersion() {
8
+ // __SDK_VERSION__이 정의되어 있으면 해당 값을 사용
9
+ if (typeof "0.2.4" === 'string') {
10
+ return "0.2.4";
11
+ }
12
+
13
+ // 그렇지 않으면, package.json을 lazy하게 불러와 version을 반환
14
+ try {
15
+ // 주의: require 사용 시 번들링 및 환경에 따라 결과가 달라질 수 있음
16
+ // 라이브러리라면 외부에 의존하지 않도록 조심해야 합니다.
17
+ const pkg = require('../package.json');
18
+ return pkg.version;
19
+ } catch (error) {
20
+ console.warn('package.json에서 version을 불러올 수 없습니다.', error);
21
+ return 'unknown';
22
+ }
23
+ }
24
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getSDKVersion","pkg","require","version","error","console","warn"],"sourceRoot":"../../src","sources":["lib.ts"],"mappings":";;;;;;AAAO,SAASA,aAAaA,CAAA,EAAW;EACtC;EACA,IAAI,cAAsB,KAAK,QAAQ,EAAE;IACvC;EACF;;EAEA;EACA,IAAI;IACF;IACA;IACA,MAAMC,GAAG,GAAGC,OAAO,CAAC,iBAAiB,CAAC;IACtC,OAAOD,GAAG,CAACE,OAAO;EACpB,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdC,OAAO,CAACC,IAAI,CAAC,qCAAqC,EAAEF,KAAK,CAAC;IAC1D,OAAO,SAAS;EAClB;AACF","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=global.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["types/global.d.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ import axios from 'axios';
4
+ import { getSDKVersion } from "./lib.js";
5
+ import { Platform } from 'react-native';
6
+ const axiosInstance = axios.create({
7
+ baseURL: 'https://monetai-api-414410537412.us-central1.run.app/sdk' // 필요에 따라 베이스 URL 설정
8
+ });
9
+ export const initialize = async ({
10
+ sdkKey,
11
+ userId
12
+ }) => {
13
+ try {
14
+ const response = await axiosInstance.post('/sdk-integrations', {
15
+ sdkKey,
16
+ platform: 'react_native',
17
+ version: getSDKVersion()
18
+ });
19
+ const abTestGroupResponse = await axiosInstance.post('/ab-test', {
20
+ sdkKey,
21
+ userId,
22
+ platform: Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' : null
23
+ });
24
+ return {
25
+ organizationId: response.data.organization_id,
26
+ platform: response.data.platform,
27
+ version: response.data.version,
28
+ group: abTestGroupResponse.data.group,
29
+ campaign: abTestGroupResponse.data.campaign
30
+ };
31
+ } catch (error) {
32
+ console.error('Failed to initialize integration:', error.message);
33
+ throw new Error(error.response?.data?.message || 'Integration initialization failed');
34
+ }
35
+ };
36
+ export const createEvent = async ({
37
+ sdkKey,
38
+ userId,
39
+ eventName,
40
+ createdAt,
41
+ value
42
+ }) => {
43
+ try {
44
+ await axiosInstance.post('/events', {
45
+ sdkKey,
46
+ userId,
47
+ eventName,
48
+ createdAt: createdAt ?? new Date(),
49
+ value,
50
+ platform: Platform.OS === 'ios' ? 'ios' : Platform.OS === 'android' ? 'android' : null
51
+ });
52
+ } catch (error) {
53
+ console.error('Failed to log event:', error.message);
54
+ throw new Error(error.response?.data?.message || 'Failed to log event');
55
+ }
56
+ };
57
+ export const predict = async ({
58
+ userId,
59
+ sdkKey
60
+ }) => {
61
+ console.log('Predicting user:', userId);
62
+ try {
63
+ const response = await axiosInstance.post('/predict', {
64
+ sdkKey,
65
+ userId
66
+ });
67
+ return response.data;
68
+ } catch (error) {
69
+ console.error('Failed to get A/B test group:', error.message);
70
+ throw new Error(error.response?.data?.message || 'Failed to get A/B test group');
71
+ }
72
+ };
73
+ export const createAppUserDiscount = async discountInfo => {
74
+ try {
75
+ const response = await axiosInstance.post('/app-user-discounts', {
76
+ sdkKey: discountInfo.sdkKey,
77
+ appUserId: discountInfo.userId,
78
+ startedAt: discountInfo.startedAt,
79
+ endedAt: discountInfo.endedAt
80
+ });
81
+ console.log('response', response);
82
+ return response.data.discount;
83
+ } catch (error) {
84
+ console.error('Failed to set discount info:', error.message);
85
+ throw new Error(error.response?.data?.message || 'Failed to set discount info');
86
+ }
87
+ };
88
+
89
+ /**
90
+ * sdkKey와 app_user_id에 해당하는 가장 최근 할인 정보를 조회합니다.
91
+ * API GET /app-user-discounts/latest 엔드포인트를 호출합니다.
92
+ */
93
+ export const getAppUserDiscount = async ({
94
+ sdkKey,
95
+ userId
96
+ }) => {
97
+ try {
98
+ const response = await axiosInstance.get('/app-user-discounts/latest', {
99
+ params: {
100
+ sdkKey,
101
+ appUserId: userId
102
+ }
103
+ });
104
+ return response.data.discount;
105
+ } catch (error) {
106
+ console.error('Failed to get discount info:', error.message);
107
+ throw new Error(error.response?.data?.message || 'Failed to get discount info');
108
+ }
109
+ };
110
+ //# sourceMappingURL=ApiRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["axios","getSDKVersion","Platform","axiosInstance","create","baseURL","initialize","sdkKey","userId","response","post","platform","version","abTestGroupResponse","OS","organizationId","data","organization_id","group","campaign","error","console","message","Error","createEvent","eventName","createdAt","value","Date","predict","log","createAppUserDiscount","discountInfo","appUserId","startedAt","endedAt","discount","getAppUserDiscount","get","params"],"sourceRoot":"../../src","sources":["ApiRequest.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ // MonetaiProvider.tsx
4
+ import { useEffect, useState } from 'react';
5
+ import { StyleSheet, View } from 'react-native';
6
+ import monetaiSDK from "./MonetaiSDK.js";
7
+ import { getAppUserDiscount } from "./ApiRequest.js";
8
+ import { jsx as _jsx } from "react/jsx-runtime";
9
+ const styles = StyleSheet.create({
10
+ container: {
11
+ flex: 1
12
+ }
13
+ });
14
+ /**
15
+ * 클라이언트 측에서 이 컴포넌트로 전체 앱을 감싸주면,
16
+ * SDK 초기화 + Event Emitter 구독 + 배너 렌더링을 한곳에서 처리할 수 있음
17
+ */
18
+ export default function MonetaiProvider({
19
+ children,
20
+ onDiscountInfoChange
21
+ }) {
22
+ const [discountInfo, setDiscountInfo] = useState(null);
23
+ useEffect(() => {
24
+ const emitter = monetaiSDK.getEmitter();
25
+ const onLoadDiscountInfo = async () => {
26
+ const userId = await monetaiSDK.getUserId();
27
+ const sdkKey = await monetaiSDK.getSdkKey();
28
+ if (userId == null || sdkKey == null) {
29
+ console.warn('onLoadDiscountInfo: User ID or SDK Key is not set.');
30
+ return;
31
+ }
32
+ const discount = await getAppUserDiscount({
33
+ userId,
34
+ sdkKey
35
+ });
36
+ if (discount != null && discount.app_user_id !== userId) {
37
+ return;
38
+ }
39
+ setDiscountInfo(discount == null ? null : {
40
+ startedAt: discount.started_at,
41
+ endedAt: discount.ended_at,
42
+ userId: discount.app_user_id,
43
+ sdkKey: discount.sdk_key
44
+ });
45
+ };
46
+ emitter.on('LOAD_DISCOUNT_INFO', onLoadDiscountInfo);
47
+ return () => {
48
+ emitter.off('LOAD_DISCOUNT_INFO', onLoadDiscountInfo);
49
+ };
50
+ }, []);
51
+ useEffect(() => {
52
+ if (onDiscountInfoChange) {
53
+ onDiscountInfoChange(discountInfo);
54
+ }
55
+ }, [onDiscountInfoChange, discountInfo]);
56
+ return /*#__PURE__*/_jsx(View, {
57
+ style: styles.container,
58
+ children: children
59
+ });
60
+ }
61
+ //# sourceMappingURL=MonetaiProvider.js.map