@apps-in-toss/framework 0.0.0-dev.1752115036458 → 0.0.0-dev.1753241576118

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 CHANGED
@@ -34,44 +34,34 @@ __export(src_exports, {
34
34
  Accuracy: () => Accuracy2,
35
35
  Analytics: () => Analytics2,
36
36
  AppsInToss: () => AppsInToss,
37
- AppsInTossModule: () => AppsInTossModule,
38
- BedrockCoreModule: () => BedrockCoreModule,
39
- BedrockModule: () => BedrockModule,
40
37
  GoogleAdMob: () => GoogleAdMob,
41
- INTERNAL__AppsInTossModule: () => AppsInTossModuleInstance,
42
- INTERNAL__module: () => INTERNAL__module,
38
+ IAP: () => IAP,
39
+ INTERNAL__onVisibilityChangedByTransparentServiceWeb: () => INTERNAL__onVisibilityChangedByTransparentServiceWeb,
43
40
  Storage: () => Storage,
44
41
  TossPay: () => TossPay,
45
42
  WebView: () => WebView,
46
43
  appLogin: () => appLogin,
47
44
  appsInTossEvent: () => appsInTossEvent,
48
- closeView: () => closeView,
49
45
  env: () => env,
50
46
  eventLog: () => eventLog,
51
47
  fetchAlbumPhotos: () => fetchAlbumPhotos,
52
48
  fetchContacts: () => fetchContacts,
53
- generateHapticFeedback: () => generateHapticFeedback,
54
49
  getClipboardText: () => getClipboardText,
55
50
  getCurrentLocation: () => getCurrentLocation,
56
51
  getDeviceId: () => getDeviceId,
57
- getLocale: () => getLocale,
58
- getNetworkStatus: () => getNetworkStatus,
52
+ getGameCenterGameProfile: () => getGameCenterGameProfile,
59
53
  getOperationalEnvironment: () => getOperationalEnvironment,
60
- getPlatformOS: () => getPlatformOS,
61
- getSchemeUri: () => getSchemeUri,
62
54
  getTossAppVersion: () => getTossAppVersion,
63
55
  getTossShareLink: () => getTossShareLink,
64
56
  isMinVersionSupported: () => isMinVersionSupported,
65
57
  openCamera: () => openCamera,
66
- openURL: () => openURL,
58
+ openGameCenterLeaderboard: () => openGameCenterLeaderboard,
67
59
  saveBase64Data: () => saveBase64Data,
68
60
  setClipboardText: () => setClipboardText,
69
61
  setDeviceOrientation: () => setDeviceOrientation,
70
- setIosSwipeGestureEnabled: () => setIosSwipeGestureEnabled,
71
- setScreenAwakeMode: () => setScreenAwakeMode,
72
- setSecureScreen: () => setSecureScreen,
73
- share: () => share,
74
62
  startUpdateLocation: () => startUpdateLocation,
63
+ submitGameCenterLeaderBoardScore: () => submitGameCenterLeaderBoardScore,
64
+ useCreateUserAgent: () => useCreateUserAgent,
75
65
  useGeolocation: () => useGeolocation
76
66
  });
77
67
  module.exports = __toCommonJS(src_exports);
@@ -79,30 +69,210 @@ var import_analytics2 = require("@apps-in-toss/analytics");
79
69
 
80
70
  // src/core/registerApp.tsx
81
71
  var import_analytics = require("@apps-in-toss/analytics");
82
- var import_react_native28 = require("@granite-js/react-native");
83
- var import_react_native29 = require("@toss-design-system/react-native");
72
+ var import_react_native6 = require("@toss-design-system/react-native");
73
+ var import_react_native_bedrock9 = require("react-native-bedrock");
84
74
 
85
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/dist/index.js
86
- var import_react_native = require("@granite-js/react-native");
87
- var import_react_native2 = require("@granite-js/react-native");
88
- var import_react_native3 = require("@granite-js/react-native");
89
- var import_react_native4 = require("react-native");
90
- var import_react_native5 = require("react-native");
91
- var import_react_native6 = require("@granite-js/react-native");
75
+ // src/core/components/AppEvent.tsx
76
+ var import_react2 = require("react");
77
+ var import_react_native_bedrock2 = require("react-native-bedrock");
92
78
 
93
- // ../../.yarn/cache/es-toolkit-npm-1.39.3-b94f623c91-1c85e518b1.zip/node_modules/es-toolkit/dist/function/noop.mjs
94
- function noop() {
79
+ // src/env.ts
80
+ var env = {
81
+ getDeploymentId: () => __DEV__ ? "local" : global.__appsInToss?.deploymentId
82
+ };
83
+
84
+ // src/native-modules/tossCore.ts
85
+ var import_react_native3 = require("react-native");
86
+
87
+ // src/native-modules/AppsInTossModule.ts
88
+ var import_react_native = require("react-native");
89
+ var AppsInTossModuleInstance = import_react_native.NativeModules.AppsInTossModule;
90
+ var AppsInTossModule = AppsInTossModuleInstance;
91
+
92
+ // src/native-modules/getOperationalEnvironment.ts
93
+ function getOperationalEnvironment() {
94
+ return AppsInTossModule.operationalEnvironment;
95
95
  }
96
96
 
97
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/dist/index.js
98
- var import_react_native7 = require("react-native");
99
- var import_react_native8 = require("react-native");
100
- var import_react_native9 = require("react-native");
101
- var import_react_native10 = require("react-native");
102
- var import_react_native11 = require("react-native");
103
- var import_react_native12 = require("react-native");
104
- var import_react_native13 = require("react-native");
105
- var EntryMessageExitedEvent = class extends import_react_native2.GraniteEventDefinition {
97
+ // src/native-modules/isMinVersionSupported.ts
98
+ var import_react_native2 = require("react-native");
99
+
100
+ // src/utils/compareVersion.ts
101
+ var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
102
+ var isWildcard = (val) => ["*", "x", "X"].includes(val);
103
+ var tryParse = (val) => {
104
+ const num = parseInt(val, 10);
105
+ return isNaN(num) ? val : num;
106
+ };
107
+ var coerceTypes = (a, b) => {
108
+ return typeof a === typeof b ? [a, b] : [String(a), String(b)];
109
+ };
110
+ var compareValues = (a, b) => {
111
+ if (isWildcard(a) || isWildcard(b)) {
112
+ return 0;
113
+ }
114
+ const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
115
+ if (aVal > bVal) {
116
+ return 1;
117
+ }
118
+ if (aVal < bVal) {
119
+ return -1;
120
+ }
121
+ return 0;
122
+ };
123
+ var parseVersion = (version) => {
124
+ if (typeof version !== "string") {
125
+ throw new TypeError("Invalid argument: expected a string");
126
+ }
127
+ const match = version.match(SEMVER_REGEX);
128
+ if (!match) {
129
+ throw new Error(`Invalid semver: '${version}'`);
130
+ }
131
+ const [, major, minor, patch, build, preRelease] = match;
132
+ return [major, minor, patch, build, preRelease];
133
+ };
134
+ var compareSegments = (a, b) => {
135
+ const maxLength = Math.max(a.length, b.length);
136
+ for (let i = 0; i < maxLength; i++) {
137
+ const segA = a[i] ?? "0";
138
+ const segB = b[i] ?? "0";
139
+ const result = compareValues(segA, segB);
140
+ if (result !== 0) {
141
+ return result;
142
+ }
143
+ }
144
+ return 0;
145
+ };
146
+ var compareVersions = (v1, v2) => {
147
+ const seg1 = parseVersion(v1);
148
+ const seg2 = parseVersion(v2);
149
+ const preRelease1 = seg1.pop();
150
+ const preRelease2 = seg2.pop();
151
+ const mainCompare = compareSegments(seg1, seg2);
152
+ if (mainCompare !== 0) {
153
+ return mainCompare;
154
+ }
155
+ if (preRelease1 && preRelease2) {
156
+ return compareSegments(preRelease1.split("."), preRelease2.split("."));
157
+ }
158
+ if (preRelease1) {
159
+ return -1;
160
+ }
161
+ if (preRelease2) {
162
+ return 1;
163
+ }
164
+ return 0;
165
+ };
166
+
167
+ // src/native-modules/isMinVersionSupported.ts
168
+ function isMinVersionSupported(minVersions) {
169
+ const operationalEnvironment2 = AppsInTossModule.operationalEnvironment;
170
+ if (operationalEnvironment2 === "sandbox") {
171
+ return true;
172
+ }
173
+ const currentVersion = AppsInTossModule.tossAppVersion;
174
+ const isIOS = import_react_native2.Platform.OS === "ios";
175
+ const minVersion = isIOS ? minVersions.ios : minVersions.android;
176
+ if (minVersion === void 0) {
177
+ return false;
178
+ }
179
+ if (minVersion === "always") {
180
+ return true;
181
+ }
182
+ if (minVersion === "never") {
183
+ return false;
184
+ }
185
+ return compareVersions(currentVersion, minVersion) >= 0;
186
+ }
187
+
188
+ // src/native-modules/tossCore.ts
189
+ var TossCoreModule = import_react_native3.NativeModules.TossCoreModule;
190
+ function tossCoreEventLog(params) {
191
+ const supported = isMinVersionSupported({ ios: "5.210.0", android: "5.210.0" });
192
+ const isSandbox = getOperationalEnvironment() === "sandbox";
193
+ if (!supported || isSandbox) {
194
+ return;
195
+ }
196
+ TossCoreModule.eventLog({
197
+ params: {
198
+ log_name: params.log_name,
199
+ log_type: params.log_type,
200
+ params: params.params
201
+ }
202
+ });
203
+ }
204
+
205
+ // src/core/hooks/useReferrer.ts
206
+ var import_react = require("react");
207
+ var import_react_native_bedrock = require("react-native-bedrock");
208
+ function useReferrer() {
209
+ return (0, import_react.useMemo)(() => {
210
+ try {
211
+ return new URL((0, import_react_native_bedrock.getSchemeUri)()).searchParams.get("referrer");
212
+ } catch {
213
+ return null;
214
+ }
215
+ }, []);
216
+ }
217
+
218
+ // src/core/components/AppEvent.tsx
219
+ var ENTRY_APP_EVENT_SCHEMA_ID = 1562181;
220
+ function isPrivateScheme() {
221
+ try {
222
+ return new URL((0, import_react_native_bedrock2.getSchemeUri)()).protocol === "intoss-private:";
223
+ } catch {
224
+ return false;
225
+ }
226
+ }
227
+ function EntryAppEvent() {
228
+ const referrer = useReferrer() ?? "";
229
+ (0, import_react2.useEffect)(() => {
230
+ tossCoreEventLog({
231
+ log_name: "appsintoss_app_visit::impression__enter_appsintoss",
232
+ log_type: "info",
233
+ params: {
234
+ is_transform: true,
235
+ schema_id: ENTRY_APP_EVENT_SCHEMA_ID,
236
+ referrer,
237
+ deployment_id: env.getDeploymentId(),
238
+ app_name: import_react_native_bedrock2.Bedrock.appName,
239
+ is_private: isPrivateScheme()
240
+ }
241
+ });
242
+ }, [referrer]);
243
+ return null;
244
+ }
245
+ function SystemAppEvent({ ...initialProps }) {
246
+ (0, import_react2.useEffect)(() => {
247
+ tossCoreEventLog({
248
+ log_name: "AppsInTossInitialProps",
249
+ log_type: "debug",
250
+ params: {
251
+ ...initialProps,
252
+ schemeUri: (0, import_react_native_bedrock2.getSchemeUri)(),
253
+ deployment_id: env.getDeploymentId(),
254
+ app_name: import_react_native_bedrock2.Bedrock.appName,
255
+ is_private: isPrivateScheme()
256
+ }
257
+ });
258
+ }, [initialProps]);
259
+ return null;
260
+ }
261
+ var AppEvent = {
262
+ Entry: EntryAppEvent,
263
+ System: SystemAppEvent
264
+ };
265
+
266
+ // src/core/hooks/useAppsInTossBridge.ts
267
+ var import_react_native5 = require("@toss-design-system/react-native");
268
+ var import_react3 = require("react");
269
+
270
+ // src/native-event-emitter/appsInTossEvent.ts
271
+ var import_react_native_bedrock7 = require("react-native-bedrock");
272
+
273
+ // src/native-event-emitter/event-plugins/EntryMessageExitedEvent.ts
274
+ var import_react_native_bedrock3 = require("react-native-bedrock");
275
+ var EntryMessageExitedEvent = class extends import_react_native_bedrock3.BedrockEventDefinition {
106
276
  name = "entryMessageExited";
107
277
  remove() {
108
278
  }
@@ -110,15 +280,21 @@ var EntryMessageExitedEvent = class extends import_react_native2.GraniteEventDef
110
280
  listener(_) {
111
281
  }
112
282
  };
113
- var Module = import_react_native4.TurboModuleRegistry.getEnforcing("AppsInTossModule");
114
- var AppsInTossModuleInstance = Module;
115
- var AppsInTossModule = Module;
283
+
284
+ // src/native-event-emitter/event-plugins/UpdateLocationEvent.ts
285
+ var import_react_native_bedrock4 = require("react-native-bedrock");
286
+
287
+ // src/native-modules/getPermission.ts
116
288
  function getPermission(permission) {
117
289
  return AppsInTossModule.getPermission(permission);
118
290
  }
291
+
292
+ // src/native-modules/openPermissionDialog.ts
119
293
  function openPermissionDialog(permission) {
120
294
  return AppsInTossModule.openPermissionDialog(permission);
121
295
  }
296
+
297
+ // src/native-modules/requestPermission.ts
122
298
  async function requestPermission(permission) {
123
299
  const permissionStatus = await getPermission(permission);
124
300
  switch (permissionStatus) {
@@ -129,8 +305,13 @@ async function requestPermission(permission) {
129
305
  return openPermissionDialog(permission);
130
306
  }
131
307
  }
132
- var nativeEventEmitter = new import_react_native5.NativeEventEmitter(AppsInTossModuleInstance);
133
- var UpdateLocationEvent = class extends import_react_native3.GraniteEventDefinition {
308
+
309
+ // src/native-event-emitter/nativeEventEmitter.ts
310
+ var import_react_native4 = require("react-native");
311
+ var nativeEventEmitter = new import_react_native4.NativeEventEmitter(AppsInTossModuleInstance);
312
+
313
+ // src/native-event-emitter/event-plugins/UpdateLocationEvent.ts
314
+ var UpdateLocationEvent = class extends import_react_native_bedrock4.BedrockEventDefinition {
134
315
  name = "updateLocationEvent";
135
316
  subscriptionCount = 0;
136
317
  ref = {
@@ -158,9 +339,16 @@ var UpdateLocationEvent = class extends import_react_native3.GraniteEventDefinit
158
339
  }).catch(onError);
159
340
  }
160
341
  };
342
+
343
+ // src/native-event-emitter/internal/AppBridgeCallbackEvent.ts
344
+ var import_react_native_bedrock5 = require("react-native-bedrock");
345
+
346
+ // src/utils/generateUUID.ts
161
347
  function generateUUID(placeholder) {
162
348
  return placeholder ? (placeholder ^ Math.random() * 16 >> placeholder / 4).toString(16) : (String(1e7) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, generateUUID);
163
349
  }
350
+
351
+ // src/native-event-emitter/internal/appBridge.ts
164
352
  var INTERNAL__callbacks = /* @__PURE__ */ new Map();
165
353
  function invokeAppBridgeCallback(id, ...args) {
166
354
  const callback = INTERNAL__callbacks.get(id);
@@ -207,8 +395,10 @@ var INTERNAL__appBridgeHandler = {
207
395
  unregisterCallback,
208
396
  getCallbackIds
209
397
  };
398
+
399
+ // src/native-event-emitter/internal/AppBridgeCallbackEvent.ts
210
400
  var UNSAFE__nativeEventEmitter = nativeEventEmitter;
211
- var AppBridgeCallbackEvent = class _AppBridgeCallbackEvent extends import_react_native6.GraniteEventDefinition {
401
+ var AppBridgeCallbackEvent = class _AppBridgeCallbackEvent extends import_react_native_bedrock5.BedrockEventDefinition {
212
402
  static INTERNAL__appBridgeSubscription;
213
403
  name = "appBridgeCallbackEvent";
214
404
  constructor() {
@@ -236,204 +426,96 @@ var AppBridgeCallbackEvent = class _AppBridgeCallbackEvent extends import_react_
236
426
  }
237
427
  }
238
428
  };
239
- var appsInTossEvent = new import_react_native.GraniteEvent([
240
- new AppBridgeCallbackEvent(),
241
- new UpdateLocationEvent(),
242
- new EntryMessageExitedEvent()
243
- ]);
244
- function startUpdateLocation(eventParams) {
245
- return appsInTossEvent.addEventListener("updateLocationEvent", eventParams);
246
- }
247
- function getOperationalEnvironment() {
248
- return AppsInTossModule.operationalEnvironment;
249
- }
250
- var SEMVER_REGEX = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
251
- var isWildcard = (val) => ["*", "x", "X"].includes(val);
252
- var tryParse = (val) => {
253
- const num = parseInt(val, 10);
254
- return isNaN(num) ? val : num;
255
- };
256
- var coerceTypes = (a, b) => {
257
- return typeof a === typeof b ? [a, b] : [String(a), String(b)];
258
- };
259
- var compareValues = (a, b) => {
260
- if (isWildcard(a) || isWildcard(b)) {
261
- return 0;
262
- }
263
- const [aVal, bVal] = coerceTypes(tryParse(a), tryParse(b));
264
- if (aVal > bVal) {
265
- return 1;
266
- }
267
- if (aVal < bVal) {
268
- return -1;
429
+
430
+ // src/native-event-emitter/internal/VisibilityChangedByTransparentServiceWebEvent.ts
431
+ var import_react_native_bedrock6 = require("react-native-bedrock");
432
+ var VisibilityChangedByTransparentServiceWebEvent = class extends import_react_native_bedrock6.BedrockEventDefinition {
433
+ name = "onVisibilityChangedByTransparentServiceWeb";
434
+ subscription = null;
435
+ remove() {
436
+ this.subscription?.remove();
437
+ this.subscription = null;
269
438
  }
270
- return 0;
271
- };
272
- var parseVersion = (version) => {
273
- if (typeof version !== "string") {
274
- throw new TypeError("Invalid argument: expected a string");
439
+ listener(options, onEvent, onError) {
440
+ const subscription = nativeEventEmitter.addListener("visibilityChangedByTransparentServiceWeb", (params) => {
441
+ if (this.isVisibilityChangedByTransparentServiceWebResult(params)) {
442
+ if (params.callbackId === options.callbackId) {
443
+ onEvent(params.isVisible);
444
+ }
445
+ } else {
446
+ onError(new Error("Invalid visibility changed by transparent service web result"));
447
+ }
448
+ });
449
+ this.subscription = subscription;
275
450
  }
276
- const match = version.match(SEMVER_REGEX);
277
- if (!match) {
278
- throw new Error(`Invalid semver: '${version}'`);
451
+ isVisibilityChangedByTransparentServiceWebResult(params) {
452
+ return typeof params === "object" && typeof params.callbackId === "string" && typeof params.isVisible === "boolean";
279
453
  }
280
- const [, major, minor, patch, build, preRelease] = match;
281
- return [major, minor, patch, build, preRelease];
282
454
  };
283
- var compareSegments = (a, b) => {
284
- const maxLength = Math.max(a.length, b.length);
285
- for (let i = 0; i < maxLength; i++) {
286
- const segA = a[i] ?? "0";
287
- const segB = b[i] ?? "0";
288
- const result = compareValues(segA, segB);
289
- if (result !== 0) {
290
- return result;
291
- }
455
+
456
+ // src/native-event-emitter/appsInTossEvent.ts
457
+ var appsInTossEvent = new import_react_native_bedrock7.BedrockEvent([
458
+ new UpdateLocationEvent(),
459
+ new EntryMessageExitedEvent(),
460
+ // Internal events
461
+ new AppBridgeCallbackEvent(),
462
+ new VisibilityChangedByTransparentServiceWebEvent()
463
+ ]);
464
+
465
+ // src/core/utils/getAppsInTossGlobals.ts
466
+ function getAppsInTossGlobals() {
467
+ if (global.__appsInToss == null) {
468
+ throw new Error("invalid apps-in-toss globals");
292
469
  }
293
- return 0;
294
- };
295
- var compareVersions = (v1, v2) => {
296
- const seg1 = parseVersion(v1);
297
- const seg2 = parseVersion(v2);
298
- const preRelease1 = seg1.pop();
299
- const preRelease2 = seg2.pop();
300
- const mainCompare = compareSegments(seg1, seg2);
301
- if (mainCompare !== 0) {
302
- return mainCompare;
303
- }
304
- if (preRelease1 && preRelease2) {
305
- return compareSegments(preRelease1.split("."), preRelease2.split("."));
306
- }
307
- if (preRelease1) {
308
- return -1;
309
- }
310
- if (preRelease2) {
311
- return 1;
312
- }
313
- return 0;
314
- };
315
- function isMinVersionSupported(minVersions) {
316
- const operationalEnvironment2 = AppsInTossModule.operationalEnvironment;
317
- if (operationalEnvironment2 === "sandbox") {
318
- return true;
319
- }
320
- const currentVersion = AppsInTossModule.tossAppVersion;
321
- const isIOS = import_react_native7.Platform.OS === "ios";
322
- const minVersion = isIOS ? minVersions.ios : minVersions.android;
323
- if (minVersion === void 0) {
324
- return false;
325
- }
326
- if (minVersion === "always") {
327
- return true;
328
- }
329
- if (minVersion === "never") {
330
- return false;
331
- }
332
- return compareVersions(currentVersion, minVersion) >= 0;
333
- }
334
- function loadAdMobInterstitialAd(params) {
335
- if (!loadAdMobInterstitialAd.isSupported()) {
336
- params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
337
- return noop;
338
- }
339
- const { onEvent, onError, options } = params;
340
- const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("loadAdMobInterstitialAd", options, {
341
- onAdClicked: () => {
342
- onEvent({ type: "clicked" });
343
- },
344
- onAdDismissed: () => {
345
- onEvent({ type: "dismissed" });
346
- },
347
- onAdFailedToShow: () => {
348
- onEvent({ type: "failedToShow" });
349
- },
350
- onAdImpression: () => {
351
- onEvent({ type: "impression" });
352
- },
353
- onAdShow: () => {
354
- onEvent({ type: "show" });
355
- },
356
- onSuccess: (result) => onEvent({ type: "loaded", data: result }),
357
- onError
358
- });
359
- return unregisterCallbacks;
360
- }
361
- function showAdMobInterstitialAd(params) {
362
- if (!showAdMobInterstitialAd.isSupported()) {
363
- params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
364
- return noop;
365
- }
366
- const { onEvent, onError, options } = params;
367
- const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("showAdMobInterstitialAd", options, {
368
- onSuccess: () => onEvent({ type: "requested" }),
369
- onError
370
- });
371
- return unregisterCallbacks;
372
- }
373
- function loadAdMobRewardedAd(params) {
374
- if (!loadAdMobRewardedAd.isSupported()) {
375
- params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
376
- return noop;
377
- }
378
- const { onEvent, onError, options } = params;
379
- const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("loadAdMobRewardedAd", options, {
380
- onAdClicked: () => {
381
- onEvent({ type: "clicked" });
382
- },
383
- onAdDismissed: () => {
384
- onEvent({ type: "dismissed" });
385
- },
386
- onAdFailedToShow: () => {
387
- onEvent({ type: "failedToShow" });
388
- },
389
- onAdImpression: () => {
390
- onEvent({ type: "impression" });
391
- },
392
- onAdShow: () => {
393
- onEvent({ type: "show" });
394
- },
395
- onUserEarnedReward: () => {
396
- onEvent({ type: "userEarnedReward" });
397
- },
398
- onSuccess: (result) => onEvent({ type: "loaded", data: result }),
399
- onError
400
- });
401
- return unregisterCallbacks;
470
+ return global.__appsInToss;
402
471
  }
403
- function showAdMobRewardedAd(params) {
404
- if (!showAdMobRewardedAd.isSupported()) {
405
- params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
406
- return noop;
407
- }
408
- const { onEvent, onError, options } = params;
409
- const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("showAdMobRewardedAd", options, {
410
- onSuccess: () => onEvent({ type: "requested" }),
411
- onError
412
- });
413
- return unregisterCallbacks;
472
+
473
+ // src/core/utils/toIcon.ts
474
+ function toIcon(source) {
475
+ return source.startsWith("http") ? { source: { uri: source } } : { name: source };
414
476
  }
415
- var ANDROID_GOOGLE_AD_MOB_SUPPORTED_VERSION = "5.209.0";
416
- var IOS_GOOGLE_AD_MOB_SUPPORTED_VERSION = "5.209.0";
417
- var UNSUPPORTED_ERROR_MESSAGE = "This feature is not supported in the current environment";
418
- var ENVIRONMENT = getOperationalEnvironment();
419
- function createIsSupported() {
420
- return () => {
421
- if (ENVIRONMENT !== "toss") {
422
- return false;
423
- }
424
- return isMinVersionSupported({
425
- android: ANDROID_GOOGLE_AD_MOB_SUPPORTED_VERSION,
426
- ios: IOS_GOOGLE_AD_MOB_SUPPORTED_VERSION
477
+
478
+ // src/core/hooks/useAppsInTossBridge.ts
479
+ function useAppsInTossBridge() {
480
+ const controller = (0, import_react_native5.useBridge)();
481
+ const appsInTossGlobals2 = getAppsInTossGlobals();
482
+ (0, import_react3.useEffect)(() => {
483
+ const commonProps = {
484
+ serviceName: appsInTossGlobals2.brandDisplayName,
485
+ icon: toIcon(appsInTossGlobals2.brandIcon),
486
+ color: appsInTossGlobals2.brandPrimaryColor,
487
+ colorMode: appsInTossGlobals2.brandBridgeColorMode
488
+ };
489
+ controller.open({
490
+ ...commonProps,
491
+ onExited: () => {
492
+ appsInTossEvent.emit("entryMessageExited", void 0);
493
+ }
427
494
  });
428
- };
429
- }
430
- loadAdMobInterstitialAd.isSupported = createIsSupported();
431
- loadAdMobRewardedAd.isSupported = createIsSupported();
432
- showAdMobInterstitialAd.isSupported = createIsSupported();
433
- showAdMobRewardedAd.isSupported = createIsSupported();
434
- async function checkoutPayment(options) {
435
- return AppsInTossModule.checkoutPayment({ params: options });
495
+ }, []);
436
496
  }
497
+
498
+ // src/async-bridges.ts
499
+ var async_bridges_exports = {};
500
+ __export(async_bridges_exports, {
501
+ appLogin: () => appLogin,
502
+ checkoutPayment: () => checkoutPayment,
503
+ eventLog: () => eventLog,
504
+ fetchAlbumPhotos: () => fetchAlbumPhotos,
505
+ fetchContacts: () => fetchContacts,
506
+ getClipboardText: () => getClipboardText,
507
+ getCurrentLocation: () => getCurrentLocation,
508
+ getGameCenterGameProfile: () => getGameCenterGameProfile,
509
+ getTossShareLink: () => getTossShareLink,
510
+ openCamera: () => openCamera,
511
+ openGameCenterLeaderboard: () => openGameCenterLeaderboard,
512
+ saveBase64Data: () => saveBase64Data,
513
+ setClipboardText: () => setClipboardText,
514
+ setDeviceOrientation: () => setDeviceOrientation,
515
+ submitGameCenterLeaderBoardScore: () => submitGameCenterLeaderBoardScore
516
+ });
517
+
518
+ // src/native-modules/setClipboardText.ts
437
519
  async function setClipboardText(text) {
438
520
  const permissionStatus = await requestPermission({ name: "clipboard", access: "write" });
439
521
  if (permissionStatus === "denied") {
@@ -441,6 +523,8 @@ async function setClipboardText(text) {
441
523
  }
442
524
  return AppsInTossModule.setClipboardText({ text });
443
525
  }
526
+
527
+ // src/native-modules/getClipboardText.ts
444
528
  async function getClipboardText() {
445
529
  const permissionStatus = await requestPermission({ name: "clipboard", access: "read" });
446
530
  if (permissionStatus === "denied") {
@@ -448,18 +532,30 @@ async function getClipboardText() {
448
532
  }
449
533
  return AppsInTossModule.getClipboardText({});
450
534
  }
451
- async function fetchContacts(options) {
535
+
536
+ // src/native-modules/fetchContacts.ts
537
+ async function fetchContacts({
538
+ size,
539
+ offset,
540
+ query
541
+ }) {
452
542
  const permissionStatus = await requestPermission({ name: "contacts", access: "read" });
453
543
  if (permissionStatus === "denied") {
454
544
  throw new Error("\uC5F0\uB77D\uCC98 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
455
545
  }
456
- const contacts = await AppsInTossModule.fetchContacts(options);
546
+ const contacts = await AppsInTossModule.fetchContacts({
547
+ size,
548
+ offset,
549
+ query
550
+ });
457
551
  return {
458
552
  result: contacts.result,
459
553
  nextOffset: contacts.nextOffset ?? null,
460
554
  done: contacts.done
461
555
  };
462
556
  }
557
+
558
+ // src/native-modules/fetchAlbumPhotos.ts
463
559
  var DEFAULT_MAX_COUNT = 10;
464
560
  var DEFAULT_MAX_WIDTH = 1024;
465
561
  async function fetchAlbumPhotos(options) {
@@ -474,6 +570,8 @@ async function fetchAlbumPhotos(options) {
474
570
  });
475
571
  return albumPhotos;
476
572
  }
573
+
574
+ // src/native-modules/getCurrentLocation.ts
477
575
  async function getCurrentLocation(options) {
478
576
  const permissionStatus = await requestPermission({ name: "geolocation", access: "access" });
479
577
  if (permissionStatus === "denied") {
@@ -482,6 +580,8 @@ async function getCurrentLocation(options) {
482
580
  const position = await AppsInTossModule.getCurrentLocation(options);
483
581
  return position;
484
582
  }
583
+
584
+ // src/native-modules/openCamera.ts
485
585
  async function openCamera(options) {
486
586
  const permissionStatus = await requestPermission({ name: "camera", access: "access" });
487
587
  if (permissionStatus === "denied") {
@@ -490,36 +590,18 @@ async function openCamera(options) {
490
590
  const photo = await AppsInTossModule.openCamera({ base64: false, maxWidth: 1024, ...options });
491
591
  return photo;
492
592
  }
593
+
594
+ // src/native-modules/appLogin.ts
493
595
  async function appLogin() {
494
596
  return AppsInTossModule.appLogin({});
495
597
  }
496
- function getTossAppVersion() {
497
- return AppsInTossModule.tossAppVersion;
498
- }
499
- function getDeviceId() {
500
- return AppsInTossModule.deviceId;
501
- }
502
- function getItem(key) {
503
- return AppsInTossModule.getStorageItem({ key });
504
- }
505
- function setItem(key, value) {
506
- return AppsInTossModule.setStorageItem({
507
- key,
508
- value
509
- });
510
- }
511
- function removeItem(key) {
512
- return AppsInTossModule.removeStorageItem({ key });
513
- }
514
- function clearItems() {
515
- return AppsInTossModule.clearStorage({});
598
+
599
+ // src/native-modules/checkoutPayment.ts
600
+ async function checkoutPayment(options) {
601
+ return AppsInTossModule.checkoutPayment({ params: options });
516
602
  }
517
- var Storage = {
518
- getItem,
519
- setItem,
520
- removeItem,
521
- clearItems
522
- };
603
+
604
+ // src/native-modules/eventLog.ts
523
605
  function normalizeParams(params) {
524
606
  return Object.fromEntries(
525
607
  Object.entries(params).filter(([, value]) => value !== void 0).map(([key, value]) => [key, String(value)])
@@ -547,6 +629,8 @@ async function eventLog(params) {
547
629
  params: normalizeParams(params.params)
548
630
  });
549
631
  }
632
+
633
+ // src/native-modules/getTossShareLink.ts
550
634
  async function getTossShareLink(path) {
551
635
  const { shareLink } = await AppsInTossModule.getTossShareLink({});
552
636
  const shareUrl = new URL(shareLink);
@@ -554,6 +638,8 @@ async function getTossShareLink(path) {
554
638
  shareUrl.searchParams.set("af_dp", path);
555
639
  return shareUrl.toString();
556
640
  }
641
+
642
+ // src/native-modules/setDeviceOrientation.ts
557
643
  async function setDeviceOrientation(options) {
558
644
  const isSupported = isMinVersionSupported({
559
645
  android: "5.215.0",
@@ -564,6 +650,8 @@ async function setDeviceOrientation(options) {
564
650
  }
565
651
  return AppsInTossModule.setDeviceOrientation(options);
566
652
  }
653
+
654
+ // src/native-modules/saveBase64Data.ts
567
655
  async function saveBase64Data(params) {
568
656
  const isSupported = isMinVersionSupported({
569
657
  android: "5.218.0",
@@ -575,807 +663,616 @@ async function saveBase64Data(params) {
575
663
  }
576
664
  await AppsInTossModule.saveBase64Data(params);
577
665
  }
578
- var TossPay = {
579
- checkoutPayment
580
- };
581
- var GoogleAdMob = {
582
- loadAdMobInterstitialAd,
583
- showAdMobInterstitialAd,
584
- loadAdMobRewardedAd,
585
- showAdMobRewardedAd
666
+
667
+ // src/constant/game-center.ts
668
+ var GAME_PROFILE_WEBVIEW_URL = "https://service.toss.im/game-center/profile";
669
+ var GAME_CENTER_MIN_VERSION = {
670
+ android: "5.221.0",
671
+ ios: "5.221.0"
586
672
  };
587
- var BedrockModule = import_react_native8.NativeModules.BedrockModule;
588
- async function closeView() {
589
- return BedrockModule.closeView();
590
- }
591
- function getLocale() {
592
- const locale = BedrockModule?.DeviceInfo?.locale ?? "ko-KR";
593
- if (import_react_native9.Platform.OS === "android") {
594
- return replaceUnderbarToHypen(locale);
673
+
674
+ // src/native-modules/getGameCenterGameProfile.ts
675
+ async function getGameCenterGameProfile() {
676
+ const isSupported = isMinVersionSupported(GAME_CENTER_MIN_VERSION);
677
+ if (!isSupported) {
678
+ return;
595
679
  }
596
- return locale;
597
- }
598
- function replaceUnderbarToHypen(locale) {
599
- return locale.replace(/_/g, "-");
680
+ return AppsInTossModule.getGameCenterGameProfile({});
600
681
  }
601
- function getSchemeUri() {
602
- return BedrockModule.schemeUri;
603
- }
604
- function generateHapticFeedback(options) {
605
- return BedrockModule.generateHapticFeedback(options);
606
- }
607
- async function share(message) {
608
- BedrockModule.share(message);
609
- }
610
- function setSecureScreen(options) {
611
- return BedrockModule.setSecureScreen(options);
612
- }
613
- async function setScreenAwakeMode(options) {
614
- return BedrockModule.setScreenAwakeMode(options);
615
- }
616
- function getNetworkStatus() {
617
- return BedrockModule.getNetworkStatus();
618
- }
619
- async function setIosSwipeGestureEnabled(options) {
620
- if (BedrockModule.setIosSwipeGestureEnabled == null) {
682
+
683
+ // src/native-modules/openGameCenterLeaderboard.ts
684
+ var import_react_native_bedrock8 = require("react-native-bedrock");
685
+ async function openGameCenterLeaderboard() {
686
+ if (!isMinVersionSupported(GAME_CENTER_MIN_VERSION)) {
621
687
  return;
622
688
  }
623
- return BedrockModule.setIosSwipeGestureEnabled(options);
624
- }
625
- function openURL(url) {
626
- return import_react_native10.Linking.openURL(url);
689
+ const url = new URL("servicetoss://game-center/leaderboard?_navbar=hide");
690
+ url.searchParams.set("appName", getAppName());
691
+ url.searchParams.set("referrer", `appsintoss.${getAppName()}`);
692
+ return (0, import_react_native_bedrock8.openURL)(url.toString());
627
693
  }
628
- function getPlatformOS() {
629
- return import_react_native11.Platform.OS;
630
- }
631
- var BedrockCoreModule = import_react_native12.NativeModules.BedrockCoreModule;
632
- var Accuracy2 = /* @__PURE__ */ ((Accuracy3) => {
633
- Accuracy3[Accuracy3["Lowest"] = 1] = "Lowest";
634
- Accuracy3[Accuracy3["Low"] = 2] = "Low";
635
- Accuracy3[Accuracy3["Balanced"] = 3] = "Balanced";
636
- Accuracy3[Accuracy3["High"] = 4] = "High";
637
- Accuracy3[Accuracy3["Highest"] = 5] = "Highest";
638
- Accuracy3[Accuracy3["BestForNavigation"] = 6] = "BestForNavigation";
639
- return Accuracy3;
640
- })(Accuracy2 || {});
641
- var TossCoreModule = import_react_native13.NativeModules.TossCoreModule;
642
- function tossCoreEventLog(params) {
643
- const supported = isMinVersionSupported({ ios: "5.210.0", android: "5.210.0" });
644
- const isSandbox = getOperationalEnvironment() === "sandbox";
645
- if (!supported || isSandbox) {
694
+
695
+ // src/native-modules/submitGameCenterLeaderBoardScore.ts
696
+ async function submitGameCenterLeaderBoardScore(params) {
697
+ const isSupported = isMinVersionSupported(GAME_CENTER_MIN_VERSION);
698
+ if (!isSupported) {
646
699
  return;
647
700
  }
648
- TossCoreModule.eventLog({
649
- params: {
650
- log_name: params.log_name,
651
- log_type: params.log_type,
652
- params: params.params
653
- }
654
- });
701
+ return AppsInTossModule.submitGameCenterLeaderBoardScore(params);
655
702
  }
656
- var INTERNAL__module = {
657
- tossCoreEventLog
658
- };
659
703
 
660
- // src/core/components/AppEvent.tsx
661
- var import_react_native15 = require("@granite-js/react-native");
662
- var import_react2 = require("react");
663
-
664
- // src/env.ts
665
- var env = {
666
- getDeploymentId: () => __DEV__ ? "local" : global.__appsInToss?.deploymentId
667
- };
668
-
669
- // src/core/hooks/useReferrer.ts
670
- var import_react_native14 = require("@granite-js/react-native");
671
- var import_react = require("react");
672
- function useReferrer() {
673
- return (0, import_react.useMemo)(() => {
674
- try {
675
- return new URL((0, import_react_native14.getSchemeUri)()).searchParams.get("referrer");
676
- } catch {
677
- return null;
678
- }
679
- }, []);
680
- }
681
-
682
- // src/core/components/AppEvent.tsx
683
- var ENTRY_APP_EVENT_SCHEMA_ID = 1562181;
684
- function isPrivateScheme() {
685
- try {
686
- return new URL((0, import_react_native15.getSchemeUri)()).protocol === "intoss-private:";
687
- } catch {
688
- return false;
689
- }
690
- }
691
- function EntryAppEvent() {
692
- const referrer = useReferrer() ?? "";
693
- (0, import_react2.useEffect)(() => {
694
- INTERNAL__module.tossCoreEventLog({
695
- log_name: "appsintoss_app_visit::impression__enter_appsintoss",
696
- log_type: "info",
697
- params: {
698
- is_transform: true,
699
- schema_id: ENTRY_APP_EVENT_SCHEMA_ID,
700
- referrer,
701
- deployment_id: env.getDeploymentId(),
702
- app_name: import_react_native15.Granite.appName,
703
- is_private: isPrivateScheme()
704
- }
705
- });
706
- }, [referrer]);
707
- return null;
708
- }
709
- function SystemAppEvent({ ...initialProps }) {
710
- (0, import_react2.useEffect)(() => {
711
- INTERNAL__module.tossCoreEventLog({
712
- log_name: "AppsInTossInitialProps",
713
- log_type: "debug",
714
- params: {
715
- ...initialProps,
716
- schemeUri: (0, import_react_native15.getSchemeUri)(),
717
- deployment_id: env.getDeploymentId(),
718
- app_name: import_react_native15.Granite.appName,
719
- is_private: isPrivateScheme()
720
- }
721
- });
722
- }, [initialProps]);
723
- return null;
724
- }
725
- var AppEvent = {
726
- Entry: EntryAppEvent,
727
- System: SystemAppEvent
728
- };
729
-
730
- // src/core/hooks/useAppsInTossBridge.ts
731
- var import_react_native16 = require("@toss-design-system/react-native");
732
- var import_react3 = require("react");
733
-
734
- // src/core/utils/getAppsInTossGlobals.ts
735
- function getAppsInTossGlobals() {
736
- if (global.__appsInToss == null) {
737
- throw new Error("invalid apps-in-toss globals");
738
- }
739
- return global.__appsInToss;
704
+ // src/core/registerApp.tsx
705
+ var import_jsx_runtime = require("react/jsx-runtime");
706
+ function AppsInTossContainer(Container, { children, ...initialProps }) {
707
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
708
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppEvent.Entry, {}),
709
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppEvent.System, { ...initialProps }),
710
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Container, { ...initialProps, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_native6.TDSProvider, { colorPreference: "light", token: { color: { primary: getAppsInTossGlobals().brandPrimaryColor } }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TDSContainer, { ...initialProps, children }) }) })
711
+ ] });
740
712
  }
741
-
742
- // src/core/utils/toIcon.ts
743
- function toIcon(source) {
744
- return source.startsWith("http") ? { source: { uri: source } } : { name: source };
713
+ function TDSContainer({ children }) {
714
+ useAppsInTossBridge();
715
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
745
716
  }
746
-
747
- // src/core/hooks/useAppsInTossBridge.ts
748
- function useAppsInTossBridge() {
749
- const controller = (0, import_react_native16.useBridge)();
750
- const appsInTossGlobals2 = getAppsInTossGlobals();
751
- (0, import_react3.useEffect)(() => {
752
- const commonProps = {
753
- serviceName: appsInTossGlobals2.brandDisplayName,
754
- icon: toIcon(appsInTossGlobals2.brandIcon),
755
- color: appsInTossGlobals2.brandPrimaryColor,
756
- colorMode: appsInTossGlobals2.brandBridgeColorMode
757
- };
758
- controller.open({
759
- ...commonProps,
760
- onExited: () => {
761
- appsInTossEvent.emit("entryMessageExited", void 0);
717
+ function registerApp(container, { context, analytics }) {
718
+ import_analytics.Analytics.init({
719
+ logger: (params) => void eventLog(params),
720
+ debug: analytics?.debug ?? __DEV__
721
+ });
722
+ return import_react_native_bedrock9.Bedrock.registerApp(AppsInTossContainer.bind(null, container), {
723
+ appName: getAppName(),
724
+ context,
725
+ router: {
726
+ screenContainer: import_analytics.Analytics.Screen,
727
+ defaultScreenOption: {
728
+ statusBarStyle: "dark"
762
729
  }
763
- });
764
- }, []);
765
- }
766
-
767
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/async-bridges.ts
768
- var async_bridges_exports = {};
769
- __export(async_bridges_exports, {
770
- appLogin: () => appLogin2,
771
- checkoutPayment: () => checkoutPayment2,
772
- closeView: () => closeView2,
773
- eventLog: () => eventLog2,
774
- fetchAlbumPhotos: () => fetchAlbumPhotos2,
775
- fetchContacts: () => fetchContacts2,
776
- generateHapticFeedback: () => generateHapticFeedback2,
777
- getClipboardText: () => getClipboardText2,
778
- getCurrentLocation: () => getCurrentLocation2,
779
- getNetworkStatus: () => getNetworkStatus2,
780
- getTossShareLink: () => getTossShareLink2,
781
- openCamera: () => openCamera2,
782
- openURL: () => openURL2,
783
- saveBase64Data: () => saveBase64Data2,
784
- setClipboardText: () => setClipboardText2,
785
- setDeviceOrientation: () => setDeviceOrientation2,
786
- setIosSwipeGestureEnabled: () => setIosSwipeGestureEnabled2,
787
- setScreenAwakeMode: () => setScreenAwakeMode2,
788
- setSecureScreen: () => setSecureScreen2,
789
- share: () => share2
790
- });
791
-
792
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/BedrockModule.ts
793
- var import_react_native17 = require("react-native");
794
- var BedrockModule2 = import_react_native17.NativeModules.BedrockModule;
795
-
796
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/closeView.ts
797
- async function closeView2() {
798
- return BedrockModule2.closeView();
799
- }
800
-
801
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/generateHapticFeedback/index.ts
802
- function generateHapticFeedback2(options) {
803
- return BedrockModule2.generateHapticFeedback(options);
804
- }
805
-
806
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/share.ts
807
- async function share2(message) {
808
- BedrockModule2.share(message);
809
- }
810
-
811
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/setSecureScreen.ts
812
- function setSecureScreen2(options) {
813
- return BedrockModule2.setSecureScreen(options);
814
- }
815
-
816
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/setScreenAwakeMode.ts
817
- async function setScreenAwakeMode2(options) {
818
- return BedrockModule2.setScreenAwakeMode(options);
819
- }
820
-
821
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/getNetworkStatus/index.ts
822
- function getNetworkStatus2() {
823
- return BedrockModule2.getNetworkStatus();
730
+ }
731
+ });
824
732
  }
825
-
826
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/setIosSwipeGestureEnabled.ts
827
- async function setIosSwipeGestureEnabled2(options) {
828
- if (BedrockModule2.setIosSwipeGestureEnabled == null) {
829
- return;
733
+ function getAppName() {
734
+ try {
735
+ return global.__bedrock.app.name;
736
+ } catch (error) {
737
+ console.error("unexpected error occurred while getting app name");
738
+ throw error;
830
739
  }
831
- return BedrockModule2.setIosSwipeGestureEnabled(options);
832
- }
833
-
834
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/openURL.ts
835
- var import_react_native18 = require("react-native");
836
- function openURL2(url) {
837
- return import_react_native18.Linking.openURL(url);
838
- }
839
-
840
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/AppsInTossModule.ts
841
- var import_react_native19 = require("react-native");
842
- var Module2 = import_react_native19.TurboModuleRegistry.getEnforcing("AppsInTossModule");
843
- var AppsInTossModuleInstance2 = Module2;
844
- var AppsInTossModule2 = Module2;
845
-
846
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getPermission.ts
847
- function getPermission2(permission) {
848
- return AppsInTossModule2.getPermission(permission);
849
740
  }
850
741
 
851
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/openPermissionDialog.ts
852
- function openPermissionDialog2(permission) {
853
- return AppsInTossModule2.openPermissionDialog(permission);
854
- }
855
-
856
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/requestPermission.ts
857
- async function requestPermission2(permission) {
858
- const permissionStatus = await getPermission2(permission);
859
- switch (permissionStatus) {
860
- case "allowed":
861
- case "denied":
862
- return permissionStatus;
863
- default:
864
- return openPermissionDialog2(permission);
865
- }
866
- }
742
+ // src/core/index.ts
743
+ var AppsInToss = {
744
+ registerApp
745
+ };
867
746
 
868
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/setClipboardText.ts
869
- async function setClipboardText2(text) {
870
- const permissionStatus = await requestPermission2({ name: "clipboard", access: "write" });
871
- if (permissionStatus === "denied") {
872
- throw new Error("\uD074\uB9BD\uBCF4\uB4DC \uC4F0\uAE30 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
873
- }
874
- return AppsInTossModule2.setClipboardText({ text });
747
+ // src/native-event-emitter/startUpdateLocation.ts
748
+ function startUpdateLocation(eventParams) {
749
+ return appsInTossEvent.addEventListener("updateLocationEvent", eventParams);
875
750
  }
876
751
 
877
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getClipboardText.ts
878
- async function getClipboardText2() {
879
- const permissionStatus = await requestPermission2({ name: "clipboard", access: "read" });
880
- if (permissionStatus === "denied") {
881
- throw new Error("\uD074\uB9BD\uBCF4\uB4DC \uC77D\uAE30 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
882
- }
883
- return AppsInTossModule2.getClipboardText({});
752
+ // ../../.yarn/cache/es-toolkit-npm-1.34.1-4cd6371dcb-aab6d07be3.zip/node_modules/es-toolkit/dist/function/noop.mjs
753
+ function noop() {
884
754
  }
885
755
 
886
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/fetchContacts.ts
887
- async function fetchContacts2(options) {
888
- const permissionStatus = await requestPermission2({ name: "contacts", access: "read" });
889
- if (permissionStatus === "denied") {
890
- throw new Error("\uC5F0\uB77D\uCC98 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
756
+ // src/native-modules/ads/googleAdMob.ts
757
+ function loadAdMobInterstitialAd(params) {
758
+ if (!loadAdMobInterstitialAd.isSupported()) {
759
+ params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
760
+ return noop;
891
761
  }
892
- const contacts = await AppsInTossModule2.fetchContacts(options);
893
- return {
894
- result: contacts.result,
895
- nextOffset: contacts.nextOffset ?? null,
896
- done: contacts.done
897
- };
762
+ const { onEvent, onError, options } = params;
763
+ const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("loadAdMobInterstitialAd", options, {
764
+ onAdClicked: () => {
765
+ onEvent({ type: "clicked" });
766
+ },
767
+ onAdDismissed: () => {
768
+ onEvent({ type: "dismissed" });
769
+ },
770
+ onAdFailedToShow: () => {
771
+ onEvent({ type: "failedToShow" });
772
+ },
773
+ onAdImpression: () => {
774
+ onEvent({ type: "impression" });
775
+ },
776
+ onAdShow: () => {
777
+ onEvent({ type: "show" });
778
+ },
779
+ onSuccess: (result) => onEvent({ type: "loaded", data: result }),
780
+ onError
781
+ });
782
+ return unregisterCallbacks;
898
783
  }
899
-
900
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/fetchAlbumPhotos.ts
901
- var DEFAULT_MAX_COUNT2 = 10;
902
- var DEFAULT_MAX_WIDTH2 = 1024;
903
- async function fetchAlbumPhotos2(options) {
904
- const permissionStatus = await requestPermission2({ name: "photos", access: "read" });
905
- if (permissionStatus === "denied") {
906
- throw new Error("\uC0AC\uC9C4\uCCA9 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
784
+ function showAdMobInterstitialAd(params) {
785
+ if (!showAdMobInterstitialAd.isSupported()) {
786
+ params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
787
+ return noop;
907
788
  }
908
- const albumPhotos = await AppsInTossModule2.fetchAlbumPhotos({
909
- ...options,
910
- maxCount: options.maxCount ?? DEFAULT_MAX_COUNT2,
911
- maxWidth: options.maxWidth ?? DEFAULT_MAX_WIDTH2
789
+ const { onEvent, onError, options } = params;
790
+ const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("showAdMobInterstitialAd", options, {
791
+ onSuccess: () => onEvent({ type: "requested" }),
792
+ onError
912
793
  });
913
- return albumPhotos;
794
+ return unregisterCallbacks;
914
795
  }
915
-
916
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getCurrentLocation.ts
917
- async function getCurrentLocation2(options) {
918
- const permissionStatus = await requestPermission2({ name: "geolocation", access: "access" });
919
- if (permissionStatus === "denied") {
920
- throw new Error("\uC704\uCE58 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
796
+ function loadAdMobRewardedAd(params) {
797
+ if (!loadAdMobRewardedAd.isSupported()) {
798
+ params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
799
+ return noop;
921
800
  }
922
- const position = await AppsInTossModule2.getCurrentLocation(options);
923
- return position;
801
+ const { onEvent, onError, options } = params;
802
+ const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("loadAdMobRewardedAd", options, {
803
+ onAdClicked: () => {
804
+ onEvent({ type: "clicked" });
805
+ },
806
+ onAdDismissed: () => {
807
+ onEvent({ type: "dismissed" });
808
+ },
809
+ onAdFailedToShow: () => {
810
+ onEvent({ type: "failedToShow" });
811
+ },
812
+ onAdImpression: () => {
813
+ onEvent({ type: "impression" });
814
+ },
815
+ onAdShow: () => {
816
+ onEvent({ type: "show" });
817
+ },
818
+ onUserEarnedReward: () => {
819
+ onEvent({ type: "userEarnedReward" });
820
+ },
821
+ onSuccess: (result) => onEvent({ type: "loaded", data: result }),
822
+ onError
823
+ });
824
+ return unregisterCallbacks;
924
825
  }
925
-
926
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/openCamera.ts
927
- async function openCamera2(options) {
928
- const permissionStatus = await requestPermission2({ name: "camera", access: "access" });
929
- if (permissionStatus === "denied") {
930
- throw new Error("\uCE74\uBA54\uB77C \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694.");
826
+ function showAdMobRewardedAd(params) {
827
+ if (!showAdMobRewardedAd.isSupported()) {
828
+ params.onError(new Error(UNSUPPORTED_ERROR_MESSAGE));
829
+ return noop;
931
830
  }
932
- const photo = await AppsInTossModule2.openCamera({ base64: false, maxWidth: 1024, ...options });
933
- return photo;
934
- }
935
-
936
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/appLogin.ts
937
- async function appLogin2() {
938
- return AppsInTossModule2.appLogin({});
831
+ const { onEvent, onError, options } = params;
832
+ const unregisterCallbacks = INTERNAL__appBridgeHandler.invokeAppBridgeMethod("showAdMobRewardedAd", options, {
833
+ onSuccess: () => onEvent({ type: "requested" }),
834
+ onError
835
+ });
836
+ return unregisterCallbacks;
939
837
  }
940
-
941
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/isMinVersionSupported.ts
942
- var import_react_native20 = require("react-native");
943
-
944
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/utils/compareVersion.ts
945
- var SEMVER_REGEX2 = /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\\-]+(?:\.[\da-z\\-]+)*))?(?:\+[\da-z\\-]+(?:\.[\da-z\\-]+)*)?)?)?$/i;
946
- var isWildcard2 = (val) => ["*", "x", "X"].includes(val);
947
- var tryParse2 = (val) => {
948
- const num = parseInt(val, 10);
949
- return isNaN(num) ? val : num;
950
- };
951
- var coerceTypes2 = (a, b) => {
952
- return typeof a === typeof b ? [a, b] : [String(a), String(b)];
953
- };
954
- var compareValues2 = (a, b) => {
955
- if (isWildcard2(a) || isWildcard2(b)) {
956
- return 0;
957
- }
958
- const [aVal, bVal] = coerceTypes2(tryParse2(a), tryParse2(b));
959
- if (aVal > bVal) {
960
- return 1;
961
- }
962
- if (aVal < bVal) {
963
- return -1;
964
- }
965
- return 0;
966
- };
967
- var parseVersion2 = (version) => {
968
- if (typeof version !== "string") {
969
- throw new TypeError("Invalid argument: expected a string");
970
- }
971
- const match = version.match(SEMVER_REGEX2);
972
- if (!match) {
973
- throw new Error(`Invalid semver: '${version}'`);
974
- }
975
- const [, major, minor, patch, build, preRelease] = match;
976
- return [major, minor, patch, build, preRelease];
977
- };
978
- var compareSegments2 = (a, b) => {
979
- const maxLength = Math.max(a.length, b.length);
980
- for (let i = 0; i < maxLength; i++) {
981
- const segA = a[i] ?? "0";
982
- const segB = b[i] ?? "0";
983
- const result = compareValues2(segA, segB);
984
- if (result !== 0) {
985
- return result;
838
+ var ANDROID_GOOGLE_AD_MOB_SUPPORTED_VERSION = "5.209.0";
839
+ var IOS_GOOGLE_AD_MOB_SUPPORTED_VERSION = "5.209.0";
840
+ var UNSUPPORTED_ERROR_MESSAGE = "This feature is not supported in the current environment";
841
+ var ENVIRONMENT = getOperationalEnvironment();
842
+ function createIsSupported() {
843
+ return () => {
844
+ if (ENVIRONMENT !== "toss") {
845
+ return false;
986
846
  }
987
- }
988
- return 0;
989
- };
990
- var compareVersions2 = (v1, v2) => {
991
- const seg1 = parseVersion2(v1);
992
- const seg2 = parseVersion2(v2);
993
- const preRelease1 = seg1.pop();
994
- const preRelease2 = seg2.pop();
995
- const mainCompare = compareSegments2(seg1, seg2);
996
- if (mainCompare !== 0) {
997
- return mainCompare;
998
- }
999
- if (preRelease1 && preRelease2) {
1000
- return compareSegments2(preRelease1.split("."), preRelease2.split("."));
1001
- }
1002
- if (preRelease1) {
1003
- return -1;
1004
- }
1005
- if (preRelease2) {
1006
- return 1;
1007
- }
1008
- return 0;
1009
- };
1010
-
1011
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/isMinVersionSupported.ts
1012
- function isMinVersionSupported2(minVersions) {
1013
- const operationalEnvironment2 = AppsInTossModule2.operationalEnvironment;
1014
- if (operationalEnvironment2 === "sandbox") {
1015
- return true;
1016
- }
1017
- const currentVersion = AppsInTossModule2.tossAppVersion;
1018
- const isIOS = import_react_native20.Platform.OS === "ios";
1019
- const minVersion = isIOS ? minVersions.ios : minVersions.android;
1020
- if (minVersion === void 0) {
1021
- return false;
1022
- }
1023
- if (minVersion === "always") {
1024
- return true;
1025
- }
1026
- if (minVersion === "never") {
1027
- return false;
1028
- }
1029
- return compareVersions2(currentVersion, minVersion) >= 0;
847
+ return isMinVersionSupported({
848
+ android: ANDROID_GOOGLE_AD_MOB_SUPPORTED_VERSION,
849
+ ios: IOS_GOOGLE_AD_MOB_SUPPORTED_VERSION
850
+ });
851
+ };
1030
852
  }
853
+ loadAdMobInterstitialAd.isSupported = createIsSupported();
854
+ loadAdMobRewardedAd.isSupported = createIsSupported();
855
+ showAdMobInterstitialAd.isSupported = createIsSupported();
856
+ showAdMobRewardedAd.isSupported = createIsSupported();
1031
857
 
1032
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/eventLog.ts
1033
- function normalizeParams2(params) {
1034
- return Object.fromEntries(
1035
- Object.entries(params).filter(([, value]) => value !== void 0).map(([key, value]) => [key, String(value)])
1036
- );
1037
- }
1038
- async function eventLog2(params) {
1039
- if (AppsInTossModule2.operationalEnvironment === "sandbox") {
1040
- console.log("[eventLogDebug]", {
1041
- log_name: params.log_name,
1042
- log_type: params.log_type,
1043
- params: normalizeParams2(params.params)
1044
- });
1045
- return;
1046
- }
1047
- const isSupported = isMinVersionSupported2({
1048
- android: "5.208.0",
1049
- ios: "5.208.0"
1050
- });
1051
- if (!isSupported) {
1052
- return;
1053
- }
1054
- return AppsInTossModule2.eventLog({
1055
- log_name: params.log_name,
1056
- log_type: params.log_type,
1057
- params: normalizeParams2(params.params)
1058
- });
858
+ // src/native-modules/getDeviceId.ts
859
+ function getDeviceId() {
860
+ return AppsInTossModule.deviceId;
1059
861
  }
1060
862
 
1061
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getTossShareLink.ts
1062
- async function getTossShareLink2(path) {
1063
- const { shareLink } = await AppsInTossModule2.getTossShareLink({});
1064
- const shareUrl = new URL(shareLink);
1065
- shareUrl.searchParams.set("deep_link_value", path);
1066
- shareUrl.searchParams.set("af_dp", path);
1067
- return shareUrl.toString();
863
+ // src/native-modules/getTossAppVersion.ts
864
+ function getTossAppVersion() {
865
+ return AppsInTossModule.tossAppVersion;
1068
866
  }
1069
867
 
1070
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/setDeviceOrientation.ts
1071
- async function setDeviceOrientation2(options) {
1072
- const isSupported = isMinVersionSupported2({
1073
- android: "5.215.0",
1074
- ios: "5.215.0"
868
+ // src/native-modules/iap.ts
869
+ async function createOneTimePurchaseOrder(params) {
870
+ const isSupported = isMinVersionSupported({
871
+ android: "5.219.0",
872
+ ios: "5.219.0"
1075
873
  });
1076
874
  if (!isSupported) {
1077
875
  return;
1078
876
  }
1079
- return AppsInTossModule2.setDeviceOrientation(options);
1080
- }
1081
-
1082
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/checkoutPayment.ts
1083
- async function checkoutPayment2(options) {
1084
- return AppsInTossModule2.checkoutPayment({ params: options });
877
+ return AppsInTossModule.iapCreateOneTimePurchaseOrder(params);
1085
878
  }
1086
-
1087
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/saveBase64Data.ts
1088
- async function saveBase64Data2(params) {
1089
- const isSupported = isMinVersionSupported2({
1090
- android: "5.218.0",
1091
- ios: "5.216.0"
879
+ async function getProductItemList() {
880
+ const isSupported = isMinVersionSupported({
881
+ android: "5.219.0",
882
+ ios: "5.219.0"
1092
883
  });
1093
884
  if (!isSupported) {
1094
- console.warn("saveBase64Data is not supported in this app version");
1095
885
  return;
1096
886
  }
1097
- await AppsInTossModule2.saveBase64Data(params);
1098
- }
1099
-
1100
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/constant-bridges.ts
1101
- var constant_bridges_exports = {};
1102
- __export(constant_bridges_exports, {
1103
- getDeviceId: () => getDeviceId2,
1104
- getLocale: () => getLocale2,
1105
- getOperationalEnvironment: () => getOperationalEnvironment2,
1106
- getPlatformOS: () => getPlatformOS2,
1107
- getSchemeUri: () => getSchemeUri4,
1108
- getTossAppVersion: () => getTossAppVersion2
1109
- });
1110
-
1111
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/getLocale.ts
1112
- var import_react_native21 = require("react-native");
1113
- function getLocale2() {
1114
- const locale = BedrockModule2?.DeviceInfo?.locale ?? "ko-KR";
1115
- if (import_react_native21.Platform.OS === "android") {
1116
- return replaceUnderbarToHypen2(locale);
1117
- }
1118
- return locale;
1119
- }
1120
- function replaceUnderbarToHypen2(locale) {
1121
- return locale.replace(/_/g, "-");
1122
- }
1123
-
1124
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/getSchemeUri.ts
1125
- function getSchemeUri4() {
1126
- return BedrockModule2.schemeUri;
887
+ return AppsInTossModule.iapGetProductItemList({});
1127
888
  }
889
+ var IAP = {
890
+ createOneTimePurchaseOrder,
891
+ getProductItemList
892
+ };
1128
893
 
1129
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/BedrockModule/native-modules/natives/getPlatformOS.ts
1130
- var import_react_native22 = require("react-native");
1131
- function getPlatformOS2() {
1132
- return import_react_native22.Platform.OS;
894
+ // src/native-modules/storage.ts
895
+ function getItem(key) {
896
+ return AppsInTossModule.getStorageItem({ key });
1133
897
  }
1134
-
1135
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getOperationalEnvironment.ts
1136
- function getOperationalEnvironment2() {
1137
- return AppsInTossModule2.operationalEnvironment;
898
+ function setItem(key, value) {
899
+ return AppsInTossModule.setStorageItem({
900
+ key,
901
+ value
902
+ });
1138
903
  }
1139
-
1140
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getTossAppVersion.ts
1141
- function getTossAppVersion2() {
1142
- return AppsInTossModule2.tossAppVersion;
904
+ function removeItem(key) {
905
+ return AppsInTossModule.removeStorageItem({ key });
1143
906
  }
1144
-
1145
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-modules/getDeviceId.ts
1146
- function getDeviceId2() {
1147
- return AppsInTossModule2.deviceId;
907
+ function clearItems() {
908
+ return AppsInTossModule.clearStorage({});
1148
909
  }
1149
-
1150
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/event-bridges.ts
1151
- var event_bridges_exports = {};
1152
- __export(event_bridges_exports, {
1153
- startUpdateLocation: () => startUpdateLocation2
1154
- });
1155
-
1156
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/appsInTossEvent.ts
1157
- var import_react_native27 = require("@granite-js/react-native");
1158
-
1159
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/event-plugins/EntryMessageExitedEvent.ts
1160
- var import_react_native23 = require("@granite-js/react-native");
1161
- var EntryMessageExitedEvent2 = class extends import_react_native23.GraniteEventDefinition {
1162
- name = "entryMessageExited";
1163
- remove() {
1164
- }
1165
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1166
- listener(_) {
1167
- }
910
+ var Storage = {
911
+ getItem,
912
+ setItem,
913
+ removeItem,
914
+ clearItems
1168
915
  };
1169
916
 
1170
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/event-plugins/UpdateLocationEvent.ts
1171
- var import_react_native25 = require("@granite-js/react-native");
1172
-
1173
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/nativeEventEmitter.ts
1174
- var import_react_native24 = require("react-native");
1175
- var nativeEventEmitter2 = new import_react_native24.NativeEventEmitter(AppsInTossModuleInstance2);
1176
-
1177
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/event-plugins/UpdateLocationEvent.ts
1178
- var UpdateLocationEvent2 = class extends import_react_native25.GraniteEventDefinition {
1179
- name = "updateLocationEvent";
1180
- subscriptionCount = 0;
1181
- ref = {
1182
- remove: () => {
1183
- }
1184
- };
1185
- remove() {
1186
- if (--this.subscriptionCount === 0) {
1187
- AppsInTossModuleInstance2.stopUpdateLocation({});
1188
- }
1189
- this.ref.remove();
1190
- }
1191
- listener(options, onEvent, onError) {
1192
- requestPermission2({ name: "geolocation", access: "access" }).then((permissionStatus) => {
1193
- if (permissionStatus === "denied") {
1194
- onError(new Error("\uC704\uCE58 \uAD8C\uD55C\uC774 \uAC70\uBD80\uB418\uC5C8\uC5B4\uC694."));
1195
- return;
1196
- }
1197
- void AppsInTossModuleInstance2.startUpdateLocation(options).catch(onError);
1198
- const subscription = nativeEventEmitter2.addListener("updateLocation", onEvent);
1199
- this.ref = {
1200
- remove: () => subscription?.remove()
1201
- };
1202
- this.subscriptionCount++;
1203
- }).catch(onError);
1204
- }
917
+ // src/native-modules/index.ts
918
+ var TossPay = {
919
+ checkoutPayment
920
+ };
921
+ var GoogleAdMob = {
922
+ loadAdMobInterstitialAd,
923
+ showAdMobInterstitialAd,
924
+ loadAdMobRewardedAd,
925
+ showAdMobRewardedAd
1205
926
  };
1206
927
 
1207
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/internal/AppBridgeCallbackEvent.ts
1208
- var import_react_native26 = require("@granite-js/react-native");
928
+ // src/components/WebView.tsx
929
+ var import_react_native20 = require("@toss-design-system/react-native");
930
+ var import_private3 = require("@toss-design-system/react-native/private");
931
+ var import_react9 = require("react");
932
+ var import_react_native21 = require("react-native");
933
+ var import_react_native_bedrock16 = require("react-native-bedrock");
934
+ var bedrockAsyncBridges = __toESM(require("react-native-bedrock/async-bridges"), 1);
935
+ var bedrockConstantBridges = __toESM(require("react-native-bedrock/constant-bridges"), 1);
1209
936
 
1210
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/utils/generateUUID.ts
1211
- function generateUUID2(placeholder) {
1212
- return placeholder ? (placeholder ^ Math.random() * 16 >> placeholder / 4).toString(16) : (String(1e7) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, generateUUID2);
1213
- }
937
+ // src/components/GameWebView.tsx
938
+ var import_react_native_webview = require("@react-native-bedrock/native/react-native-webview");
939
+ var import_react_native17 = require("@toss-design-system/react-native");
940
+ var import_es_hangul2 = require("es-hangul");
941
+ var import_react6 = require("react");
942
+ var import_react_native18 = require("react-native");
943
+ var import_react_native_bedrock12 = require("react-native-bedrock");
1214
944
 
1215
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/internal/appBridge.ts
1216
- var INTERNAL__callbacks2 = /* @__PURE__ */ new Map();
1217
- function invokeAppBridgeCallback2(id, ...args) {
1218
- const callback = INTERNAL__callbacks2.get(id);
1219
- callback?.call(null, ...args);
1220
- return Boolean(callback);
1221
- }
1222
- function invokeAppBridgeMethod2(methodName, params, callbacks) {
1223
- const { onSuccess, onError, ...appBridgeCallbacks } = callbacks;
1224
- const { callbackMap, unregisterAll } = registerCallbacks2(appBridgeCallbacks);
1225
- const promise = AppsInTossModuleInstance2[methodName]({
1226
- params,
1227
- callbacks: callbackMap
1228
- });
1229
- void promise.then(onSuccess).catch(onError);
1230
- return unregisterAll;
1231
- }
1232
- function registerCallbacks2(callbacks) {
1233
- const callbackMap = {};
1234
- for (const [callbackName, callback] of Object.entries(callbacks)) {
1235
- const id = registerCallback2(callback, callbackName);
1236
- callbackMap[callbackName] = id;
1237
- }
1238
- const unregisterAll = () => {
1239
- Object.values(callbackMap).forEach(unregisterCallback2);
945
+ // src/components/GameProfile.tsx
946
+ var import_react_native10 = require("@toss-design-system/react-native");
947
+ var import_react5 = require("react");
948
+ var import_react_native11 = require("react-native");
949
+
950
+ // src/hooks/useGameCenterProfile.ts
951
+ var import_react_native9 = require("@toss-design-system/react-native");
952
+ var import_es_hangul = require("es-hangul");
953
+ var import_react4 = require("react");
954
+ var import_react_native_bedrock11 = require("react-native-bedrock");
955
+
956
+ // src/components/GameProfileToast.tsx
957
+ var import_react_native7 = require("@toss-design-system/react-native");
958
+ var import_private = require("@toss-design-system/react-native/private");
959
+ var import_jsx_runtime2 = require("react/jsx-runtime");
960
+ var useGameProfileToast = () => {
961
+ const overlay = (0, import_private.useOverlay)();
962
+ const openGameProfileToast = (nickname, profileImageUri) => {
963
+ return new Promise((resolve) => {
964
+ overlay.open(({ isOpen, close, exit }) => {
965
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_private.ColorPreferenceProvider, { colorPreference: "dark", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_private.AdaptiveColorProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
966
+ import_react_native7.Toast,
967
+ {
968
+ open: isOpen,
969
+ onClose: () => {
970
+ resolve();
971
+ close();
972
+ },
973
+ onExited: exit,
974
+ position: "top",
975
+ text: `${nickname}\uB2D8 \uBC18\uAC00\uC6CC\uC694!`,
976
+ icon: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
977
+ import_react_native7.Asset.Image,
978
+ {
979
+ style: { borderRadius: 64, overflow: "hidden" },
980
+ frameShape: import_react_native7.Asset.frameShape.CleanW32,
981
+ source: { uri: profileImageUri }
982
+ }
983
+ )
984
+ }
985
+ ) }) });
986
+ });
987
+ });
1240
988
  };
1241
- return { callbackMap, unregisterAll };
1242
- }
1243
- function registerCallback2(callback, name = "unnamed") {
1244
- const uniqueId = generateUUID2();
1245
- const callbackId = `${uniqueId}__${name}`;
1246
- INTERNAL__callbacks2.set(callbackId, callback);
1247
- return callbackId;
1248
- }
1249
- function unregisterCallback2(id) {
1250
- INTERNAL__callbacks2.delete(id);
1251
- }
1252
- function getCallbackIds2() {
1253
- return Array.from(INTERNAL__callbacks2.keys());
1254
- }
1255
- var INTERNAL__appBridgeHandler2 = {
1256
- invokeAppBridgeCallback: invokeAppBridgeCallback2,
1257
- invokeAppBridgeMethod: invokeAppBridgeMethod2,
1258
- registerCallback: registerCallback2,
1259
- unregisterCallback: unregisterCallback2,
1260
- getCallbackIds: getCallbackIds2
989
+ return { openGameProfileToast };
1261
990
  };
1262
991
 
1263
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/internal/AppBridgeCallbackEvent.ts
1264
- var UNSAFE__nativeEventEmitter2 = nativeEventEmitter2;
1265
- var AppBridgeCallbackEvent2 = class _AppBridgeCallbackEvent2 extends import_react_native26.GraniteEventDefinition {
1266
- static INTERNAL__appBridgeSubscription;
1267
- name = "appBridgeCallbackEvent";
1268
- constructor() {
1269
- super();
1270
- this.registerAppBridgeCallbackEventListener();
1271
- }
1272
- remove() {
1273
- }
1274
- listener() {
1275
- }
1276
- registerAppBridgeCallbackEventListener() {
1277
- if (_AppBridgeCallbackEvent2.INTERNAL__appBridgeSubscription != null) {
1278
- return;
1279
- }
1280
- _AppBridgeCallbackEvent2.INTERNAL__appBridgeSubscription = UNSAFE__nativeEventEmitter2.addListener(
1281
- "appBridgeCallback",
1282
- this.ensureInvokeAppBridgeCallback
1283
- );
1284
- }
1285
- ensureInvokeAppBridgeCallback(result) {
1286
- if (typeof result === "object" && typeof result.name === "string") {
1287
- INTERNAL__appBridgeHandler2.invokeAppBridgeCallback(result.name, result.params);
1288
- } else {
1289
- console.warn("Invalid app bridge callback result:", result);
1290
- }
1291
- }
992
+ // src/utils/error.ts
993
+ var DEFAULT_ERROR = {
994
+ title: "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694",
995
+ description: "\uBB38\uC81C\uAC00 \uACC4\uC18D\uB418\uBA74 \uD1A0\uC2A4 \uACE0\uAC1D\uC13C\uD130(1599-4905)\uB85C \uBB38\uC758\uD574\uC8FC\uC138\uC694."
1292
996
  };
1293
997
 
1294
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/appsInTossEvent.ts
1295
- var appsInTossEvent2 = new import_react_native27.GraniteEvent([
1296
- new AppBridgeCallbackEvent2(),
1297
- new UpdateLocationEvent2(),
1298
- new EntryMessageExitedEvent2()
1299
- ]);
1300
-
1301
- // ../../.yarn/__virtual__/@apps-in-toss-native-modules-virtual-79d3aa8191/1/apps-in-toss-packages/native-modules/src/AppsInTossModule/native-event-emitter/startUpdateLocation.ts
1302
- function startUpdateLocation2(eventParams) {
1303
- return appsInTossEvent2.addEventListener("updateLocationEvent", eventParams);
1304
- }
998
+ // src/utils/market.ts
999
+ var import_react_native8 = require("react-native");
1000
+ var PLAYSTORE_LINK = "https://play.google.com/store/apps/details?id=viva.republica.toss";
1001
+ var APPSTORE_LINK = "https://itunes.apple.com/app/id839333328";
1002
+ var getMarketLink = () => {
1003
+ return import_react_native8.Platform.OS === "android" ? PLAYSTORE_LINK : APPSTORE_LINK;
1004
+ };
1305
1005
 
1306
- // src/core/registerApp.tsx
1307
- var import_jsx_runtime = require("react/jsx-runtime");
1308
- function AppsInTossContainer(Container, { children, ...initialProps }) {
1309
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
1310
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppEvent.Entry, {}),
1311
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppEvent.System, { ...initialProps }),
1312
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Container, { ...initialProps, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_native29.TDSProvider, { colorPreference: "light", token: { color: { primary: getAppsInTossGlobals().brandPrimaryColor } }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TDSContainer, { ...initialProps, children }) }) })
1313
- ] });
1314
- }
1315
- function TDSContainer({ children }) {
1316
- useAppsInTossBridge();
1317
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
1318
- }
1319
- function registerApp(container, { context, analytics }) {
1320
- import_analytics.Analytics.init({
1321
- logger: (params) => void eventLog2(params),
1322
- debug: analytics?.debug ?? __DEV__
1006
+ // src/utils/openTransparentWebView.ts
1007
+ var import_react_native_bedrock10 = require("react-native-bedrock");
1008
+
1009
+ // src/native-event-emitter/internal/onVisibilityChangedByTransparentServiceWeb.ts
1010
+ function onVisibilityChangedByTransparentServiceWeb(eventParams) {
1011
+ return appsInTossEvent.addEventListener("onVisibilityChangedByTransparentServiceWeb", eventParams);
1012
+ }
1013
+
1014
+ // src/private.ts
1015
+ var INTERNAL__onVisibilityChangedByTransparentServiceWeb = onVisibilityChangedByTransparentServiceWeb;
1016
+
1017
+ // src/utils/openTransparentWebView.ts
1018
+ var openTransparentWebView = ({
1019
+ webUrl,
1020
+ cleanupWhenDismissed = true,
1021
+ onEvent,
1022
+ onError,
1023
+ callbackId = "fn",
1024
+ params
1025
+ }) => {
1026
+ const url = new URL("supertoss://transparent-service-web");
1027
+ url.searchParams.set("url", webUrl);
1028
+ url.searchParams.set("onVisibilityChangeCallback", callbackId);
1029
+ Object.entries(params ?? {}).forEach(([key, value]) => {
1030
+ url.searchParams.set(key, value);
1323
1031
  });
1324
- return import_react_native28.Granite.registerApp(AppsInTossContainer.bind(null, container), {
1325
- appName: getAppName(),
1326
- context,
1327
- router: {
1328
- screenContainer: import_analytics.Analytics.Screen,
1329
- defaultScreenOption: {
1330
- statusBarStyle: "dark"
1032
+ const cleanup = INTERNAL__onVisibilityChangedByTransparentServiceWeb({
1033
+ options: { callbackId },
1034
+ onError: (error) => {
1035
+ onError(error);
1036
+ cleanup();
1037
+ },
1038
+ onEvent: (value) => {
1039
+ onEvent(value);
1040
+ if (cleanupWhenDismissed && value === true) {
1041
+ cleanup();
1331
1042
  }
1332
1043
  }
1333
1044
  });
1334
- }
1335
- function getAppName() {
1336
- try {
1337
- return global.__granite.app.name;
1338
- } catch (error) {
1339
- console.error("unexpected error occurred while getting app name");
1340
- throw error;
1341
- }
1342
- }
1045
+ (0, import_react_native_bedrock10.openURL)(url.toString());
1046
+ };
1343
1047
 
1344
- // src/core/index.ts
1345
- var AppsInToss = {
1346
- registerApp
1048
+ // src/hooks/useGameCenterProfile.ts
1049
+ var useGameCenterProfile = (isReadyForProfileUI) => {
1050
+ const [profileData, setProfileData] = (0, import_react4.useState)(void 0);
1051
+ const [isProfileDataLoading, setIsProfileDataLoading] = (0, import_react4.useState)(true);
1052
+ const [isProfileDataRefetching, setIsProfileDataRefetching] = (0, import_react4.useState)(false);
1053
+ const shouldShowLoadingOverlay = isProfileDataLoading && isReadyForProfileUI;
1054
+ const shouldShowProfileNotFoundOverlay = profileData?.statusCode === "PROFILE_NOT_FOUND" && isReadyForProfileUI && !isProfileDataRefetching;
1055
+ const canShowBottomSheetOrToast = !isProfileDataLoading && isReadyForProfileUI;
1056
+ const [isWebviewLoading, setIsWebviewLoading] = (0, import_react4.useState)(false);
1057
+ const isCompletedProfileFlow = (0, import_react4.useRef)(false);
1058
+ const { openAlert, openConfirm } = (0, import_react_native9.useDialog)();
1059
+ const { openGameProfileToast } = useGameProfileToast();
1060
+ const openErrorAlert = (0, import_react4.useCallback)(async () => {
1061
+ await openAlert({
1062
+ title: DEFAULT_ERROR.title,
1063
+ description: DEFAULT_ERROR.description
1064
+ });
1065
+ (0, import_react_native_bedrock11.closeView)();
1066
+ }, [openAlert]);
1067
+ const openProfileWebview = (0, import_react4.useCallback)(() => {
1068
+ if (isWebviewLoading) {
1069
+ return;
1070
+ }
1071
+ setIsWebviewLoading(true);
1072
+ openTransparentWebView({
1073
+ webUrl: `${GAME_PROFILE_WEBVIEW_URL}?appName=${getAppName()}&referrer=appsintoss.${getAppName()}`,
1074
+ onEvent: async (isClosedTransparentWebView) => {
1075
+ if (isClosedTransparentWebView) {
1076
+ try {
1077
+ setIsWebviewLoading(false);
1078
+ setIsProfileDataRefetching(true);
1079
+ const data = await getGameCenterGameProfile();
1080
+ setProfileData(data);
1081
+ setIsProfileDataRefetching(false);
1082
+ if (data?.statusCode === "SUCCESS") {
1083
+ openGameProfileToast(data.nickname, data.profileImageUri);
1084
+ }
1085
+ } catch (_) {
1086
+ setIsProfileDataRefetching(false);
1087
+ openErrorAlert();
1088
+ }
1089
+ }
1090
+ },
1091
+ onError: () => {
1092
+ openErrorAlert();
1093
+ }
1094
+ });
1095
+ }, [isWebviewLoading, openGameProfileToast, openErrorAlert]);
1096
+ const updateAppToSupportedMinVersion = (0, import_react4.useCallback)(async () => {
1097
+ const upddateConfirmDialogLabel = {
1098
+ title: `${(0, import_es_hangul.josa)(getAppsInTossGlobals().brandDisplayName, "\uC744/\uB97C")} \uD558\uB824\uBA74
1099
+ \uC571\uC744 \uC5C5\uB370\uC774\uD2B8\uD574\uC8FC\uC138\uC694`,
1100
+ leftButton: "\uB2EB\uAE30",
1101
+ rightButton: "\uC5C5\uB370\uC774\uD2B8\uD558\uAE30"
1102
+ };
1103
+ const isConfirmed = await openConfirm({
1104
+ title: upddateConfirmDialogLabel.title,
1105
+ leftButton: upddateConfirmDialogLabel.leftButton,
1106
+ rightButton: upddateConfirmDialogLabel.rightButton,
1107
+ closeOnDimmerClick: true
1108
+ });
1109
+ if (!isConfirmed) {
1110
+ (0, import_react_native_bedrock11.closeView)();
1111
+ return;
1112
+ }
1113
+ const STORE_SCHEME = getMarketLink();
1114
+ (0, import_react_native_bedrock11.openURL)(`supertoss://web?url=${STORE_SCHEME}&external=browser`);
1115
+ }, [openConfirm]);
1116
+ return {
1117
+ profileData,
1118
+ isProfileDataLoading,
1119
+ isProfileDataRefetching,
1120
+ shouldShowLoadingOverlay,
1121
+ shouldShowProfileNotFoundOverlay,
1122
+ canShowBottomSheetOrToast,
1123
+ isCompletedProfileFlow,
1124
+ updateAppToSupportedMinVersion,
1125
+ setIsProfileDataLoading,
1126
+ openProfileWebview,
1127
+ setProfileData,
1128
+ openErrorAlert,
1129
+ openGameProfileToast
1130
+ };
1347
1131
  };
1348
1132
 
1349
- // src/components/WebView.tsx
1350
- var import_react_native39 = require("@granite-js/react-native");
1351
- var graniteAsyncBridges = __toESM(require("@granite-js/react-native/async-bridges"), 1);
1352
- var graniteConstantBridges = __toESM(require("@granite-js/react-native/constant-bridges"), 1);
1353
- var import_react_native40 = require("@toss-design-system/react-native");
1354
- var import_private = require("@toss-design-system/react-native/private");
1355
- var import_react6 = require("react");
1133
+ // src/utils/zIndex.ts
1134
+ var Z_INDEX = {
1135
+ /* 게임 프로필을 위한 overlay
1136
+ */
1137
+ PROFILE_OVERLAY: 9998,
1138
+ // 게임을 종료할 수 있는 X 버튼
1139
+ CLOSE_BUTTON: 9999
1140
+ };
1356
1141
 
1357
- // src/components/GameWebView.tsx
1358
- var import_react_native_webview = require("@granite-js/native/react-native-webview");
1359
- var import_react_native35 = require("@granite-js/react-native");
1360
- var import_react_native36 = require("@toss-design-system/react-native");
1361
- var import_es_hangul = require("es-hangul");
1362
- var import_react4 = require("react");
1363
- var import_react_native37 = require("react-native");
1142
+ // src/components/GameProfile.tsx
1143
+ var import_jsx_runtime3 = require("react/jsx-runtime");
1144
+ var GameProfile = ({ children, isReadyForProfileUI }) => {
1145
+ const {
1146
+ profileData,
1147
+ isProfileDataRefetching,
1148
+ shouldShowLoadingOverlay,
1149
+ shouldShowProfileNotFoundOverlay,
1150
+ canShowBottomSheetOrToast,
1151
+ isCompletedProfileFlow,
1152
+ openProfileWebview,
1153
+ updateAppToSupportedMinVersion,
1154
+ setIsProfileDataLoading,
1155
+ setProfileData,
1156
+ openErrorAlert,
1157
+ openGameProfileToast
1158
+ } = useGameCenterProfile(isReadyForProfileUI);
1159
+ (0, import_react5.useEffect)(() => {
1160
+ try {
1161
+ const getProfileData = async () => {
1162
+ const data = await getGameCenterGameProfile();
1163
+ setProfileData(data);
1164
+ setIsProfileDataLoading(false);
1165
+ };
1166
+ getProfileData();
1167
+ } catch (_) {
1168
+ openErrorAlert();
1169
+ setIsProfileDataLoading(false);
1170
+ }
1171
+ }, []);
1172
+ (0, import_react5.useEffect)(() => {
1173
+ const handleGameProfileFlow = async () => {
1174
+ if (!canShowBottomSheetOrToast) {
1175
+ return;
1176
+ }
1177
+ if (isCompletedProfileFlow.current) {
1178
+ return;
1179
+ }
1180
+ isCompletedProfileFlow.current = true;
1181
+ if (!isMinVersionSupported(GAME_CENTER_MIN_VERSION)) {
1182
+ updateAppToSupportedMinVersion();
1183
+ return;
1184
+ }
1185
+ if (profileData?.statusCode === "SUCCESS") {
1186
+ openGameProfileToast(profileData.nickname, profileData.profileImageUri);
1187
+ return;
1188
+ }
1189
+ if (profileData?.statusCode === "PROFILE_NOT_FOUND") {
1190
+ openProfileWebview();
1191
+ }
1192
+ };
1193
+ handleGameProfileFlow();
1194
+ }, [
1195
+ canShowBottomSheetOrToast,
1196
+ isCompletedProfileFlow,
1197
+ openGameProfileToast,
1198
+ openProfileWebview,
1199
+ profileData,
1200
+ updateAppToSupportedMinVersion
1201
+ ]);
1202
+ if (!isMinVersionSupported(GAME_CENTER_MIN_VERSION)) {
1203
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1204
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native11.View, { style: { flex: 1, position: "relative" }, children }),
1205
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1206
+ import_react_native11.Pressable,
1207
+ {
1208
+ style: {
1209
+ ...overlayStyle
1210
+ },
1211
+ onPress: () => {
1212
+ updateAppToSupportedMinVersion();
1213
+ }
1214
+ }
1215
+ )
1216
+ ] });
1217
+ }
1218
+ if (shouldShowLoadingOverlay || isProfileDataRefetching) {
1219
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1220
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native11.View, { style: { flex: 1, position: "relative" }, children }),
1221
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1222
+ import_react_native11.View,
1223
+ {
1224
+ style: {
1225
+ ...overlayStyle,
1226
+ justifyContent: "center",
1227
+ alignItems: "center",
1228
+ backgroundColor: "rgba(0, 0, 0, 0.2)"
1229
+ },
1230
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native10.Loader, { size: "large", type: "light" })
1231
+ }
1232
+ )
1233
+ ] });
1234
+ }
1235
+ if (shouldShowProfileNotFoundOverlay) {
1236
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1237
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native11.View, { style: { flex: 1, position: "relative" }, children }),
1238
+ shouldShowProfileNotFoundOverlay && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1239
+ import_react_native11.Pressable,
1240
+ {
1241
+ style: {
1242
+ ...overlayStyle
1243
+ },
1244
+ onPress: () => {
1245
+ openProfileWebview();
1246
+ }
1247
+ }
1248
+ )
1249
+ ] });
1250
+ }
1251
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native11.View, { style: { flex: 1, position: "relative" }, children }) });
1252
+ };
1253
+ var overlayStyle = {
1254
+ position: "absolute",
1255
+ top: 0,
1256
+ left: 0,
1257
+ right: 0,
1258
+ bottom: 0,
1259
+ zIndex: Z_INDEX.PROFILE_OVERLAY
1260
+ };
1364
1261
 
1365
1262
  // src/components/GameWebViewNavigationBar/GameNavigationBar.tsx
1366
- var import_react_native_svg = require("@granite-js/native/react-native-svg");
1367
- var import_react_native33 = require("@toss-design-system/react-native");
1368
- var import_react_native34 = require("react-native");
1263
+ var import_react_native_svg = require("@react-native-bedrock/native/react-native-svg");
1264
+ var import_react_native15 = require("@toss-design-system/react-native");
1265
+ var import_react_native16 = require("react-native");
1369
1266
 
1370
1267
  // src/components/GameWebViewNavigationBar/HeaderRight.tsx
1371
- var import_react_native31 = require("react-native");
1268
+ var import_react_native13 = require("react-native");
1372
1269
 
1373
1270
  // src/components/GameWebViewNavigationBar/byPlatform.ts
1374
- var import_react_native30 = require("react-native");
1271
+ var import_react_native12 = require("react-native");
1375
1272
  function byPlatform({
1376
1273
  ...props
1377
1274
  }) {
1378
- return (props[import_react_native30.Platform.OS] ?? props.fallback)();
1275
+ return (props[import_react_native12.Platform.OS] ?? props.fallback)();
1379
1276
  }
1380
1277
 
1381
1278
  // src/components/GameWebViewNavigationBar/constants.ts
@@ -1383,21 +1280,21 @@ var RIGHT_MARGIN = 24;
1383
1280
  var IOS_DEFAULT_MARGIN = 20;
1384
1281
 
1385
1282
  // src/components/GameWebViewNavigationBar/HeaderRight.tsx
1386
- var import_jsx_runtime2 = require("react/jsx-runtime");
1283
+ var import_jsx_runtime4 = require("react/jsx-runtime");
1387
1284
  function IOSHeaderRight(props) {
1388
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native31.View, { style: styles.ios, ...props });
1285
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native13.View, { style: styles.ios, ...props });
1389
1286
  }
1390
1287
  function AndroidHeaderRight(props) {
1391
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native31.View, { style: styles.android, ...props });
1288
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native13.View, { style: styles.android, ...props });
1392
1289
  }
1393
1290
  function HeaderRight(props) {
1394
1291
  return byPlatform({
1395
- ios: () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(IOSHeaderRight, { ...props }),
1396
- android: () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AndroidHeaderRight, { ...props }),
1397
- fallback: () => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(IOSHeaderRight, { ...props })
1292
+ ios: () => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(IOSHeaderRight, { ...props }),
1293
+ android: () => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AndroidHeaderRight, { ...props }),
1294
+ fallback: () => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(IOSHeaderRight, { ...props })
1398
1295
  });
1399
1296
  }
1400
- var styles = import_react_native31.StyleSheet.create({
1297
+ var styles = import_react_native13.StyleSheet.create({
1401
1298
  ios: {
1402
1299
  marginRight: -IOS_DEFAULT_MARGIN + RIGHT_MARGIN,
1403
1300
  flexDirection: "row"
@@ -1408,49 +1305,49 @@ var styles = import_react_native31.StyleSheet.create({
1408
1305
  });
1409
1306
 
1410
1307
  // src/components/GameWebViewNavigationBar/useSafeAreaTop.ts
1411
- var import_react_native_safe_area_context = require("@granite-js/native/react-native-safe-area-context");
1412
- var import_react_native32 = require("react-native");
1308
+ var import_react_native_safe_area_context = require("@react-native-bedrock/native/react-native-safe-area-context");
1309
+ var import_react_native14 = require("react-native");
1413
1310
  function useSafeAreaTop() {
1414
1311
  const safeAreaInsets = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
1415
- const hasDynamicIsland = import_react_native32.Platform.OS === "ios" && safeAreaInsets.top > 50;
1312
+ const hasDynamicIsland = import_react_native14.Platform.OS === "ios" && safeAreaInsets.top > 50;
1416
1313
  const safeAreaTop = hasDynamicIsland ? safeAreaInsets.top - 5 : safeAreaInsets.top;
1417
1314
  return safeAreaTop;
1418
1315
  }
1419
1316
 
1420
1317
  // src/components/GameWebViewNavigationBar/GameNavigationBar.tsx
1421
- var import_jsx_runtime3 = require("react/jsx-runtime");
1318
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1422
1319
  var originXML = '<svg fill="none" height="30" viewBox="0 0 30 30" width="30" xmlns="https://www.w3.org/2000/svg"><rect fill="#031832" fill-opacity=".46" height="30" rx="15" width="30"/><rect height="29.5" rx="14.75" stroke="#d9d9ff" stroke-opacity=".11" stroke-width=".5" width="29.5" x=".25" y=".25"/><path clip-rule="evenodd" d="m16.5119 15.0014 4.7092-4.7092c.0929-.0928.1666-.2031.2169-.32441.0503-.12134.0762-.25141.0762-.38276.0001-.13136-.0258-.26144-.076-.38281s-.1239-.23166-.2167-.32457c-.0929-.09291-.2031-.16662-.3245-.21692-.1213-.05031-.2514-.07622-.3827-.07626-.1314-.00004-.2615.0258-.3828.07603-.1214.05023-.2317.12388-.3246.21673l-4.7092 4.70997-4.71-4.70997c-.1897-.17718-.4408-.27373-.70034-.26927s-.5072.10959-.69069.2932c-.1835.1836-.28848.43132-.29279.69087-.00432.25954.09238.51057.26968.70017l4.71004 4.7092-4.71004 4.7092c-.1392.1401-.23385.3183-.27204.5121-.0382.1939-.01823.3946.05739.5771s.20351.3386.36759.4486.35702.169.55456.1697c.25583 0 .51164-.0975.70664-.2925l4.71-4.71 4.7092 4.71c.0927.093.2029.1668.3243.2172.1213.0504.2514.0763.3828.0763s.2614-.0259.3828-.0763c.1213-.0504.2315-.1242.3243-.2172.0929-.0929.1667-.2032.217-.3246s.0762-.2515.0762-.3829-.0259-.2616-.0762-.383-.1241-.2317-.217-.3245z" fill="#fdfdfe" fill-opacity=".89" fill-rule="evenodd"/></svg>';
1423
1320
  function GameNavigationBar({ onClose }) {
1424
1321
  const safeAreaTop = useSafeAreaTop();
1425
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
1426
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native33.PageNavbar, { preference: { type: "none" } }),
1427
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1428
- import_react_native34.View,
1322
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
1323
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native15.PageNavbar, { preference: { type: "none" } }),
1324
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1325
+ import_react_native16.View,
1429
1326
  {
1430
1327
  style: {
1431
1328
  width: "100%",
1432
- height: import_react_native34.Platform.OS === "ios" ? 44 : 54,
1329
+ height: import_react_native16.Platform.OS === "ios" ? 44 : 54,
1433
1330
  flexDirection: "row",
1434
1331
  alignItems: "center",
1435
1332
  justifyContent: "flex-end",
1436
1333
  position: "absolute",
1437
- zIndex: 9999,
1334
+ zIndex: Z_INDEX.CLOSE_BUTTON,
1438
1335
  marginTop: safeAreaTop,
1439
- paddingRight: import_react_native34.Platform.OS === "ios" ? 10 : 8
1336
+ paddingRight: import_react_native16.Platform.OS === "ios" ? 10 : 8
1440
1337
  },
1441
1338
  pointerEvents: "box-none",
1442
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(HeaderRight, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
1443
- import_react_native34.TouchableOpacity,
1339
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HeaderRight, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1340
+ import_react_native16.TouchableOpacity,
1444
1341
  {
1445
1342
  hitSlop: { left: 8, right: 8 },
1446
1343
  accessibilityRole: "button",
1447
1344
  accessible: true,
1448
1345
  accessibilityLabel: "\uAC8C\uC784\uC885\uB8CC",
1449
1346
  style: {
1450
- padding: import_react_native34.Platform.OS === "ios" ? 7 : 9
1347
+ padding: import_react_native16.Platform.OS === "ios" ? 7 : 9
1451
1348
  },
1452
1349
  onPress: onClose,
1453
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native_svg.SvgXml, { xml: originXML, width: 30, height: 30 })
1350
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native_svg.SvgXml, { xml: originXML, width: 30, height: 30 })
1454
1351
  }
1455
1352
  ) })
1456
1353
  }
@@ -1459,48 +1356,56 @@ function GameNavigationBar({ onClose }) {
1459
1356
  }
1460
1357
 
1461
1358
  // src/components/GameWebView.tsx
1462
- var import_jsx_runtime4 = require("react/jsx-runtime");
1463
- var GameWebView = (0, import_react4.forwardRef)(function GameWebView2(props, ref) {
1464
- const { openConfirm } = (0, import_react_native36.useDialog)();
1359
+ var import_jsx_runtime6 = require("react/jsx-runtime");
1360
+ var GameWebView = (0, import_react6.forwardRef)(function GameWebView2(props, ref) {
1361
+ const { openConfirm } = (0, import_react_native17.useDialog)();
1465
1362
  const { brandDisplayName } = getAppsInTossGlobals();
1466
- const handleClose = (0, import_react4.useCallback)(async () => {
1363
+ const [isEntryMessageExited, setIsEntryMessageExited] = (0, import_react6.useState)(false);
1364
+ const handleClose = (0, import_react6.useCallback)(async () => {
1467
1365
  const isConfirmed = await openConfirm({
1468
- title: `${(0, import_es_hangul.josa)(brandDisplayName, "\uC744/\uB97C")} \uC885\uB8CC\uD560\uAE4C\uC694?`,
1366
+ title: `${(0, import_es_hangul2.josa)(brandDisplayName, "\uC744/\uB97C")} \uC885\uB8CC\uD560\uAE4C\uC694?`,
1469
1367
  leftButton: "\uCDE8\uC18C",
1470
1368
  rightButton: "\uC885\uB8CC\uD558\uAE30",
1471
1369
  closeOnDimmerClick: true
1472
1370
  });
1473
1371
  if (isConfirmed) {
1474
- (0, import_react_native35.closeView)();
1372
+ (0, import_react_native_bedrock12.closeView)();
1475
1373
  }
1476
1374
  }, [brandDisplayName, openConfirm]);
1477
- (0, import_react4.useEffect)(() => {
1478
- if (import_react_native37.Platform.OS === "ios") {
1479
- setIosSwipeGestureEnabled({ isEnabled: false });
1375
+ (0, import_react6.useEffect)(() => {
1376
+ if (import_react_native18.Platform.OS === "ios") {
1377
+ (0, import_react_native_bedrock12.setIosSwipeGestureEnabled)({ isEnabled: false });
1480
1378
  return () => {
1481
- setIosSwipeGestureEnabled({ isEnabled: true });
1379
+ (0, import_react_native_bedrock12.setIosSwipeGestureEnabled)({ isEnabled: true });
1482
1380
  };
1483
1381
  }
1484
1382
  return;
1485
1383
  }, []);
1486
- (0, import_react4.useEffect)(() => {
1384
+ (0, import_react6.useEffect)(() => {
1487
1385
  const backHandler = () => {
1488
1386
  handleClose();
1489
1387
  return true;
1490
1388
  };
1491
- import_react_native37.BackHandler.addEventListener("hardwareBackPress", backHandler);
1389
+ import_react_native18.BackHandler.addEventListener("hardwareBackPress", backHandler);
1492
1390
  return () => {
1493
- import_react_native37.BackHandler.removeEventListener("hardwareBackPress", backHandler);
1391
+ import_react_native18.BackHandler.removeEventListener("hardwareBackPress", backHandler);
1494
1392
  };
1495
1393
  }, [handleClose]);
1496
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1497
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(GameNavigationBar, { onClose: handleClose }),
1498
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native37.View, { style: { flex: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native_webview.WebView, { ref, ...props }) })
1394
+ (0, import_react6.useEffect)(() => {
1395
+ appsInTossEvent.addEventListener("entryMessageExited", {
1396
+ onEvent: () => {
1397
+ setIsEntryMessageExited(true);
1398
+ }
1399
+ });
1400
+ }, []);
1401
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
1402
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(GameNavigationBar, { onClose: handleClose }),
1403
+ getOperationalEnvironment() === "toss" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(GameProfile, { isReadyForProfileUI: isEntryMessageExited, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native_webview.WebView, { ref, ...props }) }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native_webview.WebView, { ref, ...props })
1499
1404
  ] });
1500
1405
  });
1501
1406
 
1502
1407
  // src/bridge-handler/useBridgeHandler.tsx
1503
- var import_react5 = require("react");
1408
+ var import_react7 = require("react");
1504
1409
  function serializeError(error) {
1505
1410
  return JSON.stringify(error, (_, value) => {
1506
1411
  if (value instanceof Error) {
@@ -1532,12 +1437,12 @@ function methodHandler({
1532
1437
  };
1533
1438
  wrappedFunc(...args).then((result) => {
1534
1439
  injectJavaScript?.(`
1535
- window.__GRANITE_NATIVE_EMITTER.emit('${functionName}/resolve/${eventId}', ${JSON.stringify(result, null, 0)});
1440
+ window.__BEDROCK_NATIVE_EMITTER.emit('${functionName}/resolve/${eventId}', ${JSON.stringify(result, null, 0)});
1536
1441
  `);
1537
1442
  }).catch((error) => {
1538
1443
  const serializedError = serializeError(error);
1539
1444
  injectJavaScript?.(`
1540
- window.__GRANITE_NATIVE_EMITTER.emit('${functionName}/reject/${eventId}', ${serializedError});
1445
+ window.__BEDROCK_NATIVE_EMITTER.emit('${functionName}/reject/${eventId}', ${serializedError});
1541
1446
  `);
1542
1447
  });
1543
1448
  }
@@ -1549,8 +1454,8 @@ function useBridgeHandler({
1549
1454
  eventListenerMap,
1550
1455
  injectedJavaScript: originalInjectedJavaScript
1551
1456
  }) {
1552
- const ref = (0, import_react5.useRef)(null);
1553
- const injectedJavaScript = (0, import_react5.useMemo)(
1457
+ const ref = (0, import_react7.useRef)(null);
1458
+ const injectedJavaScript = (0, import_react7.useMemo)(
1554
1459
  () => [
1555
1460
  `window.__CONSTANT_HANDLER_MAP = ${JSON.stringify(
1556
1461
  Object.entries(constantHandlerMap).reduce(
@@ -1568,15 +1473,15 @@ function useBridgeHandler({
1568
1473
  );
1569
1474
  const createHandleOnEvent = (functionName, eventId) => (response) => {
1570
1475
  ref.current?.injectJavaScript(`
1571
- window.__GRANITE_NATIVE_EMITTER.emit('${functionName}/onEvent/${eventId}', ${JSON.stringify(response, null, 0)});
1476
+ window.__BEDROCK_NATIVE_EMITTER.emit('${functionName}/onEvent/${eventId}', ${JSON.stringify(response, null, 0)});
1572
1477
  `);
1573
1478
  };
1574
1479
  const createHandleOnError = (functionName, eventId) => (error) => {
1575
1480
  ref.current?.injectJavaScript(`
1576
- window.__GRANITE_NATIVE_EMITTER.emit('${functionName}/onError/${eventId}', ${JSON.stringify(error, null, 0)});
1481
+ window.__BEDROCK_NATIVE_EMITTER.emit('${functionName}/onError/${eventId}', ${JSON.stringify(error, null, 0)});
1577
1482
  `);
1578
1483
  };
1579
- const $onMessage = (0, import_react5.useCallback)(
1484
+ const $onMessage = (0, import_react7.useCallback)(
1580
1485
  async (e) => {
1581
1486
  onMessage?.(e);
1582
1487
  const data = JSON.parse(e.nativeEvent.data);
@@ -1626,8 +1531,201 @@ function useBridgeHandler({
1626
1531
  };
1627
1532
  }
1628
1533
 
1534
+ // src/constant-bridges.ts
1535
+ var constant_bridges_exports = {};
1536
+ __export(constant_bridges_exports, {
1537
+ getDeviceId: () => getDeviceId,
1538
+ getOperationalEnvironment: () => getOperationalEnvironment,
1539
+ getTossAppVersion: () => getTossAppVersion
1540
+ });
1541
+
1542
+ // src/event-bridges.ts
1543
+ var event_bridges_exports = {};
1544
+ __export(event_bridges_exports, {
1545
+ startUpdateLocation: () => startUpdateLocation
1546
+ });
1547
+
1548
+ // src/hooks/useCreateUserAgent.ts
1549
+ var import_react_native19 = require("react-native");
1550
+ var import_react_native_bedrock13 = require("react-native-bedrock");
1551
+ var FontA11yCategory = {
1552
+ Large: "Large",
1553
+ xLarge: "xLarge",
1554
+ xxLarge: "xxLarge",
1555
+ xxxLarge: "xxxLarge",
1556
+ A11y_Medium: "A11y_Medium",
1557
+ A11y_Large: "A11y_Large",
1558
+ A11y_xLarge: "A11y_xLarge",
1559
+ A11y_xxLarge: "A11y_xxLarge",
1560
+ A11y_xxxLarge: "A11y_xxxLarge"
1561
+ };
1562
+ var androidFontScaleMap = {
1563
+ 100: FontA11yCategory.Large,
1564
+ 110: FontA11yCategory.xLarge,
1565
+ 120: FontA11yCategory.xxLarge,
1566
+ 135: FontA11yCategory.xxxLarge,
1567
+ 160: FontA11yCategory.A11y_Medium,
1568
+ 190: FontA11yCategory.A11y_Large,
1569
+ 235: FontA11yCategory.A11y_xLarge,
1570
+ 275: FontA11yCategory.A11y_xxLarge,
1571
+ 310: FontA11yCategory.A11y_xxxLarge
1572
+ };
1573
+ var iosScaleToAndroidScale = {
1574
+ 0.823: 100,
1575
+ 0.882: 100,
1576
+ 0.941: 100,
1577
+ 1: 100,
1578
+ 1.118: 110,
1579
+ 1.235: 120,
1580
+ 1.353: 135,
1581
+ 1.786: 160,
1582
+ 2.143: 190,
1583
+ 2.643: 235,
1584
+ 3.143: 275,
1585
+ 3.571: 310
1586
+ };
1587
+ function convertToAndroidStyleScale(fontScale, platform) {
1588
+ if (platform === "android") {
1589
+ if (fontScale <= 1) {
1590
+ return 100;
1591
+ }
1592
+ const scaledValue = Math.round(fontScale * 100);
1593
+ const keys = Object.keys(androidFontScaleMap).map(Number).sort((a, b) => a - b);
1594
+ let closestKey = keys[0];
1595
+ let minDiff = Math.abs(scaledValue - closestKey);
1596
+ for (const key of keys) {
1597
+ const diff = Math.abs(scaledValue - key);
1598
+ if (diff < minDiff) {
1599
+ minDiff = diff;
1600
+ closestKey = key;
1601
+ }
1602
+ }
1603
+ return closestKey;
1604
+ } else {
1605
+ const iosScales = Object.keys(iosScaleToAndroidScale).map(Number);
1606
+ let closestScale = iosScales[0];
1607
+ let minDiff = Math.abs(fontScale - closestScale);
1608
+ for (const scale of iosScales) {
1609
+ const diff = Math.abs(fontScale - scale);
1610
+ if (diff < minDiff) {
1611
+ minDiff = diff;
1612
+ closestScale = scale;
1613
+ }
1614
+ }
1615
+ return iosScaleToAndroidScale[closestScale];
1616
+ }
1617
+ }
1618
+ function mapIOSFontScaleToCategory(fontScale) {
1619
+ if (fontScale < 1) {
1620
+ return FontA11yCategory.Large;
1621
+ }
1622
+ if (Math.abs(fontScale - 1) < 0.05) {
1623
+ return FontA11yCategory.Large;
1624
+ }
1625
+ if (Math.abs(fontScale - 1.118) < 0.05) {
1626
+ return FontA11yCategory.xLarge;
1627
+ }
1628
+ if (Math.abs(fontScale - 1.235) < 0.05) {
1629
+ return FontA11yCategory.xxLarge;
1630
+ }
1631
+ if (Math.abs(fontScale - 1.353) < 0.05) {
1632
+ return FontA11yCategory.xxxLarge;
1633
+ }
1634
+ if (Math.abs(fontScale - 1.786) < 0.05) {
1635
+ return FontA11yCategory.A11y_Medium;
1636
+ }
1637
+ if (Math.abs(fontScale - 2.143) < 0.05) {
1638
+ return FontA11yCategory.A11y_Large;
1639
+ }
1640
+ if (Math.abs(fontScale - 2.643) < 0.05) {
1641
+ return FontA11yCategory.A11y_xLarge;
1642
+ }
1643
+ if (Math.abs(fontScale - 3.143) < 0.05) {
1644
+ return FontA11yCategory.A11y_xxLarge;
1645
+ }
1646
+ if (Math.abs(fontScale - 3.571) < 0.05) {
1647
+ return FontA11yCategory.A11y_xxxLarge;
1648
+ }
1649
+ return FontA11yCategory.Large;
1650
+ }
1651
+ function mapAndroidFontScaleToCategory(fontScale) {
1652
+ if (fontScale <= 1) {
1653
+ return androidFontScaleMap[100];
1654
+ }
1655
+ const scaledValue = Math.round(fontScale * 100);
1656
+ const keys = Object.keys(androidFontScaleMap).map(Number).sort((a, b) => a - b);
1657
+ if (keys.length === 0) {
1658
+ return androidFontScaleMap[100];
1659
+ }
1660
+ let closestKey = keys[0];
1661
+ let minDiff = Math.abs(scaledValue - closestKey);
1662
+ for (const key of keys) {
1663
+ const diff = Math.abs(scaledValue - key);
1664
+ if (diff < minDiff) {
1665
+ minDiff = diff;
1666
+ closestKey = key;
1667
+ }
1668
+ }
1669
+ return androidFontScaleMap[closestKey];
1670
+ }
1671
+ function mapFontScaleToCategory(fontScale, platform) {
1672
+ return platform === "ios" ? mapIOSFontScaleToCategory(fontScale) : mapAndroidFontScaleToCategory(fontScale);
1673
+ }
1674
+ function useCreateUserAgent({
1675
+ batteryModePreference,
1676
+ colorPreference,
1677
+ locale,
1678
+ navbarPreference,
1679
+ pureSafeArea,
1680
+ safeArea,
1681
+ safeAreaBottomTransparency
1682
+ }) {
1683
+ const platform = (0, import_react_native_bedrock13.getPlatformOS)();
1684
+ const appVersion = getTossAppVersion();
1685
+ const { fontScale } = (0, import_react_native19.useWindowDimensions)();
1686
+ const platformString = platform === "ios" ? "iPhone" : "Android";
1687
+ const fontA11y = mapFontScaleToCategory(fontScale, platform);
1688
+ const normalizedFontScale = convertToAndroidStyleScale(fontScale, platform);
1689
+ return [
1690
+ `TossApp/${appVersion}`,
1691
+ batteryModePreference && `TossBatteryModePreference/${batteryModePreference}`,
1692
+ colorPreference && `TossColorPreference/${colorPreference}`,
1693
+ `TossFontAccessibility/${fontA11y}`,
1694
+ `TossFontScale/${normalizedFontScale}`,
1695
+ locale && `TossLocale/${locale}`,
1696
+ navbarPreference && `TossNavbarPreference/${navbarPreference}`,
1697
+ pureSafeArea && `TossPureSafeArea/${pureSafeArea}`,
1698
+ safeArea && `TossSafeArea/${safeArea}`,
1699
+ safeAreaBottomTransparency && `TossSafeAreaBottomTransparency/${safeAreaBottomTransparency}`,
1700
+ platformString
1701
+ ].filter(Boolean).join(" ");
1702
+ }
1703
+
1704
+ // src/hooks/useGeolocation.ts
1705
+ var import_react8 = require("react");
1706
+ var import_react_native_bedrock14 = require("react-native-bedrock");
1707
+ function useGeolocation({ accuracy, distanceInterval, timeInterval }) {
1708
+ const isVisible = (0, import_react_native_bedrock14.useVisibility)();
1709
+ const [location, setLocation] = (0, import_react8.useState)(null);
1710
+ (0, import_react8.useEffect)(() => {
1711
+ if (!isVisible) {
1712
+ return;
1713
+ }
1714
+ return startUpdateLocation({
1715
+ options: {
1716
+ accuracy,
1717
+ distanceInterval,
1718
+ timeInterval
1719
+ },
1720
+ onEvent: setLocation,
1721
+ onError: console.error
1722
+ });
1723
+ }, [accuracy, distanceInterval, timeInterval, isVisible]);
1724
+ return location;
1725
+ }
1726
+
1629
1727
  // src/utils/log.ts
1630
- var import_react_native38 = require("@granite-js/react-native");
1728
+ var import_react_native_bedrock15 = require("react-native-bedrock");
1631
1729
 
1632
1730
  // src/utils/extractDateFromUUIDv7.ts
1633
1731
  var extractDateFromUUIDv7 = (uuid) => {
@@ -1653,7 +1751,7 @@ var getGroupId = (url) => {
1653
1751
  };
1654
1752
  var getReferrer = () => {
1655
1753
  try {
1656
- const referrer = new URL((0, import_react_native38.getSchemeUri)());
1754
+ const referrer = new URL((0, import_react_native_bedrock15.getSchemeUri)());
1657
1755
  return referrer.searchParams.get("referrer");
1658
1756
  } catch {
1659
1757
  return "";
@@ -1675,18 +1773,18 @@ var trackScreen = (url) => {
1675
1773
  };
1676
1774
 
1677
1775
  // src/components/WebView.tsx
1678
- var import_jsx_runtime5 = require("react/jsx-runtime");
1776
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1679
1777
  var appsInTossGlobals = getAppsInTossGlobals();
1680
- var operationalEnvironment = getOperationalEnvironment2();
1778
+ var operationalEnvironment = getOperationalEnvironment();
1681
1779
  var TYPES = ["partner", "external", "game"];
1682
1780
  var WEBVIEW_TYPES = {
1683
- partner: import_react_native40.PartnerWebViewScreen,
1684
- external: import_react_native40.ExternalWebViewScreen,
1781
+ partner: import_react_native20.PartnerWebViewScreen,
1782
+ external: import_react_native20.ExternalWebViewScreen,
1685
1783
  game: GameWebView
1686
1784
  };
1687
1785
  function mergeSchemeQueryParamsInto(url) {
1688
1786
  const baseUrl = new URL(url);
1689
- const schemeUrl = new URL((0, import_react_native39.getSchemeUri)());
1787
+ const schemeUrl = new URL((0, import_react_native_bedrock16.getSchemeUri)());
1690
1788
  baseUrl.pathname = schemeUrl.pathname;
1691
1789
  for (const [key, value] of schemeUrl.searchParams.entries()) {
1692
1790
  baseUrl.searchParams.set(key, value);
@@ -1710,16 +1808,17 @@ function WebView({ type, local, onMessage, ...props }) {
1710
1808
  if (!TYPES.includes(type)) {
1711
1809
  throw new Error(`Invalid WebView type: '${type}'`);
1712
1810
  }
1713
- const graniteEvent = (0, import_react_native39.useGraniteEvent)();
1714
- const uri = (0, import_react6.useMemo)(() => getWebViewUri(local), [local]);
1715
- const top = (0, import_private.useSafeAreaTop)();
1716
- const bottom = (0, import_private.useSafeAreaBottom)();
1811
+ const bedrockEvent = (0, import_react_native_bedrock16.useBedrockEvent)();
1812
+ const uri = (0, import_react9.useMemo)(() => getWebViewUri(local), [local]);
1813
+ const top = (0, import_private3.useSafeAreaTop)();
1814
+ const bottom = (0, import_private3.useSafeAreaBottom)();
1815
+ const global2 = getAppsInTossGlobals();
1717
1816
  const handler = useBridgeHandler({
1718
1817
  onMessage,
1719
1818
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
1720
1819
  eventListenerMap: {
1721
1820
  ...event_bridges_exports,
1722
- backEvent: ({ onEvent, onError, options }) => graniteEvent.addEventListener("backEvent", { onEvent, onError, options }),
1821
+ backEvent: ({ onEvent, onError, options }) => bedrockEvent.addEventListener("backEvent", { onEvent, onError, options }),
1723
1822
  entryMessageExited: ({ onEvent, onError }) => appsInTossEvent.addEventListener("entryMessageExited", { onEvent, onError }),
1724
1823
  updateLocationEvent: ({ onEvent, onError, options }) => appsInTossEvent.addEventListener("updateLocationEvent", { onEvent, onError, options }),
1725
1824
  /** @internal */
@@ -1731,10 +1830,11 @@ function WebView({ type, local, onMessage, ...props }) {
1731
1830
  showAdMobRewardedAd: GoogleAdMob.showAdMobRewardedAd
1732
1831
  },
1733
1832
  constantHandlerMap: {
1734
- ...graniteConstantBridges,
1833
+ ...bedrockConstantBridges,
1735
1834
  ...constant_bridges_exports,
1736
1835
  getSafeAreaTop: () => top,
1737
1836
  getSafeAreaBottom: () => bottom,
1837
+ ...Object.fromEntries(Object.entries(global2).map(([key, value]) => [key, () => value])),
1738
1838
  /** AdMob */
1739
1839
  loadAdMobInterstitialAd_isSupported: GoogleAdMob.loadAdMobInterstitialAd.isSupported,
1740
1840
  showAdMobInterstitialAd_isSupported: GoogleAdMob.showAdMobInterstitialAd.isSupported,
@@ -1744,7 +1844,7 @@ function WebView({ type, local, onMessage, ...props }) {
1744
1844
  getDeploymentId: env.getDeploymentId
1745
1845
  },
1746
1846
  asyncHandlerMap: {
1747
- ...graniteAsyncBridges,
1847
+ ...bedrockAsyncBridges,
1748
1848
  ...async_bridges_exports,
1749
1849
  /** internal */
1750
1850
  openPermissionDialog: AppsInTossModule.openPermissionDialog,
@@ -1752,10 +1852,13 @@ function WebView({ type, local, onMessage, ...props }) {
1752
1852
  getStorageItem: Storage.getItem,
1753
1853
  setStorageItem: Storage.setItem,
1754
1854
  removeStorageItem: Storage.removeItem,
1755
- clearItems: Storage.clearItems
1855
+ clearItems: Storage.clearItems,
1856
+ /** IAP */
1857
+ iapCreateOneTimePurchaseOrder: IAP.createOneTimePurchaseOrder,
1858
+ iapGetProductItemList: IAP.getProductItemList
1756
1859
  }
1757
1860
  });
1758
- const baseProps = (0, import_react6.useMemo)(() => {
1861
+ const baseProps = (0, import_react9.useMemo)(() => {
1759
1862
  switch (type) {
1760
1863
  case "partner": {
1761
1864
  const headerOnlyProp = {
@@ -1786,25 +1889,36 @@ function WebView({ type, local, onMessage, ...props }) {
1786
1889
  }, [type, props]);
1787
1890
  const BaseWebView = WEBVIEW_TYPES[type];
1788
1891
  const webViewDebuggingEnabled = operationalEnvironment === "sandbox";
1789
- const handleNavigationStateChange = (0, import_react6.useCallback)((event) => {
1892
+ const handleNavigationStateChange = (0, import_react9.useCallback)((event) => {
1790
1893
  if (event.url) {
1791
1894
  trackScreen(event.url);
1792
1895
  }
1793
1896
  }, []);
1794
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1897
+ const userAgent = useCreateUserAgent({
1898
+ colorPreference: "light"
1899
+ });
1900
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1795
1901
  BaseWebView,
1796
1902
  {
1797
1903
  ref: handler.ref,
1798
1904
  ...props,
1799
1905
  ...baseProps,
1800
- source: { uri },
1906
+ source: {
1907
+ uri,
1908
+ // NOTE: https://github.com/react-native-webview/react-native-webview/pull/3133
1909
+ headers: {
1910
+ "User-Agent": userAgent
1911
+ }
1912
+ },
1913
+ userAgent: import_react_native21.Platform.OS === "ios" ? userAgent : void 0,
1801
1914
  sharedCookiesEnabled: true,
1802
1915
  webviewDebuggingEnabled: webViewDebuggingEnabled,
1803
1916
  thirdPartyCookiesEnabled: true,
1804
1917
  onMessage: handler.onMessage,
1805
1918
  onNavigationStateChange: handleNavigationStateChange,
1806
1919
  injectedJavaScript: handler.injectedJavaScript,
1807
- injectedJavaScriptBeforeContentLoaded: handler.injectedJavaScript
1920
+ injectedJavaScriptBeforeContentLoaded: handler.injectedJavaScript,
1921
+ decelerationRate: import_react_native21.Platform.OS === "ios" ? 1 : void 0
1808
1922
  }
1809
1923
  );
1810
1924
  }
@@ -1815,28 +1929,16 @@ function ensureValue(value, name) {
1815
1929
  return value;
1816
1930
  }
1817
1931
 
1818
- // src/hooks/useGeolocation.ts
1819
- var import_react_native41 = require("@granite-js/react-native");
1820
- var import_react7 = require("react");
1821
- function useGeolocation({ accuracy, distanceInterval, timeInterval }) {
1822
- const isVisible = (0, import_react_native41.useVisibility)();
1823
- const [location, setLocation] = (0, import_react7.useState)(null);
1824
- (0, import_react7.useEffect)(() => {
1825
- if (!isVisible) {
1826
- return;
1827
- }
1828
- return startUpdateLocation({
1829
- options: {
1830
- accuracy,
1831
- distanceInterval,
1832
- timeInterval
1833
- },
1834
- onEvent: setLocation,
1835
- onError: console.error
1836
- });
1837
- }, [accuracy, distanceInterval, timeInterval, isVisible]);
1838
- return location;
1839
- }
1932
+ // src/types.ts
1933
+ var Accuracy2 = /* @__PURE__ */ ((Accuracy3) => {
1934
+ Accuracy3[Accuracy3["Lowest"] = 1] = "Lowest";
1935
+ Accuracy3[Accuracy3["Low"] = 2] = "Low";
1936
+ Accuracy3[Accuracy3["Balanced"] = 3] = "Balanced";
1937
+ Accuracy3[Accuracy3["High"] = 4] = "High";
1938
+ Accuracy3[Accuracy3["Highest"] = 5] = "Highest";
1939
+ Accuracy3[Accuracy3["BestForNavigation"] = 6] = "BestForNavigation";
1940
+ return Accuracy3;
1941
+ })(Accuracy2 || {});
1840
1942
 
1841
1943
  // src/index.ts
1842
1944
  __reExport(src_exports, require("@apps-in-toss/analytics"), module.exports);
@@ -1851,44 +1953,34 @@ var Analytics2 = {
1851
1953
  Accuracy,
1852
1954
  Analytics,
1853
1955
  AppsInToss,
1854
- AppsInTossModule,
1855
- BedrockCoreModule,
1856
- BedrockModule,
1857
1956
  GoogleAdMob,
1858
- INTERNAL__AppsInTossModule,
1859
- INTERNAL__module,
1957
+ IAP,
1958
+ INTERNAL__onVisibilityChangedByTransparentServiceWeb,
1860
1959
  Storage,
1861
1960
  TossPay,
1862
1961
  WebView,
1863
1962
  appLogin,
1864
1963
  appsInTossEvent,
1865
- closeView,
1866
1964
  env,
1867
1965
  eventLog,
1868
1966
  fetchAlbumPhotos,
1869
1967
  fetchContacts,
1870
- generateHapticFeedback,
1871
1968
  getClipboardText,
1872
1969
  getCurrentLocation,
1873
1970
  getDeviceId,
1874
- getLocale,
1875
- getNetworkStatus,
1971
+ getGameCenterGameProfile,
1876
1972
  getOperationalEnvironment,
1877
- getPlatformOS,
1878
- getSchemeUri,
1879
1973
  getTossAppVersion,
1880
1974
  getTossShareLink,
1881
1975
  isMinVersionSupported,
1882
1976
  openCamera,
1883
- openURL,
1977
+ openGameCenterLeaderboard,
1884
1978
  saveBase64Data,
1885
1979
  setClipboardText,
1886
1980
  setDeviceOrientation,
1887
- setIosSwipeGestureEnabled,
1888
- setScreenAwakeMode,
1889
- setSecureScreen,
1890
- share,
1891
1981
  startUpdateLocation,
1982
+ submitGameCenterLeaderBoardScore,
1983
+ useCreateUserAgent,
1892
1984
  useGeolocation,
1893
1985
  ...require("@apps-in-toss/analytics")
1894
1986
  });