@apps-in-toss/framework 1.4.9 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.cjs +326 -218
  2. package/dist/index.js +219 -111
  3. package/package.json +14 -14
package/dist/index.cjs CHANGED
@@ -48,10 +48,10 @@ var import_analytics2 = require("@apps-in-toss/analytics");
48
48
 
49
49
  // src/core/registerApp.tsx
50
50
  var import_analytics = require("@apps-in-toss/analytics");
51
- var import_native_modules13 = require("@apps-in-toss/native-modules");
52
- var import_react_native21 = require("@granite-js/react-native");
53
- var import_tds_react_native10 = require("@toss/tds-react-native");
54
- var import_react_native22 = require("react-native");
51
+ var import_native_modules14 = require("@apps-in-toss/native-modules");
52
+ var import_react_native23 = require("@granite-js/react-native");
53
+ var import_tds_react_native11 = require("@toss/tds-react-native");
54
+ var import_react_native24 = require("react-native");
55
55
 
56
56
  // src/core/components/AppEvent.tsx
57
57
  var import_native_modules2 = require("@apps-in-toss/native-modules");
@@ -277,9 +277,9 @@ function useAppsInTossBridge() {
277
277
  }
278
278
 
279
279
  // src/components/RNAppContainer.tsx
280
- var import_native_modules12 = require("@apps-in-toss/native-modules");
280
+ var import_native_modules13 = require("@apps-in-toss/native-modules");
281
281
  var import_react18 = require("react");
282
- var import_react_native20 = require("react-native");
282
+ var import_react_native22 = require("react-native");
283
283
 
284
284
  // src/components/GameInitializer.tsx
285
285
  var import_native_modules7 = require("@apps-in-toss/native-modules");
@@ -886,18 +886,22 @@ function useNavigationEvent() {
886
886
  }
887
887
 
888
888
  // src/core/hooks/useMoreButtonBottomSheet/index.tsx
889
- var import_native_modules11 = require("@apps-in-toss/native-modules");
890
- var import_react_native18 = require("@granite-js/react-native");
891
- var import_tds_react_native8 = require("@toss/tds-react-native");
889
+ var import_native_modules12 = require("@apps-in-toss/native-modules");
890
+ var import_react_native20 = require("@granite-js/react-native");
891
+ var import_tds_react_native9 = require("@toss/tds-react-native");
892
892
  var import_private4 = require("@toss/tds-react-native/private");
893
893
  var import_react16 = require("react");
894
894
 
895
895
  // src/core/hooks/useMoreButtonBottomSheet/AppShareListMenu.tsx
896
896
  var import_native_modules10 = require("@apps-in-toss/native-modules");
897
- var import_react_native16 = require("@granite-js/react-native");
897
+ var import_react_native17 = require("@granite-js/react-native");
898
+ var import_tds_react_native8 = require("@toss/tds-react-native");
899
+ var import_react_native18 = require("react-native");
900
+
901
+ // src/core/hooks/useMoreButtonBottomSheet/Menu.tsx
898
902
  var import_tds_react_native7 = require("@toss/tds-react-native");
899
903
  var import_private3 = require("@toss/tds-react-native/private");
900
- var import_react_native17 = require("react-native");
904
+ var import_react_native16 = require("react-native");
901
905
 
902
906
  // src/core/hooks/useMoreButtonBottomSheet/useMoreButtonBottomSheetLogging.tsx
903
907
  var import_native_modules9 = require("@apps-in-toss/native-modules");
@@ -968,6 +972,82 @@ function useMoreButtonBottomSheetLogging() {
968
972
  };
969
973
  }
970
974
 
975
+ // src/core/hooks/useMoreButtonBottomSheet/Menu.tsx
976
+ var import_jsx_runtime5 = require("react/jsx-runtime");
977
+ function Menu({ title, iconURL, onPress }) {
978
+ const globals = getAppsInTossGlobals();
979
+ const adaptive = (0, import_private3.useAdaptive)();
980
+ const iconName = getIconName(iconURL);
981
+ const logging = useMoreButtonBottomSheetLogging();
982
+ const brandPrimaryColorRGB = hexToRGB(globals.brandPrimaryColor);
983
+ const iconBackgroundColor = brandPrimaryColorRGB ? `rgba(${brandPrimaryColorRGB.join(",")},0.1)` : adaptive.grey100;
984
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
985
+ import_tds_react_native7.ListRow,
986
+ {
987
+ left: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
988
+ import_react_native16.View,
989
+ {
990
+ style: {
991
+ width: 30,
992
+ height: 30,
993
+ borderRadius: 10,
994
+ flexDirection: "row",
995
+ alignItems: "center",
996
+ justifyContent: "center",
997
+ marginRight: 16,
998
+ backgroundColor: iconBackgroundColor
999
+ },
1000
+ children: iconName ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1001
+ import_tds_react_native7.Asset.Icon,
1002
+ {
1003
+ frameShape: { width: 20, height: 20 },
1004
+ color: globals.brandPrimaryColor,
1005
+ name: iconName
1006
+ }
1007
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1008
+ import_tds_react_native7.Asset.Image,
1009
+ {
1010
+ frameShape: { width: 20, height: 20 },
1011
+ source: { uri: iconURL }
1012
+ }
1013
+ )
1014
+ }
1015
+ ),
1016
+ contents: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1017
+ import_tds_react_native7.ListRow.Texts,
1018
+ {
1019
+ type: "1RowTypeA",
1020
+ top: title,
1021
+ topProps: { color: adaptive.grey700 }
1022
+ }
1023
+ ),
1024
+ verticalPadding: "extraSmall",
1025
+ onPress: () => {
1026
+ logging.menuClick({ title });
1027
+ onPress?.();
1028
+ }
1029
+ }
1030
+ );
1031
+ }
1032
+ var iconNameRegExp = /^(icon-|icn-(?!(car|sec|bank-(fill|square|horizontal))-))(.+)/i;
1033
+ var iconURLRegExp = /^https:\/\/static\.toss\.im\/icons\/(png\/\dx|svg|pdf)\/((icon-|icn-(?!(car|sec|bank-(fill|square|horizontal))-))(.+))\.(png|svg|pdf)$/i;
1034
+ function isIconUrl(url) {
1035
+ return iconNameRegExp.test(url) || iconURLRegExp.test(url);
1036
+ }
1037
+ function getIconName(url) {
1038
+ if (!isIconUrl(url)) {
1039
+ return null;
1040
+ }
1041
+ if (iconNameRegExp.test(url)) {
1042
+ return url;
1043
+ }
1044
+ return url.match(iconURLRegExp)?.[2];
1045
+ }
1046
+ function hexToRGB(hex) {
1047
+ const rgb = hex.toLowerCase().match(/[0-9,a-f]{2}/g)?.map((str) => parseInt(str, 16));
1048
+ return rgb?.length === 3 ? rgb : void 0;
1049
+ }
1050
+
971
1051
  // src/core/utils/url.ts
972
1052
  function addParamsToUrl(url, params) {
973
1053
  const urlObj = new URL(url);
@@ -978,42 +1058,24 @@ function addParamsToUrl(url, params) {
978
1058
  }
979
1059
 
980
1060
  // src/core/hooks/useMoreButtonBottomSheet/AppShareListMenu.tsx
981
- var import_jsx_runtime5 = require("react/jsx-runtime");
1061
+ var import_jsx_runtime6 = require("react/jsx-runtime");
982
1062
  var SHARE_SCHEME_REFERRER = "appsintoss.common_module_share";
983
1063
  var APP_SHARE_MENU_INFO = {
984
1064
  contactItemName: "\uACF5\uC720\uD558\uAE30",
985
1065
  contactIconUrl: "https://static.toss.im/icons/png/4x/icon-share-dots-mono.png"
986
1066
  };
987
1067
  function AppShareListMenu() {
988
- const globals = getAppsInTossGlobals();
989
- const adaptive = (0, import_private3.useAdaptive)();
990
- const logging = useMoreButtonBottomSheetLogging();
991
- const initialScheme = (0, import_react_native16.getSchemeUri)();
1068
+ const initialScheme = (0, import_react_native17.getSchemeUri)();
992
1069
  const isSandbox = (0, import_native_modules10.getOperationalEnvironment)() === "sandbox";
993
- const { openConfirm } = (0, import_tds_react_native7.useDialog)();
1070
+ const { openConfirm } = (0, import_tds_react_native8.useDialog)();
994
1071
  const schemeForShare = addParamsToUrl(initialScheme, {
995
1072
  referrer: SHARE_SCHEME_REFERRER
996
1073
  });
997
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
998
- import_tds_react_native7.ListRow,
1074
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1075
+ Menu,
999
1076
  {
1000
- left: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1001
- import_tds_react_native7.ListRow.Icon,
1002
- {
1003
- color: globals.brandPrimaryColor,
1004
- source: { uri: APP_SHARE_MENU_INFO.contactIconUrl },
1005
- type: "background"
1006
- }
1007
- ),
1008
- contents: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1009
- import_tds_react_native7.ListRow.Texts,
1010
- {
1011
- type: "1RowTypeA",
1012
- top: APP_SHARE_MENU_INFO.contactItemName,
1013
- topProps: { color: adaptive.grey700 }
1014
- }
1015
- ),
1016
- verticalPadding: "extraSmall",
1077
+ title: APP_SHARE_MENU_INFO.contactItemName,
1078
+ iconURL: APP_SHARE_MENU_INFO.contactIconUrl,
1017
1079
  onPress: () => {
1018
1080
  if (isSandbox) {
1019
1081
  openConfirm({
@@ -1024,8 +1086,7 @@ function AppShareListMenu() {
1024
1086
  });
1025
1087
  return;
1026
1088
  }
1027
- logging.menuClick({ title: APP_SHARE_MENU_INFO.contactItemName });
1028
- import_react_native17.NativeModules.AppsInTossModule.shareWithScheme({
1089
+ import_react_native18.NativeModules.AppsInTossModule.shareWithScheme({
1029
1090
  params: {
1030
1091
  schemeURL: schemeForShare
1031
1092
  }
@@ -1035,6 +1096,25 @@ function AppShareListMenu() {
1035
1096
  );
1036
1097
  }
1037
1098
 
1099
+ // src/core/hooks/useMoreButtonBottomSheet/PermissionsMenu.tsx
1100
+ var import_native_modules11 = require("@apps-in-toss/native-modules");
1101
+ var import_react_native19 = require("@granite-js/react-native");
1102
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1103
+ function PermissionsMenu() {
1104
+ const globals = getAppsInTossGlobals();
1105
+ if ((0, import_native_modules11.getOperationalEnvironment)() === "sandbox") {
1106
+ return null;
1107
+ }
1108
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1109
+ Menu,
1110
+ {
1111
+ title: "\uAD8C\uD55C \uC124\uC815",
1112
+ iconURL: "https://static.toss.im/icons/png/4x/icon-setting-mono.png",
1113
+ onPress: () => (0, import_react_native19.openURL)(`servicetoss://apps-in-toss-menu/permissions?appName=${import_react_native19.Granite.appName}&displayAppName=${globals.brandDisplayName}`)
1114
+ }
1115
+ );
1116
+ }
1117
+
1038
1118
  // src/core/utils/ensureValue.ts
1039
1119
  function ensureValue(value, name) {
1040
1120
  if (value === void 0) {
@@ -1044,7 +1124,7 @@ function ensureValue(value, name) {
1044
1124
  }
1045
1125
 
1046
1126
  // src/core/hooks/useMoreButtonBottomSheet/index.tsx
1047
- var import_jsx_runtime6 = require("react/jsx-runtime");
1127
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1048
1128
  var APP_BRIDGE_METHOD_NAME = "getMiniAppsSupportContact";
1049
1129
  var MIN_VERSION = {
1050
1130
  BOTTOM_SHEET: {
@@ -1054,6 +1134,10 @@ var MIN_VERSION = {
1054
1134
  SHARE_LIST_MENU: {
1055
1135
  android: "5.230.0",
1056
1136
  ios: "5.230.0"
1137
+ },
1138
+ PERMISSIONS_MENU: {
1139
+ android: "5.238.0",
1140
+ ios: "5.237.0"
1057
1141
  }
1058
1142
  };
1059
1143
  function useMoreButtonBottomSheet() {
@@ -1064,13 +1148,14 @@ function useMoreButtonBottomSheet() {
1064
1148
  const logging = useMoreButtonBottomSheetLogging();
1065
1149
  const overlay = (0, import_private4.useOverlay)();
1066
1150
  const title = ensureValue(globals.brandDisplayName, "displayName");
1067
- const isBottomSheetSupported = (0, import_native_modules11.isMinVersionSupported)(MIN_VERSION.BOTTOM_SHEET);
1068
- const isShareListMenuSupported = (0, import_native_modules11.isMinVersionSupported)(MIN_VERSION.SHARE_LIST_MENU);
1151
+ const isBottomSheetSupported = (0, import_native_modules12.isMinVersionSupported)(MIN_VERSION.BOTTOM_SHEET);
1152
+ const isShareListMenuSupported = (0, import_native_modules12.isMinVersionSupported)(MIN_VERSION.SHARE_LIST_MENU);
1153
+ const [isPermissionsMenuSupported, setIsPermissionsMenuSupported] = (0, import_react16.useState)(false);
1069
1154
  (0, import_react16.useEffect)(() => {
1070
1155
  if (!isBottomSheetSupported) {
1071
1156
  return;
1072
1157
  }
1073
- import_native_modules11.INTERNAL__appBridgeHandler.invokeAppBridgeMethod(
1158
+ import_native_modules12.INTERNAL__appBridgeHandler.invokeAppBridgeMethod(
1074
1159
  APP_BRIDGE_METHOD_NAME,
1075
1160
  {},
1076
1161
  {
@@ -1078,6 +1163,16 @@ function useMoreButtonBottomSheet() {
1078
1163
  onError: (error) => console.error("\uBA54\uB274 \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uB294 \uB370 \uC2E4\uD328\uD588\uC5B4\uC694:", error)
1079
1164
  }
1080
1165
  );
1166
+ if ((0, import_native_modules12.isMinVersionSupported)(MIN_VERSION.PERMISSIONS_MENU)) {
1167
+ import_native_modules12.INTERNAL__appBridgeHandler.invokeAppBridgeMethod(
1168
+ "getAllPermission",
1169
+ {},
1170
+ {
1171
+ onSuccess: (permissions) => setIsPermissionsMenuSupported(permissions.length > 0),
1172
+ onError: (error) => console.error("\uAD8C\uD55C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uB294 \uB370 \uC2E4\uD328\uD588\uC5B4\uC694:", error)
1173
+ }
1174
+ );
1175
+ }
1081
1176
  }, [isBottomSheetSupported]);
1082
1177
  const onClickHandler = async () => {
1083
1178
  logging.open();
@@ -1093,18 +1188,18 @@ function useMoreButtonBottomSheet() {
1093
1188
  logging.close();
1094
1189
  close();
1095
1190
  };
1096
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(BottomSheetImpressionArea, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1097
- import_tds_react_native8.BottomSheet.Root,
1191
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(BottomSheetImpressionArea, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1192
+ import_tds_react_native9.BottomSheet.Root,
1098
1193
  {
1099
- header: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1100
- import_tds_react_native8.ListHeader,
1194
+ header: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1195
+ import_tds_react_native9.ListHeader,
1101
1196
  {
1102
- title: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_tds_react_native8.ListHeader.TitleParagraph, { color: adaptive.grey800, fontWeight: "bold", typography: "t5", children: title })
1197
+ title: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_tds_react_native9.ListHeader.TitleParagraph, { color: adaptive.grey800, fontWeight: "bold", typography: "t5", children: title })
1103
1198
  }
1104
1199
  ),
1105
1200
  open: isOpen,
1106
- cta: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1107
- import_tds_react_native8.BottomSheet.CTA,
1201
+ cta: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1202
+ import_tds_react_native9.BottomSheet.CTA,
1108
1203
  {
1109
1204
  size: "large",
1110
1205
  type: "dark",
@@ -1117,37 +1212,20 @@ function useMoreButtonBottomSheet() {
1117
1212
  ),
1118
1213
  onClose: handleClose,
1119
1214
  onExited: exit,
1120
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_tds_react_native8.List, { rowSeparator: "none", children: [
1121
- itemList.map((item) => {
1122
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1123
- import_tds_react_native8.ListRow,
1215
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_tds_react_native9.List, { rowSeparator: "none", children: [
1216
+ itemList.map(
1217
+ (item) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1218
+ Menu,
1124
1219
  {
1125
- left: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1126
- import_tds_react_native8.ListRow.Icon,
1127
- {
1128
- color: globals.brandPrimaryColor,
1129
- source: { uri: item.contactIconUrl },
1130
- type: "background"
1131
- }
1132
- ),
1133
- contents: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1134
- import_tds_react_native8.ListRow.Texts,
1135
- {
1136
- type: "1RowTypeA",
1137
- top: item.contactItemName,
1138
- topProps: { color: adaptive.grey700 }
1139
- }
1140
- ),
1141
- verticalPadding: "extraSmall",
1142
- onPress: () => {
1143
- logging.menuClick({ title: item.contactItemName });
1144
- (0, import_react_native18.openURL)(item.contactUri);
1145
- }
1220
+ title: item.contactItemName,
1221
+ iconURL: item.contactIconUrl,
1222
+ onPress: () => (0, import_react_native20.openURL)(item.contactUri)
1146
1223
  },
1147
1224
  item.contactItemName
1148
- );
1149
- }),
1150
- isShareListMenuSupported && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AppShareListMenu, {})
1225
+ )
1226
+ ),
1227
+ isShareListMenuSupported && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(AppShareListMenu, {}),
1228
+ isPermissionsMenuSupported && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PermissionsMenu, {})
1151
1229
  ] })
1152
1230
  }
1153
1231
  ) });
@@ -1160,12 +1238,12 @@ function BottomSheetImpressionArea({ children }) {
1160
1238
  (0, import_react16.useEffect)(() => {
1161
1239
  logging.show();
1162
1240
  }, [logging]);
1163
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_jsx_runtime6.Fragment, { children });
1241
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_jsx_runtime8.Fragment, { children });
1164
1242
  }
1165
1243
 
1166
1244
  // src/components/NavigationBar/common/NavigationBarImpressionArea.tsx
1167
1245
  var import_react17 = require("react");
1168
- var import_jsx_runtime7 = require("react/jsx-runtime");
1246
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1169
1247
  function NavigationBarImpressionArea({
1170
1248
  children,
1171
1249
  withHomeButton
@@ -1178,11 +1256,11 @@ function NavigationBarImpressionArea({
1178
1256
  hasLogged.current = true;
1179
1257
  }
1180
1258
  }, [logging, withHomeButton]);
1181
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_jsx_runtime7.Fragment, { children });
1259
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_jsx_runtime9.Fragment, { children });
1182
1260
  }
1183
1261
 
1184
1262
  // src/components/NavigationBar/RNNavigationBar/Default.tsx
1185
- var import_jsx_runtime8 = require("react/jsx-runtime");
1263
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1186
1264
  function DefaultNavigationBar() {
1187
1265
  const globals = getAppsInTossGlobals();
1188
1266
  const { open: openMoreButtonBottomSheet } = useMoreButtonBottomSheet();
@@ -1192,7 +1270,7 @@ function DefaultNavigationBar() {
1192
1270
  const { navigationRightButton } = useNavigationBarContext();
1193
1271
  const navigationEvent = useNavigationEvent();
1194
1272
  useHardwareBackPress(navigationEvent.handleBack);
1195
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(NavigationBarImpressionArea, { withHomeButton, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1273
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(NavigationBarImpressionArea, { withHomeButton, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1196
1274
  import_private5.TopNavigation,
1197
1275
  {
1198
1276
  title: globals.brandDisplayName,
@@ -1203,17 +1281,18 @@ function DefaultNavigationBar() {
1203
1281
  onPressClose: navigationEvent.handleCloseButtonClick,
1204
1282
  withHome: withHomeButton,
1205
1283
  fixedRightButton: navigationRightButton,
1206
- children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_private5.NavigationLeft, { visible: withBackButton, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_private5.NavigationBackButton, { onPress: navigationEvent.handleBack, canGoBack: false }) })
1284
+ leftVisible: withBackButton,
1285
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_private5.NavigationLeft, { visible: withBackButton, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_private5.NavigationBackButton, { onPress: navigationEvent.handleBack, canGoBack: false }) })
1207
1286
  }
1208
1287
  ) });
1209
1288
  }
1210
1289
 
1211
1290
  // src/components/NavigationBar/RNNavigationBar/Game.tsx
1212
1291
  var import_react_native_safe_area_context = require("@granite-js/native/react-native-safe-area-context");
1213
- var import_tds_react_native9 = require("@toss/tds-react-native");
1292
+ var import_tds_react_native10 = require("@toss/tds-react-native");
1214
1293
  var import_private6 = require("@toss/tds-react-native/private");
1215
- var import_react_native19 = require("react-native");
1216
- var import_jsx_runtime9 = require("react/jsx-runtime");
1294
+ var import_react_native21 = require("react-native");
1295
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1217
1296
  function GameNavigationBar() {
1218
1297
  const safeAreaTop = (0, import_private6.useSafeAreaTop)();
1219
1298
  const { open: openMoreButtonBottomSheet } = useMoreButtonBottomSheet();
@@ -1221,15 +1300,15 @@ function GameNavigationBar() {
1221
1300
  const { navigationRightButton } = useNavigationBarContext();
1222
1301
  const { right: safeAreaRight } = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
1223
1302
  useHardwareBackPress(navigationEvent.handleBack);
1224
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
1225
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_tds_react_native9.PageNavbar, { preference: { type: "none" } }),
1226
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1227
- import_react_native19.View,
1303
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1304
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_tds_react_native10.PageNavbar, { preference: { type: "none" } }),
1305
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1306
+ import_react_native21.View,
1228
1307
  {
1229
1308
  style: {
1230
1309
  width: "100%",
1231
1310
  // TODO: UI관련 스타일 설정은 TDS로 이관
1232
- height: import_react_native19.Platform.OS === "ios" ? 44 : 54,
1311
+ height: import_react_native21.Platform.OS === "ios" ? 44 : 54,
1233
1312
  flexDirection: "row",
1234
1313
  alignItems: "center",
1235
1314
  justifyContent: "flex-end",
@@ -1239,7 +1318,7 @@ function GameNavigationBar() {
1239
1318
  paddingRight: safeAreaRight + 10
1240
1319
  },
1241
1320
  pointerEvents: "box-none",
1242
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1321
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1243
1322
  import_private6.NavigationRightContent,
1244
1323
  {
1245
1324
  fixedRightButton: navigationRightButton,
@@ -1266,83 +1345,83 @@ __reExport(bridge_entry_exports, require("@apps-in-toss/native-modules/constant-
1266
1345
  __reExport(bridge_entry_exports, require("@apps-in-toss/native-modules/event-bridges"));
1267
1346
 
1268
1347
  // src/components/RNAppContainer.tsx
1269
- var import_jsx_runtime10 = require("react/jsx-runtime");
1348
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1270
1349
  function RNAppContainer({ children }) {
1271
1350
  const global2 = getAppsInTossGlobals();
1272
1351
  switch (global2.appType) {
1273
1352
  case "game":
1274
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(GameAppContainer, { children });
1353
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(GameAppContainer, { children });
1275
1354
  case "general":
1276
1355
  default:
1277
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(GeneralAppContainer, { children });
1356
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(GeneralAppContainer, { children });
1278
1357
  }
1279
1358
  }
1280
1359
  function GameAppContainer({ children }) {
1281
1360
  const [isEntryMessageExited, setIsEntryMessageExited] = (0, import_react18.useState)(false);
1282
1361
  (0, import_react18.useEffect)(() => {
1283
- if (import_react_native20.Platform.OS === "ios") {
1284
- (0, import_native_modules12.setIosSwipeGestureEnabled)({ isEnabled: false });
1362
+ if (import_react_native22.Platform.OS === "ios") {
1363
+ (0, import_native_modules13.setIosSwipeGestureEnabled)({ isEnabled: false });
1285
1364
  return () => {
1286
- (0, import_native_modules12.setIosSwipeGestureEnabled)({ isEnabled: true });
1365
+ (0, import_native_modules13.setIosSwipeGestureEnabled)({ isEnabled: true });
1287
1366
  };
1288
1367
  }
1289
1368
  return;
1290
1369
  }, []);
1291
1370
  (0, import_react18.useEffect)(() => {
1292
- import_native_modules12.appsInTossEvent.addEventListener("entryMessageExited", {
1371
+ import_native_modules13.appsInTossEvent.addEventListener("entryMessageExited", {
1293
1372
  onEvent: () => {
1294
1373
  setIsEntryMessageExited(true);
1295
1374
  }
1296
1375
  });
1297
1376
  }, []);
1298
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1299
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RNNavigationBar.Game, {}),
1300
- (0, bridge_entry_exports.getOperationalEnvironment)() === "toss" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(GameInitializer, { isReadyForProfileUI: isEntryMessageExited, children }) : children
1377
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
1378
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RNNavigationBar.Game, {}),
1379
+ (0, bridge_entry_exports.getOperationalEnvironment)() === "toss" ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(GameInitializer, { isReadyForProfileUI: isEntryMessageExited, children }) : children
1301
1380
  ] });
1302
1381
  }
1303
1382
  function GeneralAppContainer({ children }) {
1304
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1305
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(RNNavigationBar.Default, {}),
1383
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
1384
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(RNNavigationBar.Default, {}),
1306
1385
  children
1307
1386
  ] });
1308
1387
  }
1309
1388
 
1310
1389
  // src/core/registerApp.tsx
1311
- var import_jsx_runtime11 = require("react/jsx-runtime");
1390
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1312
1391
  function AppsInTossContainer(Container, { children, ...initialProps }) {
1313
- if (!(0, import_native_modules13.isMinVersionSupported)({
1392
+ if (!(0, import_native_modules14.isMinVersionSupported)({
1314
1393
  android: "5.220.0",
1315
1394
  ios: "5.221.0"
1316
1395
  })) {
1317
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1318
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AppEvent.Entry, {}),
1319
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AppEvent.System, { ...initialProps }),
1320
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AppUpdate, {})
1396
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1397
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AppEvent.Entry, {}),
1398
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AppEvent.System, { ...initialProps }),
1399
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AppUpdate, {})
1321
1400
  ] });
1322
1401
  }
1323
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1324
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AppEvent.StayTime, {}),
1325
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AppEvent.Entry, {}),
1326
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(AppEvent.System, { ...initialProps }),
1327
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Container, { ...initialProps, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_tds_react_native10.TDSProvider, { colorPreference: "light", token: { color: { primary: getAppsInTossGlobals().brandPrimaryColor } }, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TDSContainer, { ...initialProps, children }) }) })
1402
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1403
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AppEvent.StayTime, {}),
1404
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AppEvent.Entry, {}),
1405
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AppEvent.System, { ...initialProps }),
1406
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Container, { ...initialProps, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_tds_react_native11.TDSProvider, { colorPreference: "light", token: { color: { primary: getAppsInTossGlobals().brandPrimaryColor } }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TDSContainer, { ...initialProps, children }) }) })
1328
1407
  ] });
1329
1408
  }
1330
1409
  function TDSContainer({ children }) {
1331
1410
  useAppsInTossBridge();
1332
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_jsx_runtime11.Fragment, { children });
1411
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_jsx_runtime13.Fragment, { children });
1333
1412
  }
1334
1413
  function registerApp(container, { context, analytics }) {
1335
1414
  const appName = getAppName();
1336
- const isRegistered = import_react_native22.AppRegistry.getAppKeys().includes(appName);
1415
+ const isRegistered = import_react_native24.AppRegistry.getAppKeys().includes(appName);
1337
1416
  if (!isRegistered) {
1338
1417
  import_analytics.Analytics.init({
1339
- logger: (params) => void (0, import_native_modules13.eventLog)(params),
1418
+ logger: (params) => void (0, import_native_modules14.eventLog)(params),
1340
1419
  debug: analytics?.debug ?? __DEV__
1341
1420
  });
1342
- const App = import_react_native21.Granite.registerApp(AppsInTossContainer.bind(null, container), {
1421
+ const App = import_react_native23.Granite.registerApp(AppsInTossContainer.bind(null, container), {
1343
1422
  appName,
1344
1423
  context,
1345
- setIosSwipeGestureEnabled: import_native_modules13.setIosSwipeGestureEnabled,
1424
+ setIosSwipeGestureEnabled: import_native_modules14.setIosSwipeGestureEnabled,
1346
1425
  router: {
1347
1426
  screenContainer: AppsInTossScreenContainer,
1348
1427
  defaultScreenOption: {
@@ -1356,7 +1435,7 @@ function registerApp(container, { context, analytics }) {
1356
1435
  }
1357
1436
  function AppsInTossScreenContainer({ children }) {
1358
1437
  const isRNApp = getAppsInTossGlobals().webViewType == null;
1359
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(NavigationBarContextProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_analytics.Analytics.Screen, { children: isRNApp ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(RNAppContainer, { children }) : children }) });
1438
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(NavigationBarContextProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_analytics.Analytics.Screen, { children: isRNApp ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(RNAppContainer, { children }) : children }) });
1360
1439
  }
1361
1440
  function getAppName() {
1362
1441
  try {
@@ -1373,35 +1452,35 @@ var AppsInToss = {
1373
1452
  };
1374
1453
 
1375
1454
  // src/components/WebView.tsx
1376
- var import_native_modules18 = require("@apps-in-toss/native-modules");
1455
+ var import_native_modules19 = require("@apps-in-toss/native-modules");
1377
1456
  var appsInTossAsyncBridges = __toESM(require("@apps-in-toss/native-modules/async-bridges"), 1);
1378
1457
  var appsInTossConstantBridges = __toESM(require("@apps-in-toss/native-modules/constant-bridges"), 1);
1379
1458
  var appsInTossEventBridges = __toESM(require("@apps-in-toss/native-modules/event-bridges"), 1);
1380
1459
  var import_react_native_safe_area_context4 = require("@granite-js/native/react-native-safe-area-context");
1381
- var import_react_native32 = require("@granite-js/react-native");
1382
- var import_tds_react_native14 = require("@toss/tds-react-native");
1460
+ var import_react_native34 = require("@granite-js/react-native");
1461
+ var import_tds_react_native15 = require("@toss/tds-react-native");
1383
1462
  var import_private9 = require("@toss/tds-react-native/private");
1384
1463
  var import_react29 = require("react");
1385
- var import_react_native33 = require("react-native");
1464
+ var import_react_native35 = require("react-native");
1386
1465
 
1387
1466
  // src/components/GameWebView.tsx
1388
- var import_native_modules14 = require("@apps-in-toss/native-modules");
1467
+ var import_native_modules15 = require("@apps-in-toss/native-modules");
1389
1468
  var import_react_native_webview = require("@granite-js/native/react-native-webview");
1390
1469
  var import_react20 = require("react");
1391
- var import_react_native25 = require("react-native");
1470
+ var import_react_native27 = require("react-native");
1392
1471
 
1393
1472
  // src/components/NavigationBar/GameWebviewNavigationBar.tsx
1394
1473
  var import_react_native_safe_area_context2 = require("@granite-js/native/react-native-safe-area-context");
1395
- var import_react_native23 = require("@granite-js/react-native");
1396
- var import_tds_react_native11 = require("@toss/tds-react-native");
1474
+ var import_react_native25 = require("@granite-js/react-native");
1475
+ var import_tds_react_native12 = require("@toss/tds-react-native");
1397
1476
  var import_private7 = require("@toss/tds-react-native/private");
1398
1477
  var import_es_hangul3 = require("es-hangul");
1399
1478
  var import_react19 = require("react");
1400
- var import_react_native24 = require("react-native");
1401
- var import_jsx_runtime12 = require("react/jsx-runtime");
1479
+ var import_react_native26 = require("react-native");
1480
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1402
1481
  function GameWebviewNavigationBar() {
1403
1482
  const safeAreaTop = (0, import_private7.useSafeAreaTop)();
1404
- const { openConfirm } = (0, import_tds_react_native11.useDialog)();
1483
+ const { openConfirm } = (0, import_tds_react_native12.useDialog)();
1405
1484
  const { captureExitLog } = useCaptureExitLog();
1406
1485
  const global2 = getAppsInTossGlobals();
1407
1486
  const logging = useNavigationBarLogging();
@@ -1420,18 +1499,18 @@ function GameWebviewNavigationBar() {
1420
1499
  logging.closePopupCtaClick(isConfirmed);
1421
1500
  if (isConfirmed) {
1422
1501
  captureExitLog(Date.now());
1423
- (0, import_react_native23.closeView)();
1502
+ (0, import_react_native25.closeView)();
1424
1503
  }
1425
1504
  }, [captureExitLog, global2.brandDisplayName, logging, openConfirm]);
1426
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
1427
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_tds_react_native11.PageNavbar, { preference: { type: "none" } }),
1428
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1429
- import_react_native24.View,
1505
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
1506
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_tds_react_native12.PageNavbar, { preference: { type: "none" } }),
1507
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1508
+ import_react_native26.View,
1430
1509
  {
1431
1510
  style: {
1432
1511
  width: "100%",
1433
1512
  // TODO: UI관련 스타일 설정은 TDS로 이관
1434
- height: import_react_native24.Platform.OS === "ios" ? 44 : 54,
1513
+ height: import_react_native26.Platform.OS === "ios" ? 44 : 54,
1435
1514
  flexDirection: "row",
1436
1515
  alignItems: "center",
1437
1516
  justifyContent: "flex-end",
@@ -1441,7 +1520,7 @@ function GameWebviewNavigationBar() {
1441
1520
  paddingRight: safeAreaRight + 10
1442
1521
  },
1443
1522
  pointerEvents: "box-none",
1444
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1523
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1445
1524
  import_private7.NavigationRightContent,
1446
1525
  {
1447
1526
  fixedRightButton: navigationRightButton,
@@ -1458,28 +1537,28 @@ function GameWebviewNavigationBar() {
1458
1537
  }
1459
1538
 
1460
1539
  // src/components/GameWebView.tsx
1461
- var import_jsx_runtime13 = require("react/jsx-runtime");
1540
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1462
1541
  var GameWebView = (0, import_react20.forwardRef)(function GameWebView2(props, ref) {
1463
1542
  const [isEntryMessageExited, setIsEntryMessageExited] = (0, import_react20.useState)(false);
1464
1543
  (0, import_react20.useEffect)(() => {
1465
- if (import_react_native25.Platform.OS === "ios") {
1466
- (0, import_native_modules14.setIosSwipeGestureEnabled)({ isEnabled: false });
1544
+ if (import_react_native27.Platform.OS === "ios") {
1545
+ (0, import_native_modules15.setIosSwipeGestureEnabled)({ isEnabled: false });
1467
1546
  return () => {
1468
- (0, import_native_modules14.setIosSwipeGestureEnabled)({ isEnabled: true });
1547
+ (0, import_native_modules15.setIosSwipeGestureEnabled)({ isEnabled: true });
1469
1548
  };
1470
1549
  }
1471
1550
  return;
1472
1551
  }, []);
1473
1552
  (0, import_react20.useEffect)(() => {
1474
- import_native_modules14.appsInTossEvent.addEventListener("entryMessageExited", {
1553
+ import_native_modules15.appsInTossEvent.addEventListener("entryMessageExited", {
1475
1554
  onEvent: () => {
1476
1555
  setIsEntryMessageExited(true);
1477
1556
  }
1478
1557
  });
1479
1558
  }, []);
1480
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1481
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(GameWebviewNavigationBar, {}),
1482
- (0, import_native_modules14.getOperationalEnvironment)() === "toss" ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(GameInitializer, { isReadyForProfileUI: isEntryMessageExited, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native_webview.WebView, { ref, ...props }) }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native_webview.WebView, { ref, ...props })
1559
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
1560
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(GameWebviewNavigationBar, {}),
1561
+ (0, import_native_modules15.getOperationalEnvironment)() === "toss" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(GameInitializer, { isReadyForProfileUI: isEntryMessageExited, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_webview.WebView, { ref, ...props }) }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_webview.WebView, { ref, ...props })
1483
1562
  ] });
1484
1563
  });
1485
1564
 
@@ -1488,17 +1567,17 @@ var import_react_native_webview2 = require("@granite-js/native/react-native-webv
1488
1567
  var import_react22 = require("react");
1489
1568
 
1490
1569
  // src/components/NavigationBar/PartnerWebviewNavigationBar.tsx
1491
- var import_react_native26 = require("@granite-js/react-native");
1492
- var import_tds_react_native12 = require("@toss/tds-react-native");
1570
+ var import_react_native28 = require("@granite-js/react-native");
1571
+ var import_tds_react_native13 = require("@toss/tds-react-native");
1493
1572
  var import_private8 = require("@toss/tds-react-native/private");
1494
1573
  var import_es_hangul4 = require("es-hangul");
1495
1574
  var import_react21 = require("react");
1496
- var import_jsx_runtime14 = require("react/jsx-runtime");
1575
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1497
1576
  function PartnerWebviewNavigationBar({ onBackButtonClick, onHomeButtonClick }) {
1498
1577
  const globals = getAppsInTossGlobals();
1499
1578
  const { captureExitLog } = useCaptureExitLog();
1500
1579
  const logging = useNavigationBarLogging();
1501
- const { openConfirm } = (0, import_tds_react_native12.useDialog)();
1580
+ const { openConfirm } = (0, import_tds_react_native13.useDialog)();
1502
1581
  const { open: openMoreButtonBottomSheet } = useMoreButtonBottomSheet();
1503
1582
  const parsedNavigationBar = globals.navigationBar != null ? safeParseNavigationBar(globals.navigationBar) : null;
1504
1583
  const withHomeButton = parsedNavigationBar?.withHomeButton ?? false;
@@ -1516,10 +1595,10 @@ function PartnerWebviewNavigationBar({ onBackButtonClick, onHomeButtonClick }) {
1516
1595
  logging.closePopupCtaClick(isConfirmed);
1517
1596
  if (isConfirmed) {
1518
1597
  captureExitLog(Date.now());
1519
- (0, import_react_native26.closeView)();
1598
+ (0, import_react_native28.closeView)();
1520
1599
  }
1521
1600
  }, [captureExitLog, globals.brandDisplayName, logging, openConfirm]);
1522
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(NavigationBarImpressionArea, { withHomeButton, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1601
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(NavigationBarImpressionArea, { withHomeButton, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1523
1602
  import_private8.TopNavigation,
1524
1603
  {
1525
1604
  title: globals.brandDisplayName,
@@ -1530,20 +1609,34 @@ function PartnerWebviewNavigationBar({ onBackButtonClick, onHomeButtonClick }) {
1530
1609
  onPressClose: handleClose,
1531
1610
  withHome: withHomeButton,
1532
1611
  fixedRightButton: navigationRightButton,
1533
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_private8.NavigationLeft, { visible: withBackButton, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_private8.NavigationBackButton, { onPress: onBackButtonClick, canGoBack: false }) })
1612
+ leftVisible: withBackButton,
1613
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_private8.NavigationLeft, { visible: withBackButton, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_private8.NavigationBackButton, { onPress: onBackButtonClick, canGoBack: false }) })
1534
1614
  }
1535
1615
  ) });
1536
1616
  }
1537
1617
 
1538
1618
  // src/components/PartnerWebView.tsx
1539
- var import_jsx_runtime15 = require("react/jsx-runtime");
1619
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1540
1620
  var PartnerWebView = (0, import_react22.forwardRef)(function PartnerWebViewScreen({ onBackButtonClick, onHomeButtonClick, ...webViewProps }, ref) {
1541
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
1542
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(PartnerWebviewNavigationBar, { onBackButtonClick, onHomeButtonClick }),
1543
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native_webview2.WebView, { ref, ...webViewProps, style: { flex: 1 } })
1621
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
1622
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PartnerWebviewNavigationBar, { onBackButtonClick, onHomeButtonClick }),
1623
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_native_webview2.WebView, { ref, ...webViewProps, style: { flex: 1 } })
1544
1624
  ] });
1545
1625
  });
1546
1626
 
1627
+ // src/components/utils/url.ts
1628
+ function convertIntentURL(url) {
1629
+ if (url.protocol !== "intent:") {
1630
+ return null;
1631
+ }
1632
+ const components = url.hash.replace("#Intent;", "").split(";").map((component) => component.split("="));
1633
+ const scheme = components.find(([key]) => key === "scheme")?.[1];
1634
+ if (!scheme) {
1635
+ return null;
1636
+ }
1637
+ return `${scheme}://${url.hostname}${url.pathname}${url.search}`;
1638
+ }
1639
+
1547
1640
  // src/bridge-handler/useBridgeHandler.tsx
1548
1641
  var import_react23 = require("react");
1549
1642
  function serializeError(error) {
@@ -1719,8 +1812,8 @@ function useSafeAreaInsetsEmitter() {
1719
1812
  }
1720
1813
 
1721
1814
  // src/core/hooks/useWebBackHandler.tsx
1722
- var import_react_native27 = require("@granite-js/react-native");
1723
- var import_tds_react_native13 = require("@toss/tds-react-native");
1815
+ var import_react_native29 = require("@granite-js/react-native");
1816
+ var import_tds_react_native14 = require("@toss/tds-react-native");
1724
1817
  var import_es_hangul5 = require("es-hangul");
1725
1818
  var import_react26 = require("react");
1726
1819
 
@@ -1789,9 +1882,9 @@ function useWebBackHandler(webViewRef) {
1789
1882
  hasBackEvent: hasWebBackEvent,
1790
1883
  addEventListener: addWebBackEventListener,
1791
1884
  removeEventListener: removeWebBackEventListener
1792
- } = (0, import_react_native27.useBackEventState)();
1885
+ } = (0, import_react_native29.useBackEventState)();
1793
1886
  const logging = useNavigationBarLogging();
1794
- const { openConfirm } = (0, import_tds_react_native13.useDialog)();
1887
+ const { openConfirm } = (0, import_tds_react_native14.useDialog)();
1795
1888
  const global2 = getAppsInTossGlobals();
1796
1889
  const addEventListener = (0, import_react26.useCallback)(
1797
1890
  (handler) => {
@@ -1825,7 +1918,7 @@ function useWebBackHandler(webViewRef) {
1825
1918
  logging.closePopupCtaClick(isConfirmed);
1826
1919
  if (isConfirmed) {
1827
1920
  captureExitLog(Date.now());
1828
- (0, import_react_native27.closeView)();
1921
+ (0, import_react_native29.closeView)();
1829
1922
  }
1830
1923
  }
1831
1924
  }, [
@@ -1868,8 +1961,8 @@ function mergeRefs(...refs) {
1868
1961
  }
1869
1962
 
1870
1963
  // src/hooks/useCreateUserAgent.ts
1871
- var import_native_modules15 = require("@apps-in-toss/native-modules");
1872
- var import_react_native28 = require("react-native");
1964
+ var import_native_modules16 = require("@apps-in-toss/native-modules");
1965
+ var import_react_native30 = require("react-native");
1873
1966
  var FontA11yCategory = {
1874
1967
  Large: "Large",
1875
1968
  xLarge: "xLarge",
@@ -2002,13 +2095,14 @@ function useCreateUserAgent({
2002
2095
  safeArea,
2003
2096
  safeAreaBottomTransparency
2004
2097
  }) {
2005
- const platform = (0, import_native_modules15.getPlatformOS)();
2006
- const appVersion = (0, import_native_modules15.getTossAppVersion)();
2007
- const { fontScale } = (0, import_react_native28.useWindowDimensions)();
2098
+ const platform = (0, import_native_modules16.getPlatformOS)();
2099
+ const appVersion = (0, import_native_modules16.getTossAppVersion)();
2100
+ const { fontScale } = (0, import_react_native30.useWindowDimensions)();
2008
2101
  const platformString = platform === "ios" ? "iPhone" : "Android phone";
2009
2102
  const fontA11y = mapFontScaleToCategory(fontScale, platform);
2010
2103
  const normalizedFontScale = convertToAndroidStyleScale(fontScale, platform);
2011
2104
  return [
2105
+ "AppsInToss",
2012
2106
  `TossApp/${appVersion}`,
2013
2107
  batteryModePreference && `TossBatteryModePreference/${batteryModePreference}`,
2014
2108
  colorPreference && `TossColorPreference/${colorPreference}`,
@@ -2024,17 +2118,17 @@ function useCreateUserAgent({
2024
2118
  }
2025
2119
 
2026
2120
  // src/hooks/useGeolocation.ts
2027
- var import_native_modules16 = require("@apps-in-toss/native-modules");
2028
- var import_react_native29 = require("@granite-js/react-native");
2121
+ var import_native_modules17 = require("@apps-in-toss/native-modules");
2122
+ var import_react_native31 = require("@granite-js/react-native");
2029
2123
  var import_react27 = require("react");
2030
2124
  function useGeolocation({ accuracy, distanceInterval, timeInterval }) {
2031
- const isVisible = (0, import_react_native29.useVisibility)();
2125
+ const isVisible = (0, import_react_native31.useVisibility)();
2032
2126
  const [location, setLocation] = (0, import_react27.useState)(null);
2033
2127
  (0, import_react27.useEffect)(() => {
2034
2128
  if (!isVisible) {
2035
2129
  return;
2036
2130
  }
2037
- return (0, import_native_modules16.startUpdateLocation)({
2131
+ return (0, import_native_modules17.startUpdateLocation)({
2038
2132
  options: {
2039
2133
  accuracy,
2040
2134
  distanceInterval,
@@ -2048,11 +2142,11 @@ function useGeolocation({ accuracy, distanceInterval, timeInterval }) {
2048
2142
  }
2049
2143
 
2050
2144
  // src/hooks/useWaitForReturnNavigator.tsx
2051
- var import_react_native30 = require("@granite-js/react-native");
2145
+ var import_react_native32 = require("@granite-js/react-native");
2052
2146
  var import_react28 = require("react");
2053
2147
  function useWaitForReturnNavigator() {
2054
2148
  const callbacks = (0, import_react28.useRef)([]).current;
2055
- const navigation = (0, import_react_native30.useNavigation)();
2149
+ const navigation = (0, import_react_native32.useNavigation)();
2056
2150
  const startNavigating = (0, import_react28.useCallback)(
2057
2151
  (route, params) => {
2058
2152
  return new Promise((resolve) => {
@@ -2073,7 +2167,7 @@ function useWaitForReturnNavigator() {
2073
2167
  },
2074
2168
  [callbacks]
2075
2169
  );
2076
- (0, import_react_native30.useVisibilityChange)(handleVisibilityChange);
2170
+ (0, import_react_native32.useVisibilityChange)(handleVisibilityChange);
2077
2171
  return startNavigating;
2078
2172
  }
2079
2173
 
@@ -2087,8 +2181,8 @@ function useTopNavigation() {
2087
2181
  }
2088
2182
 
2089
2183
  // src/utils/log.ts
2090
- var import_native_modules17 = require("@apps-in-toss/native-modules");
2091
- var import_react_native31 = require("@granite-js/react-native");
2184
+ var import_native_modules18 = require("@apps-in-toss/native-modules");
2185
+ var import_react_native33 = require("@granite-js/react-native");
2092
2186
 
2093
2187
  // src/utils/extractDateFromUUIDv7.ts
2094
2188
  var extractDateFromUUIDv7 = (uuid) => {
@@ -2114,7 +2208,7 @@ var getGroupId = (url) => {
2114
2208
  };
2115
2209
  var getReferrer = () => {
2116
2210
  try {
2117
- const referrer = new URL((0, import_react_native31.getSchemeUri)());
2211
+ const referrer = new URL((0, import_react_native33.getSchemeUri)());
2118
2212
  return referrer.searchParams.get("referrer");
2119
2213
  } catch {
2120
2214
  return "";
@@ -2132,21 +2226,21 @@ var trackScreen = (url) => {
2132
2226
  deployment_timestamp: extractDateFromUUIDv7(env.getDeploymentId()).getTime()
2133
2227
  }
2134
2228
  };
2135
- return (0, import_native_modules17.eventLog)(log);
2229
+ return (0, import_native_modules18.eventLog)(log);
2136
2230
  };
2137
2231
 
2138
2232
  // src/components/WebView.tsx
2139
- var import_jsx_runtime16 = require("react/jsx-runtime");
2233
+ var import_jsx_runtime18 = require("react/jsx-runtime");
2140
2234
  var operationalEnvironment = appsInTossConstantBridges.getOperationalEnvironment();
2141
2235
  var TYPES = ["partner", "external", "game"];
2142
2236
  var WEBVIEW_TYPES = {
2143
2237
  partner: PartnerWebView,
2144
- external: import_tds_react_native14.ExternalWebViewScreen,
2238
+ external: import_tds_react_native15.ExternalWebViewScreen,
2145
2239
  game: GameWebView
2146
2240
  };
2147
2241
  function mergeSchemeQueryParamsInto(url) {
2148
2242
  const baseUrl = new URL(url);
2149
- const schemeUrl = new URL((0, import_react_native32.getSchemeUri)());
2243
+ const schemeUrl = new URL((0, import_react_native34.getSchemeUri)());
2150
2244
  baseUrl.pathname = schemeUrl.pathname;
2151
2245
  for (const [key, value] of schemeUrl.searchParams.entries()) {
2152
2246
  baseUrl.searchParams.set(key, value);
@@ -2158,7 +2252,7 @@ function getWebViewUri(local) {
2158
2252
  const devUrl = `http://${local.host}:${local.port}`;
2159
2253
  return mergeSchemeQueryParamsInto(devUrl).toString();
2160
2254
  }
2161
- const { url: rawUrl } = import_native_modules18.AppsInTossModule.getWebBundleURL({});
2255
+ const { url: rawUrl } = import_native_modules19.AppsInTossModule.getWebBundleURL({});
2162
2256
  const url = mergeSchemeQueryParamsInto(rawUrl);
2163
2257
  const deploymentId = env.getDeploymentId();
2164
2258
  if (deploymentId) {
@@ -2184,18 +2278,17 @@ function WebView({ type, local, onMessage, ...props }) {
2184
2278
  );
2185
2279
  const handler = useBridgeHandler({
2186
2280
  onMessage,
2187
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2188
2281
  eventListenerMap: {
2189
2282
  ...appsInTossEventBridges,
2190
- navigationAccessoryEvent: ({ onEvent, onError }) => import_tds_react_native14.tdsEvent.addEventListener("navigationAccessoryEvent", { onEvent, onError }),
2283
+ navigationAccessoryEvent: ({ onEvent, onError }) => import_tds_react_native15.tdsEvent.addEventListener("navigationAccessoryEvent", { onEvent, onError }),
2191
2284
  backEvent: ({ onEvent }) => {
2192
2285
  webBackHandler.addEventListener(onEvent);
2193
2286
  return () => {
2194
2287
  webBackHandler.removeEventListener(onEvent);
2195
2288
  };
2196
2289
  },
2197
- entryMessageExited: ({ onEvent, onError }) => import_native_modules18.appsInTossEvent.addEventListener("entryMessageExited", { onEvent, onError }),
2198
- updateLocationEvent: ({ onEvent, onError, options }) => import_native_modules18.appsInTossEvent.addEventListener("updateLocationEvent", { onEvent, onError, options }),
2290
+ entryMessageExited: ({ onEvent, onError }) => import_native_modules19.appsInTossEvent.addEventListener("entryMessageExited", { onEvent, onError }),
2291
+ updateLocationEvent: ({ onEvent, onError, options }) => import_native_modules19.appsInTossEvent.addEventListener("updateLocationEvent", { onEvent, onError, options }),
2199
2292
  safeAreaInsetsChange: ({ onEvent }) => {
2200
2293
  safeAreaInsetsEmitter.on("safeAreaInsetsChange", onEvent);
2201
2294
  return () => {
@@ -2203,18 +2296,18 @@ function WebView({ type, local, onMessage, ...props }) {
2203
2296
  };
2204
2297
  },
2205
2298
  /** @internal */
2206
- appBridgeCallbackEvent: ({ onEvent, onError, options }) => import_native_modules18.appsInTossEvent.addEventListener("appBridgeCallbackEvent", { onEvent, onError, options }),
2299
+ appBridgeCallbackEvent: ({ onEvent, onError, options }) => import_native_modules19.appsInTossEvent.addEventListener("appBridgeCallbackEvent", { onEvent, onError, options }),
2207
2300
  /** AdMob */
2208
- loadAdMobInterstitialAd: import_native_modules18.GoogleAdMob.loadAdMobInterstitialAd,
2209
- showAdMobInterstitialAd: import_native_modules18.GoogleAdMob.showAdMobInterstitialAd,
2210
- loadAdMobRewardedAd: import_native_modules18.GoogleAdMob.loadAdMobRewardedAd,
2211
- showAdMobRewardedAd: import_native_modules18.GoogleAdMob.showAdMobRewardedAd,
2301
+ loadAdMobInterstitialAd: import_native_modules19.GoogleAdMob.loadAdMobInterstitialAd,
2302
+ showAdMobInterstitialAd: import_native_modules19.GoogleAdMob.showAdMobInterstitialAd,
2303
+ loadAdMobRewardedAd: import_native_modules19.GoogleAdMob.loadAdMobRewardedAd,
2304
+ showAdMobRewardedAd: import_native_modules19.GoogleAdMob.showAdMobRewardedAd,
2212
2305
  /** AdMobV2 */
2213
- loadAppsInTossAdMob: import_native_modules18.GoogleAdMob.loadAppsInTossAdMob,
2214
- showAppsInTossAdMob: import_native_modules18.GoogleAdMob.showAppsInTossAdMob,
2306
+ loadAppsInTossAdMob: import_native_modules19.GoogleAdMob.loadAppsInTossAdMob,
2307
+ showAppsInTossAdMob: import_native_modules19.GoogleAdMob.showAppsInTossAdMob,
2215
2308
  /** IAP */
2216
- iapCreateOneTimePurchaseOrder: import_native_modules18.IAP.createOneTimePurchaseOrder,
2217
- requestOneTimePurchase: import_native_modules18.requestOneTimePurchase
2309
+ iapCreateOneTimePurchaseOrder: import_native_modules19.IAP.createOneTimePurchaseOrder,
2310
+ requestOneTimePurchase: import_native_modules19.requestOneTimePurchase
2218
2311
  },
2219
2312
  constantHandlerMap: {
2220
2313
  ...appsInTossConstantBridges,
@@ -2224,13 +2317,13 @@ function WebView({ type, local, onMessage, ...props }) {
2224
2317
  getSafeAreaRight: () => insets.right,
2225
2318
  ...Object.fromEntries(Object.entries(global2).map(([key, value]) => [key, () => value])),
2226
2319
  /** AdMob */
2227
- loadAdMobInterstitialAd_isSupported: import_native_modules18.GoogleAdMob.loadAdMobInterstitialAd.isSupported,
2228
- showAdMobInterstitialAd_isSupported: import_native_modules18.GoogleAdMob.showAdMobInterstitialAd.isSupported,
2229
- loadAdMobRewardedAd_isSupported: import_native_modules18.GoogleAdMob.loadAdMobRewardedAd.isSupported,
2230
- showAdMobRewardedAd_isSupported: import_native_modules18.GoogleAdMob.showAdMobRewardedAd.isSupported,
2320
+ loadAdMobInterstitialAd_isSupported: import_native_modules19.GoogleAdMob.loadAdMobInterstitialAd.isSupported,
2321
+ showAdMobInterstitialAd_isSupported: import_native_modules19.GoogleAdMob.showAdMobInterstitialAd.isSupported,
2322
+ loadAdMobRewardedAd_isSupported: import_native_modules19.GoogleAdMob.loadAdMobRewardedAd.isSupported,
2323
+ showAdMobRewardedAd_isSupported: import_native_modules19.GoogleAdMob.showAdMobRewardedAd.isSupported,
2231
2324
  /** AdMobV2 */
2232
- loadAppsInTossAdMob_isSupported: import_native_modules18.GoogleAdMob.loadAppsInTossAdMob.isSupported,
2233
- showAppsInTossAdMob_isSupported: import_native_modules18.GoogleAdMob.showAppsInTossAdMob.isSupported,
2325
+ loadAppsInTossAdMob_isSupported: import_native_modules19.GoogleAdMob.loadAppsInTossAdMob.isSupported,
2326
+ showAppsInTossAdMob_isSupported: import_native_modules19.GoogleAdMob.showAppsInTossAdMob.isSupported,
2234
2327
  /** env */
2235
2328
  getDeploymentId: env.getDeploymentId
2236
2329
  },
@@ -2253,17 +2346,17 @@ function WebView({ type, local, onMessage, ...props }) {
2253
2346
  getCurrentLocation: appsInTossAsyncBridges.getCurrentLocation,
2254
2347
  openCamera: appsInTossAsyncBridges.openCamera,
2255
2348
  /** Storage */
2256
- getStorageItem: import_native_modules18.Storage.getItem,
2257
- setStorageItem: import_native_modules18.Storage.setItem,
2258
- removeStorageItem: import_native_modules18.Storage.removeItem,
2259
- clearItems: import_native_modules18.Storage.clearItems,
2349
+ getStorageItem: import_native_modules19.Storage.getItem,
2350
+ setStorageItem: import_native_modules19.Storage.setItem,
2351
+ removeStorageItem: import_native_modules19.Storage.removeItem,
2352
+ clearItems: import_native_modules19.Storage.clearItems,
2260
2353
  /** IAP */
2261
- iapGetProductItemList: import_native_modules18.IAP.getProductItemList,
2262
- iapCreateOneTimePurchaseOrder: import_native_modules18.iapCreateOneTimePurchaseOrder,
2263
- processProductGrant: import_native_modules18.processProductGrant,
2264
- getPendingOrders: import_native_modules18.IAP.getPendingOrders,
2265
- getCompletedOrRefundedOrders: import_native_modules18.IAP.getCompletedOrRefundedOrders,
2266
- completeProductGrant: import_native_modules18.IAP.completeProductGrant
2354
+ iapGetProductItemList: import_native_modules19.IAP.getProductItemList,
2355
+ iapCreateOneTimePurchaseOrder: import_native_modules19.iapCreateOneTimePurchaseOrder,
2356
+ processProductGrant: import_native_modules19.processProductGrant,
2357
+ getPendingOrders: import_native_modules19.IAP.getPendingOrders,
2358
+ getCompletedOrRefundedOrders: import_native_modules19.IAP.getCompletedOrRefundedOrders,
2359
+ completeProductGrant: import_native_modules19.IAP.completeProductGrant
2267
2360
  }
2268
2361
  });
2269
2362
  const headerPropForExternalWebView = (0, import_react29.useMemo)(() => {
@@ -2292,11 +2385,11 @@ function WebView({ type, local, onMessage, ...props }) {
2292
2385
  webBackHandler.handleWebBack();
2293
2386
  return true;
2294
2387
  };
2295
- import_react_native33.BackHandler.addEventListener("hardwareBackPress", callback);
2296
- return () => import_react_native33.BackHandler.removeEventListener("hardwareBackPress", callback);
2388
+ import_react_native35.BackHandler.addEventListener("hardwareBackPress", callback);
2389
+ return () => import_react_native35.BackHandler.removeEventListener("hardwareBackPress", callback);
2297
2390
  }, [webBackHandler]);
2298
2391
  const globalScripts = useGlobalScripts();
2299
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2392
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2300
2393
  BaseWebView,
2301
2394
  {
2302
2395
  ref: refs,
@@ -2318,15 +2411,30 @@ function WebView({ type, local, onMessage, ...props }) {
2318
2411
  props.onNavigationStateChange?.(event);
2319
2412
  webBackHandler.onNavigationStateChange(event);
2320
2413
  },
2321
- userAgent: import_react_native33.Platform.OS === "ios" ? userAgent : void 0,
2414
+ userAgent: import_react_native35.Platform.OS === "ios" ? userAgent : void 0,
2322
2415
  sharedCookiesEnabled: true,
2323
2416
  webviewDebuggingEnabled: webViewDebuggingEnabled,
2324
2417
  thirdPartyCookiesEnabled: true,
2325
2418
  onMessage: handler.onMessage,
2326
2419
  injectedJavaScript: globalScripts.afterLoad,
2327
2420
  injectedJavaScriptBeforeContentLoaded: mergeScripts(handler.injectedJavaScript, globalScripts.beforeLoad),
2328
- decelerationRate: import_react_native33.Platform.OS === "ios" ? 1 : void 0,
2329
- allowsBackForwardNavigationGestures
2421
+ decelerationRate: import_react_native35.Platform.OS === "ios" ? 1 : void 0,
2422
+ allowsBackForwardNavigationGestures,
2423
+ onShouldStartLoadWithRequest: (event) => {
2424
+ try {
2425
+ const url = new URL(event.url);
2426
+ if (["https:", "http:"].includes(url.protocol)) {
2427
+ return true;
2428
+ } else {
2429
+ import_react_native35.Linking.openURL(convertIntentURL(url) ?? url.href);
2430
+ return false;
2431
+ }
2432
+ } catch (error) {
2433
+ console.error(error);
2434
+ return false;
2435
+ }
2436
+ },
2437
+ originWhitelist: ["https://*", "http://*", "intoss://*", "intoss-private://*", "servicetoss://*", "supertoss://*", "intent://*"]
2330
2438
  }
2331
2439
  );
2332
2440
  }