@apps-in-toss/native-modules 0.0.0-dev.1752115036458 → 0.0.0-dev.1757056983098

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 (77) hide show
  1. package/dist/bridges-meta.json +36 -13
  2. package/dist/index.cjs +343 -129
  3. package/dist/index.d.cts +1212 -418
  4. package/dist/index.d.ts +1212 -418
  5. package/dist/index.js +315 -108
  6. package/package.json +7 -8
  7. package/src/AppsInTossModule/constants.ts +6 -0
  8. package/src/AppsInTossModule/native-event-emitter/appsInTossEvent.ts +15 -0
  9. package/src/AppsInTossModule/native-event-emitter/contactsViral.ts +140 -0
  10. package/src/AppsInTossModule/native-event-emitter/event-plugins/EntryMessageExitedEvent.ts +10 -0
  11. package/src/AppsInTossModule/native-event-emitter/event-plugins/HomeIconButtonClickHandleEvent.ts +10 -0
  12. package/src/AppsInTossModule/native-event-emitter/event-plugins/UpdateLocationEvent.ts +60 -0
  13. package/src/AppsInTossModule/native-event-emitter/index.ts +6 -0
  14. package/src/AppsInTossModule/native-event-emitter/internal/AppBridgeCallbackEvent.ts +45 -0
  15. package/src/AppsInTossModule/native-event-emitter/internal/VisibilityChangedByTransparentServiceWebEvent.ts +50 -0
  16. package/src/AppsInTossModule/native-event-emitter/internal/appBridge.spec.ts +135 -0
  17. package/src/AppsInTossModule/native-event-emitter/internal/appBridge.ts +79 -0
  18. package/src/AppsInTossModule/native-event-emitter/internal/onVisibilityChangedByTransparentServiceWeb.ts +20 -0
  19. package/src/AppsInTossModule/native-event-emitter/nativeEventEmitter.ts +35 -0
  20. package/src/AppsInTossModule/native-event-emitter/startUpdateLocation.ts +98 -0
  21. package/src/AppsInTossModule/native-event-emitter/types.ts +4 -0
  22. package/src/AppsInTossModule/native-modules/AppsInTossModule.ts +89 -0
  23. package/src/AppsInTossModule/native-modules/ads/googleAdMob.ts +681 -0
  24. package/src/AppsInTossModule/native-modules/ads/googleAdMobV2.ts +363 -0
  25. package/src/AppsInTossModule/native-modules/ads/types.ts +123 -0
  26. package/src/AppsInTossModule/native-modules/appLogin.ts +29 -0
  27. package/src/AppsInTossModule/native-modules/checkoutPayment.ts +80 -0
  28. package/src/AppsInTossModule/native-modules/eventLog.spec.ts +300 -0
  29. package/src/AppsInTossModule/native-modules/eventLog.ts +77 -0
  30. package/src/AppsInTossModule/native-modules/fetchAlbumPhotos.ts +88 -0
  31. package/src/AppsInTossModule/native-modules/fetchContacts.ts +121 -0
  32. package/src/AppsInTossModule/native-modules/getClipboardText.ts +47 -0
  33. package/src/AppsInTossModule/native-modules/getCurrentLocation.ts +65 -0
  34. package/src/AppsInTossModule/native-modules/getDeviceId.ts +33 -0
  35. package/src/AppsInTossModule/native-modules/getGameCenterGameProfile.ts +68 -0
  36. package/src/AppsInTossModule/native-modules/getOperationalEnvironment.ts +37 -0
  37. package/src/AppsInTossModule/native-modules/getPermission.ts +58 -0
  38. package/src/AppsInTossModule/native-modules/getTossAppVersion.ts +33 -0
  39. package/src/AppsInTossModule/native-modules/getTossShareLink.ts +39 -0
  40. package/src/AppsInTossModule/native-modules/iap.ts +213 -0
  41. package/src/AppsInTossModule/native-modules/index.ts +104 -0
  42. package/src/AppsInTossModule/native-modules/isMinVersionSupported.spec.ts +190 -0
  43. package/src/AppsInTossModule/native-modules/isMinVersionSupported.ts +68 -0
  44. package/src/AppsInTossModule/native-modules/openCamera.ts +81 -0
  45. package/src/AppsInTossModule/native-modules/openGameCenterLeaderboard.ts +44 -0
  46. package/src/AppsInTossModule/native-modules/openPermissionDialog.ts +54 -0
  47. package/src/AppsInTossModule/native-modules/requestPermission.ts +63 -0
  48. package/src/AppsInTossModule/native-modules/saveBase64Data.ts +57 -0
  49. package/src/AppsInTossModule/native-modules/setClipboardText.ts +39 -0
  50. package/src/AppsInTossModule/native-modules/setDeviceOrientation.ts +74 -0
  51. package/src/AppsInTossModule/native-modules/storage.ts +100 -0
  52. package/src/AppsInTossModule/native-modules/submitGameCenterLeaderBoardScore.ts +74 -0
  53. package/src/AppsInTossModule/native-modules/tossCore.ts +29 -0
  54. package/src/BedrockModule/native-modules/core/BedrockCoreModule.ts +8 -0
  55. package/src/BedrockModule/native-modules/index.ts +4 -0
  56. package/src/BedrockModule/native-modules/natives/BedrockModule.ts +20 -0
  57. package/src/BedrockModule/native-modules/natives/closeView.ts +25 -0
  58. package/src/BedrockModule/native-modules/natives/generateHapticFeedback/index.ts +27 -0
  59. package/src/BedrockModule/native-modules/natives/generateHapticFeedback/types.ts +38 -0
  60. package/src/BedrockModule/native-modules/natives/getLocale.ts +46 -0
  61. package/src/BedrockModule/native-modules/natives/getNetworkStatus/index.ts +59 -0
  62. package/src/BedrockModule/native-modules/natives/getNetworkStatus/types.ts +1 -0
  63. package/src/BedrockModule/native-modules/natives/getPlatformOS.ts +37 -0
  64. package/src/BedrockModule/native-modules/natives/getSchemeUri.ts +27 -0
  65. package/src/BedrockModule/native-modules/natives/index.ts +11 -0
  66. package/src/BedrockModule/native-modules/natives/openURL.ts +40 -0
  67. package/src/BedrockModule/native-modules/natives/setIosSwipeGestureEnabled.ts +43 -0
  68. package/src/BedrockModule/native-modules/natives/setScreenAwakeMode.ts +66 -0
  69. package/src/BedrockModule/native-modules/natives/setSecureScreen.ts +31 -0
  70. package/src/BedrockModule/native-modules/natives/share.ts +36 -0
  71. package/src/async-bridges.ts +3 -0
  72. package/src/event-bridges.ts +2 -0
  73. package/src/index.ts +16 -0
  74. package/src/types.ts +108 -0
  75. package/src/utils/compareVersion.spec.ts +176 -0
  76. package/src/utils/compareVersion.ts +104 -0
  77. package/src/utils/generateUUID.ts +5 -0
@@ -0,0 +1,33 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+
3
+ /**
4
+ * @public
5
+ * @category 환경 확인
6
+ * @kind function
7
+ * @name getDeviceId
8
+ * @description
9
+ * 사용 중인 기기의 고유 식별자를 문자열로 반환해요.
10
+ *
11
+ * 이 함수는 현재 사용 중인 기기의 고유 식별자를 문자열로 반환해요. 기기별로 설정이나 데이터를 저장하거나 사용자의 기기를 식별해서 로그를 기록하고 분석하는 데 사용할 수 있어요. 같은 사용자의 여러 기기를 구분하는 데도 유용해요.
12
+ *
13
+ * @returns {string} 기기의 고유 식별자를 나타내는 문자열이에요.
14
+ *
15
+ * @example
16
+ * ### 기기 고유 식별자 가져오기
17
+ *
18
+ * ```tsx
19
+ * import { getDeviceId } from '@apps-in-toss/framework';
20
+ * import { Text } from 'react-native';
21
+ *
22
+ * function MyPage() {
23
+ * const id = getDeviceId();
24
+ *
25
+ * return (
26
+ * <Text>사용자의 기기 고유 식별자: {id}</Text>
27
+ * );
28
+ * }
29
+ * ```
30
+ */
31
+ export function getDeviceId(): string {
32
+ return AppsInTossModule.deviceId;
33
+ }
@@ -0,0 +1,68 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+ import { isMinVersionSupported } from './isMinVersionSupported';
3
+ import { GAME_CENTER_MIN_VERSION } from '../constants';
4
+
5
+ /**
6
+ * @category 게임센터
7
+ * @name GameCenterGameProfileResponse
8
+ * @description 토스게임센터 프로필을 가져온 결과 타입이에요.
9
+ * 앱에 프로필이 없는 경우, `statusCode`가 `'PROFILE_NOT_FOUND'`이고 다른 정보는 없어요.
10
+ * 프로필이 있는 경우 `statusCode`가 `'SUCCESS'`이고, 닉네임과 프로필 이미지 주소가 함께 제공돼요.
11
+ * @property {string} statusCode 프로필 조회 결과 상태예요. `'SUCCESS'` 또는 `'PROFILE_NOT_FOUND'` 중 하나예요.
12
+ * @property {string} [nickname] 프로필 닉네임이에요. `statusCode`가 `'SUCCESS'`일 때만 있어요.
13
+ * @property {string} [profileImageUri] 프로필 이미지 URL이에요. `statusCode`가 `'SUCCESS'`일 때만 있어요.
14
+ */
15
+ export type GameCenterGameProfileResponse =
16
+ | { statusCode: 'PROFILE_NOT_FOUND' }
17
+ | {
18
+ statusCode: 'SUCCESS';
19
+ nickname: string;
20
+ profileImageUri: string;
21
+ };
22
+
23
+ /**
24
+ * @category 게임센터
25
+ * @name getGameCenterGameProfile
26
+ * @description 토스게임센터 프로필 정보를 가져와요.
27
+ * 사용자가 프로필을 만들지 않았다면 `statusCode`가 `'PROFILE_NOT_FOUND'`인 응답이 반환돼요.
28
+ * 앱 버전이 최소 지원 버전(안드로이드 5.221.0, iOS 5.221.0)보다 낮으면 `undefined`를 반환해요.
29
+ * @returns {Promise<GameCenterGameProfileResponse | undefined>} 프로필 정보 또는 `undefined`를 반환해요.
30
+ *
31
+ * @example
32
+ * ### 게임센터 프로필 가져오기
33
+ * ```tsx
34
+ * import { getGameCenterGameProfile } from './getGameCenterGameProfile';
35
+ * import { useState } from 'react';
36
+ * import { View, Button } from 'react-native';
37
+ *
38
+ * function GameProfile() {
39
+ * const [profile, setProfile] = useState<GameCenterGameProfileResponse | null>(null);
40
+ *
41
+ * const handlePress = async () => {
42
+ * try {
43
+ * const result = await getGameCenterGameProfile();
44
+ * if (result) {
45
+ * setProfile(result);
46
+ * }
47
+ * } catch (error) {
48
+ * console.error('게임센터 프로필 가져오기에 실패했어요.', error);
49
+ * }
50
+ * };
51
+ *
52
+ * return (
53
+ * <View>
54
+ * <Button title="게임센터 프로필 가져오기" onPress={handlePress} />
55
+ * </View>
56
+ * );
57
+ * }
58
+ * ```
59
+ */
60
+ export async function getGameCenterGameProfile() {
61
+ const isSupported = isMinVersionSupported(GAME_CENTER_MIN_VERSION);
62
+
63
+ if (!isSupported) {
64
+ return;
65
+ }
66
+
67
+ return AppsInTossModule.getGameCenterGameProfile({});
68
+ }
@@ -0,0 +1,37 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+
3
+ /**
4
+ * @public
5
+ * @category 환경 확인
6
+ * @kind function
7
+ * @name getOperationalEnvironment
8
+ * @description
9
+ * 현재 실행 중인 앱의 운영 환경을 확인해요.
10
+ * 토스 앱에서 실행 중이라면 `'toss'`, 샌드박스 환경에서 실행 중이라면 `'sandbox'`를 반환해요.
11
+ *
12
+ * 운영 환경은 앱이 실행되는 컨텍스트를 의미하며, 특정 기능의 사용 가능 여부를 판단하는 데 활용할 수 있어요.
13
+ *
14
+ * @returns {'toss' | 'sandbox'}
15
+ * 현재 운영 환경을 나타내는 문자열이에요.
16
+ * - `'toss'`: 토스 앱에서 실행 중이에요.
17
+ * - `'sandbox'`: 샌드박스 환경에서 실행 중이에요.
18
+ *
19
+ * @example
20
+ * ### 현재 운영 환경 확인하기
21
+ *
22
+ * ```tsx
23
+ * import { getOperationalEnvironment } from '@apps-in-toss/framework';
24
+ * import { Text } from 'react-native';
25
+ *
26
+ * function EnvironmentInfo() {
27
+ * const environment = getOperationalEnvironment();
28
+ *
29
+ * return (
30
+ * <Text>현재 운영 환경: {environment}</Text>
31
+ * );
32
+ * }
33
+ * ```
34
+ */
35
+ export function getOperationalEnvironment(): 'toss' | 'sandbox' {
36
+ return AppsInTossModule.operationalEnvironment;
37
+ }
@@ -0,0 +1,58 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+ import { PermissionAccess, PermissionName, PermissionStatus } from '../../types';
3
+
4
+ /**
5
+ * @category AppsInTossModules
6
+ * @name getPermission
7
+ * @description 특정 권한의 현재 상태를 확인하는 함수예요. 사용자가 권한을 허용했는지, 거부했는지, 또는 아직 선택하지 않았는지를 알 수 있어요.
8
+ * @param permission.name {PermissionName} 요청할 권한의 이름이에요. 예를 들어 `clipboard`는 클립보드 접근 권한을, `camera`는 카메라 접근 권한을 나타내요.
9
+ * @param permission.access {PermissionAccess} 요청할 권한의 접근 유형이에요. 예를 들어 `read`는 읽기 권한, `write`는 쓰기 권한을 의미해요.
10
+ * @returns {Promise<'allowed' | 'denied' | 'notDetermined'>} 권한의 현재 상태를 반환해요. 반환값은 다음 중 하나예요:
11
+ * - `allowed`: 권한이 허용된 상태예요.
12
+ * - `denied`: 권한이 거부된 상태예요.
13
+ * - `notDetermined`: 아직 권한 요청에 대한 결정이 이루어지지 않은 상태예요.
14
+ *
15
+ * @example
16
+ * ### 클립보드 읽기 권한 상태 확인하기
17
+ *
18
+ * ```tsx
19
+ * import React, { useEffect, useState } from 'react';
20
+ * import { View, Text } from 'react-native';
21
+ * import { getPermission, type PermissionStatus } from '@apps-in-toss/framework';
22
+ *
23
+ * function PermissionCheck() {
24
+ * const [permission, setPermission] = useState<PermissionStatus | null>(null);
25
+ *
26
+ * useEffect(() => {
27
+ * async function checkPermission() {
28
+ * try {
29
+ * // 'clipboard'는 권한 이름, 'read'는 접근 유형을 나타내요.
30
+ * const status = await getPermission({
31
+ * name: 'clipboard', // 클립보드 접근 권한
32
+ * access: 'read', // 읽기 권한 요청
33
+ * });
34
+ * setPermission(status); // 권한 상태를 업데이트해요.
35
+ * } catch (error) {
36
+ * console.error('권한 상태를 확인하지 못했어요:', error);
37
+ * }
38
+ * }
39
+ *
40
+ * checkPermission();
41
+ * }, []);
42
+ *
43
+ * return (
44
+ * <View>
45
+ * <Text>
46
+ * 클립보드 읽기 권한 상태: {permission ? permission : '확인 중...'}
47
+ * </Text>
48
+ * </View>
49
+ * );
50
+ * }
51
+ * ```
52
+ */
53
+ export function getPermission(permission: {
54
+ name: PermissionName;
55
+ access: PermissionAccess;
56
+ }): Promise<PermissionStatus> {
57
+ return AppsInTossModule.getPermission(permission);
58
+ }
@@ -0,0 +1,33 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+
3
+ /**
4
+ * @public
5
+ * @category 환경 확인
6
+ * @name getTossAppVersion
7
+ * @description 토스 앱 버전을 가져옵니다. 예를 들어, `5.206.0`과 같은 형태로 반환돼요. 토스 앱 버전을 로그로 남기거나, 특정 기능이 특정 버전 이상에서만 실행될 때 사용돼요.
8
+ * @signature
9
+ * ```typescript
10
+ * function getTossAppVersion(): string
11
+ * ```
12
+ *
13
+ * @returns {string} 토스 앱 버전
14
+ *
15
+ * @example
16
+ *
17
+ *
18
+ * ### 토스 앱 버전 확인하기
19
+ *
20
+ * ```tsx
21
+ * import { getTossAppVersion } from '@apps-in-toss/framework';
22
+ * import { Text } from 'react-native';
23
+ *
24
+ * export function TossAppVersionPage() {
25
+ * return (
26
+ * <Text>{getTossAppVersion()}</Text>
27
+ * )
28
+ * }
29
+ * ```
30
+ */
31
+ export function getTossAppVersion() {
32
+ return AppsInTossModule.tossAppVersion;
33
+ }
@@ -0,0 +1,39 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+
3
+ /**
4
+ * @public
5
+ * @category 공유
6
+ * @kind function
7
+ * @name getTossShareLink
8
+ * @description
9
+ * `getTossShareLink` 함수는 사용자가 지정한 경로를 토스 앱에서 열 수 있는 공유 링크를 반환해요.
10
+ * 이 링크를 다른 사람과 공유하면 토스 앱이 실행되면서 지정한 경로로 진입해요. 토스앱이 없는 사람은 iOS 일 때는 앱스토어로 이동하고, Android 일 때는 플레이스토어로 이동해요.
11
+ *
12
+ * 경로는 토스 앱 내부 특정 화면을 나타내는 딥링크(deep link) 형식이어야 해요.
13
+ * 예를 들어 `intoss://<앱 이름>`이나 `intoss://<앱 이름>/about?name=test`처럼 작성해요.
14
+ *
15
+ * 이 함수를 사용하면 `deep_link_value`를 포함한 완성된 공유 링크를 만들 수 있어요.
16
+ *
17
+ * @param path - 딥링크로 열고 싶은 경로예요. `intoss://`로 시작하는 문자열이어야 해요.
18
+ * @returns {Promise<string>} `deep_link_value`가 포함된 토스 공유 링크를 반환해요.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * import { share } from '@granite-js/react-native';
23
+ * import { getTossShareLink } from '@apps-in-toss/framework';
24
+ *
25
+ * // '/' 경로를 딥링크로 포함한 토스 공유 링크를 생성해요.
26
+ * const tossLink = await getTossShareLink('intoss://my-app');
27
+ *
28
+ * // 생성한 링크를 메시지로 공유해요.
29
+ * await share({ message: tossLink });
30
+ * ```
31
+ */
32
+ export async function getTossShareLink(path: string): Promise<string> {
33
+ const { shareLink } = await AppsInTossModule.getTossShareLink({});
34
+ const shareUrl = new URL(shareLink);
35
+
36
+ shareUrl.searchParams.set('deep_link_value', path);
37
+ shareUrl.searchParams.set('af_dp', path);
38
+ return shareUrl.toString();
39
+ }
@@ -0,0 +1,213 @@
1
+ import { AppsInTossModule } from './AppsInTossModule';
2
+ import { isMinVersionSupported } from './isMinVersionSupported';
3
+
4
+ /**
5
+ * @public
6
+ * @category 인앱결제
7
+ * @name IapCreateOneTimePurchaseOrderOptions
8
+ * @description 인앱결제 1건을 요청할 때 필요한 정보예요.
9
+ * @property {string} productId - 주문할 상품의 ID예요.
10
+ */
11
+ export interface IapCreateOneTimePurchaseOrderOptions {
12
+ productId: string;
13
+ }
14
+
15
+ /**
16
+ * @public
17
+ * @category 인앱결제
18
+ * @name IapCreateOneTimePurchaseOrderResult
19
+ * @description 인앱결제 1건이 완료되면 결제 세부 정보와 상품 정보를 담아 반환해요. 반환된 정보로 결제한 상품의 정보를 화면에 표시할 수 있어요.
20
+ * @property {string} orderId - 결제 주문 ID이에요. 결제 완료 후 [결제 상태를 조회](https://developers-apps-in-toss.toss.im/api/getIapOrderStatus.html)할 때 사용해요.
21
+ * @property {string} displayName - 화면에 표시할 상품 이름이에요.
22
+ * @property {string} displayAmount - 통화 단위가 포함된 가격 정보예요. 예를 들어 `1,000원`으로 가격과 통화가 함께 표시돼요.
23
+ * @property {number} amount - 상품 가격 숫자 값이에요. 화폐 단위와 쉼표를 제외한 순수 숫자예요. 예를 들어 `1000`으로 표시돼요.
24
+ * @property {string} currency - [ISO 4217 표준](https://ko.wikipedia.org/wiki/ISO_4217)에 따른 상품 가격 통화 단위예요. 예를 들어 원화는 `KRW`, 달러는 `USD`로 표시돼요.
25
+ * @property {number} fraction - 가격을 표시할 때 소수점 아래 몇 자리까지 보여줄지 정하는 값이에요. 예를 들어 달러는 소수점 둘째 자리까지 보여줘서 `2`, 원화는 소수점이 필요 없어서 `0`이에요
26
+ * @property {string | null} miniAppIconUrl - 미니앱 아이콘 이미지의 URL이에요. 아이콘은 앱인토스 콘솔에서 설정한 이미지예요. 콘솔에서 아이콘을 등록하지 않았다면 `null`로 반환돼요.
27
+ */
28
+ export interface IapCreateOneTimePurchaseOrderResult {
29
+ orderId: string;
30
+ displayName: string;
31
+ displayAmount: string;
32
+ amount: number;
33
+ currency: string;
34
+ fraction: number;
35
+ miniAppIconUrl: string | null;
36
+ }
37
+
38
+ /**
39
+ * @public
40
+ * @category 인앱결제
41
+ * @name iapCreateOneTimePurchaseOrder
42
+ * @description
43
+ * 특정 인앱결제 주문서 페이지로 이동해요. 사용자가 상품 구매 버튼을 누르는 상황 등에 사용할 수 있어요. 사용자의 결제는 이동한 페이지에서 진행돼요. 만약 결제 중에 에러가 발생하면 에러 유형에 따라 에러 페이지로 이동해요.
44
+ * @param {IapCreateOneTimePurchaseOrderOptions} params - 인앱결제를 생성할 때 필요한 정보예요.
45
+ * @param {string} params.productId - 주문할 상품의 ID예요.
46
+ * @returns {Promise<IapCreateOneTimePurchaseOrderResult | undefined>} 결제에 성공하면 결제 결과 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 인앱결제를 실행할 수 없어서 `undefined`를 반환해요.
47
+ *
48
+ * @throw {code: "INVALID_PRODUCT_ID"} - 유효하지 않은 상품 ID이거나, 해당 상품이 존재하지 않을 때 발생해요.
49
+ * @throw {code: "PAYMENT_PENDING"} - 사용자가 요청한 결제가 아직 승인을 기다리고 있을 때 발생해요.
50
+ * @throw {code: "NETWORK_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
51
+ * @throw {code: "INVALID_USER_ENVIRONMENT"} - 특정 기기, 계정 또는 설정 환경에서 구매할 수 없는 상품일 때 발생해요.
52
+ * @throw {code: "ITEM_ALREADY_OWNED"} - 사용자가 이미 구매한 상품을 다시 구매하려고 할 때 발생해요.
53
+ * @throw {code: "APP_MARKET_VERIFICATION_FAILED"} - 사용자가 결제를 완료했지만, 앱스토어에서 사용자 정보 검증에 실패했을 때 발생해요. 사용자가 앱스토어에 문의해서 환불을 요청해야해요.
54
+ * @throw {code: "TOSS_SERVER_VERIFICATION_FAILED"} - 사용자가 결제를 완료했지만, 서버 전송에 실패해서 결제 정보를 저장할 수 없을 때 발생해요.
55
+ * @throw {code: "INTERNAL_ERROR"} - 서버 내부 문제로 요청을 처리할 수 없을 때 발생해요.
56
+ * @throw {code: "KOREAN_ACCOUNT_ONLY"} - iOS 환경에서 사용자의 계정이 한국 계정이 아닐 때 발생해요.
57
+ * @throw {code: "USER_CANCELED"} - 사용자가 결제를 완료하지 않고 주문서 페이지를 이탈했을 때 발생해요.
58
+ *
59
+ * @example
60
+ * ### 특정 인앱결제 주문서 페이지로 이동하기
61
+ *
62
+ * ```tsx
63
+ * import { IAP } from "@apps-in-toss/web-framework";
64
+ * import { Button } from "@toss-design-system/react-native";
65
+ *
66
+ * interface Props {
67
+ * productId: string;
68
+ * }
69
+ *
70
+ * function IapCreateOneTimePurchaseOrderButton({ productId }: Props) {
71
+ * async function handleClick() {
72
+ * try {
73
+ * await IAP.createOneTimePurchaseOrder({
74
+ * productId,
75
+ * });
76
+ * console.error("인앱결제에 성공했어요");
77
+ * } catch (error) {
78
+ * console.error('인앱결제에 실패했어요:', error);
79
+ * }
80
+ * }
81
+ *
82
+ * return <Button onClick={handleClick}>구매하기</Button>;
83
+ * }
84
+ * ```
85
+ */
86
+ async function createOneTimePurchaseOrder(params: IapCreateOneTimePurchaseOrderOptions) {
87
+ const isSupported = isMinVersionSupported({
88
+ android: '5.219.0',
89
+ ios: '5.219.0',
90
+ });
91
+
92
+ if (!isSupported) {
93
+ return;
94
+ }
95
+
96
+ return AppsInTossModule.iapCreateOneTimePurchaseOrder(params);
97
+ }
98
+
99
+ /**
100
+ * @public
101
+ * @category 인앱결제
102
+ * @name IapProductListItem
103
+ * @description 인앱결제로 구매할 수 있는 상품 하나의 정보를 담은 객체예요. 상품 목록을 화면에 표시할 때 사용해요.
104
+ * @property {string} sku - 상품의 고유 ID예요. [IAP.createOneTimePurchaseOrder](https://developers-apps-in-toss.toss.im/bedrock/reference/native-modules/%EC%9D%B8%EC%95%B1%20%EA%B2%B0%EC%A0%9C/createOneTimePurchaseOrder.html)를 호출할때 사용하는 `productId`와 동일한 값이에요.
105
+ * @property {string} displayName - 화면에 표시할 상품 이름이에요. 상품 이름은 앱인토스 콘솔에서 설정한 값이에요.
106
+ * @property {string} displayAmount - 통화 단위가 포함된 가격 정보예요. 예를 들어 `1,000원`으로 가격과 통화가 함께 표시돼요.
107
+ * @property {string} iconUrl - 상품 아이콘 이미지의 URL이에요. 아이콘은 앱인토스 콘솔에서 설정한 이미지예요.
108
+ * @property {string} description - 상품에 대한 설명이에요. 설명은 앱인토스 콘솔에서 설정한 값이에요.
109
+ */
110
+ export interface IapProductListItem {
111
+ sku: string;
112
+ displayAmount: string;
113
+ displayName: string;
114
+ iconUrl: string;
115
+ description: string;
116
+ }
117
+
118
+ /**
119
+ * @public
120
+ * @category 인앱결제
121
+ * @name iapGetProductItemList
122
+ * @description 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 상품 목록 화면에 진입할 때 호출해요.
123
+ * @returns {Promise<{ products: IapProductListItem[] } | undefined>} 상품 목록을 포함한 객체를 반환해요. 앱 버전이 최소 지원 버전(안드로이드 5.219.0, iOS 5.219.0)보다 낮으면 `undefined`를 반환해요.
124
+ *
125
+ * @example
126
+ * ### 구매 가능한 인앱결제 상품목록 가져오기
127
+ *
128
+ * ```tsx
129
+ * import { IAP, IapProductListItem } from "@apps-in-toss/framework";
130
+ * import { Button, List, ListRow } from "@toss-design-system/react-native";
131
+ * import { useEffect, useState } from "react";
132
+ *
133
+ * function IapProductList() {
134
+ * const [products, setProducts] = useState<IapProductListItem[]>([]);
135
+ *
136
+ * async function buyIapProduct(productId: string) {
137
+ * try {
138
+ * await IAP.createOneTimePurchaseOrder({
139
+ * productId,
140
+ * });
141
+ *
142
+ * console.error("인앱결제에 성공했어요");
143
+ * } catch (error) {
144
+ * console.error("인앱결제에 실패했어요:", error);
145
+ * }
146
+ * }
147
+ *
148
+ * useEffect(() => {
149
+ * async function fetchProducts() {
150
+ * try {
151
+ * const response = await IAP.getProductItemList();
152
+ * setProducts(response?.products ?? []);
153
+ * } catch (error) {
154
+ * console.error("상품 목록을 가져오는 데 실패했어요:", error);
155
+ * }
156
+ * }
157
+ *
158
+ * fetchProducts();
159
+ * }, []);
160
+ *
161
+ * return (
162
+ * <List>
163
+ * {products.map((product) => (
164
+ * <ListRow
165
+ * key={product.sku}
166
+ * left={
167
+ * <ListRow.Image type="square" source={{ uri: product.iconUrl }} />
168
+ * }
169
+ * right={
170
+ * <Button size="medium" onPress={() => buyIapProduct(product.sku)}>
171
+ * 구매하기
172
+ * </Button>
173
+ * }
174
+ * contents={
175
+ * <ListRow.Texts
176
+ * type="3RowTypeA"
177
+ * top={product.displayName}
178
+ * middle={product.description}
179
+ * bottom={product.displayAmount}
180
+ * />
181
+ * }
182
+ * />
183
+ * ))}
184
+ * </List>
185
+ * );
186
+ * }
187
+ * ```
188
+ */
189
+ async function getProductItemList() {
190
+ const isSupported = isMinVersionSupported({
191
+ android: '5.219.0',
192
+ ios: '5.219.0',
193
+ });
194
+
195
+ if (!isSupported) {
196
+ return;
197
+ }
198
+
199
+ return AppsInTossModule.iapGetProductItemList({});
200
+ }
201
+
202
+ /**
203
+ * @public
204
+ * @category 인앱결제
205
+ * @name IAP
206
+ * @description 인앱결제 관련 기능을 모은 객체예요. 단건 인앱결제 주문서 이동과 상품 목록 조회 기능을 제공해요.
207
+ * @property {typeof createOneTimePurchaseOrder} [createOneTimePurchaseOrder] 특정 인앱결제 주문서 페이지로 이동해요. 자세한 내용은 [createOneTimePurchaseOrder](https://developers-apps-in-toss.toss.im/bedrock/reference/native-modules/%EC%9D%B8%EC%95%B1%20%EA%B2%B0%EC%A0%9C/getProductItemList.html) 문서를 참고하세요.
208
+ * @property {typeof getProductItemList} [getProductItemList] 인앱결제로 구매할 수 있는 상품 목록을 가져와요. 자세한 내용은 [getProductItemList](https://developers-apps-in-toss.toss.im/bedrock/reference/native-modules/%EC%9D%B8%EC%95%B1%20%EA%B2%B0%EC%A0%9C/createOneTimePurchaseOrder.html) 문서를 참고하세요.
209
+ */
210
+ export const IAP = {
211
+ createOneTimePurchaseOrder,
212
+ getProductItemList,
213
+ };
@@ -0,0 +1,104 @@
1
+ // AdMob (deprecated)
2
+ import {
3
+ loadAdMobInterstitialAd,
4
+ loadAdMobRewardedAd,
5
+ showAdMobInterstitialAd,
6
+ showAdMobRewardedAd,
7
+ type LoadAdMobInterstitialAdEvent,
8
+ type LoadAdMobInterstitialAdOptions,
9
+ type LoadAdMobRewardedAdEvent,
10
+ type LoadAdMobRewardedAdOptions,
11
+ type ShowAdMobInterstitialAdEvent,
12
+ type ShowAdMobInterstitialAdOptions,
13
+ type ShowAdMobRewardedAdEvent,
14
+ type ShowAdMobRewardedAdOptions,
15
+ } from './ads/googleAdMob';
16
+ // AdMob V2
17
+ import {
18
+ loadAppsInTossAdMob,
19
+ showAppsInTossAdMob,
20
+ type LoadAdMobParams,
21
+ type LoadAdMobOptions,
22
+ type LoadAdMobEvent,
23
+ type ShowAdMobParams,
24
+ type ShowAdMobEvent,
25
+ type ShowAdMobOptions,
26
+ } from './ads/googleAdMobV2';
27
+ // TossPay
28
+ import { checkoutPayment, type CheckoutPaymentOptions, type CheckoutPaymentResult } from './checkoutPayment';
29
+
30
+ export { AppsInTossModuleInstance as INTERNAL__AppsInTossModule } from './AppsInTossModule';
31
+ export { AppsInTossModule } from './AppsInTossModule';
32
+
33
+ export * from './appLogin';
34
+ export * from './eventLog';
35
+ export * from './fetchAlbumPhotos';
36
+ export * from './fetchContacts';
37
+ export * from './getClipboardText';
38
+ export * from './getCurrentLocation';
39
+ export * from './getDeviceId';
40
+ export * from './getOperationalEnvironment';
41
+ export * from './getTossAppVersion';
42
+ export * from './getTossShareLink';
43
+ export * from './iap';
44
+ export * from './isMinVersionSupported';
45
+ export * from './openCamera';
46
+ export * from './saveBase64Data';
47
+ export * from './setClipboardText';
48
+ export * from './setDeviceOrientation';
49
+ export * from './storage';
50
+ export * from './openGameCenterLeaderboard';
51
+ export * from './getGameCenterGameProfile';
52
+ export * from './submitGameCenterLeaderBoardScore';
53
+ export * from '../native-event-emitter/contactsViral';
54
+
55
+ export type {
56
+ LoadAdMobInterstitialAdEvent,
57
+ LoadAdMobInterstitialAdOptions,
58
+ LoadAdMobRewardedAdEvent,
59
+ LoadAdMobRewardedAdOptions,
60
+ ShowAdMobInterstitialAdEvent,
61
+ ShowAdMobInterstitialAdOptions,
62
+ ShowAdMobRewardedAdEvent,
63
+ CheckoutPaymentOptions,
64
+ CheckoutPaymentResult,
65
+ ShowAdMobRewardedAdOptions,
66
+ LoadAdMobParams,
67
+ LoadAdMobOptions,
68
+ LoadAdMobEvent,
69
+ ShowAdMobParams,
70
+ ShowAdMobEvent,
71
+ ShowAdMobOptions,
72
+ };
73
+
74
+ /**
75
+ * @public
76
+ * @category 토스페이
77
+ * @name TossPay
78
+ * @description 토스페이 결제 관련 함수를 모아둔 객체예요.
79
+ * @property {typeof checkoutPayment} [checkoutPayment] 토스페이 결제를 인증하는 함수예요. 자세한 내용은 [checkoutPayment](/react-native/reference/native-modules/토스페이/checkoutPayment)를 참고하세요.
80
+ */
81
+ export const TossPay = {
82
+ checkoutPayment,
83
+ };
84
+
85
+ /**
86
+ * @public
87
+ * @category 광고
88
+ * @name GoogleAdMob
89
+ * @description Google AdMob 광고 관련 함수를 모아둔 객체예요.
90
+ * @property {typeof loadAdMobInterstitialAd} [loadAdMobInterstitialAd] 전면 광고를 로드하는 함수예요. 자세한 내용은 [loadAdMobInterstitialAd](/react-native/reference/native-modules/광고/loadAdMobInterstitialAd.html)를 참고하세요.
91
+ * @property {typeof showAdMobInterstitialAd} [showAdMobInterstitialAd] 로드한 전면 광고를 보여주는 함수예요. 자세한 내용은 [showAdMobInterstitialAd](/react-native/reference/native-modules/광고/showAdMobInterstitialAd.html)를 참고하세요.
92
+ * @property {typeof loadAdMobRewardedAd} [loadAdMobRewardedAd] 보상형 광고를 로드하는 함수예요. 자세한 내용은 [loadAdMobRewardedAd](/react-native/reference/native-modules/광고/loadAdMobRewardedAd.html)를 참고하세요.
93
+ * @property {typeof showAdMobRewardedAd} [showAdMobRewardedAd] 로드한 보상형 광고를 보여주는 함수예요. 자세한 내용은 [showAdMobRewardedAd](/react-native/reference/native-modules/광고/showAdMobRewardedAd.html)를 참고하세요.
94
+ * @property {typeof loadAppsInTossAdMob} [loadAppsInTossAdMob] 광고를 로드하는 함수예요. 자세한 내용은 [loadAppsInTossAdMob](/react-native/reference/native-modules/광고/loadAppsInTossAdMob.html)를 참고하세요.
95
+ * @property {typeof showAppsInTossAdMob} [showAppsInTossAdMob] 로드한 광고를 보여주는 함수예요. 자세한 내용은 [showAppsInTossAdMob](/react-native/reference/native-modules/광고/showAppsInTossAdMob.html)를 참고하세요.
96
+ */
97
+ export const GoogleAdMob = {
98
+ loadAdMobInterstitialAd,
99
+ showAdMobInterstitialAd,
100
+ loadAdMobRewardedAd,
101
+ showAdMobRewardedAd,
102
+ loadAppsInTossAdMob,
103
+ showAppsInTossAdMob,
104
+ };