@apps-in-toss/native-modules 0.0.0-dev.1752049503789 → 1.0.0
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/bridges-meta.json +36 -13
- package/dist/index.cjs +256 -120
- package/dist/index.d.cts +697 -229
- package/dist/index.d.ts +697 -229
- package/dist/index.js +233 -103
- package/package.json +7 -8
- package/src/AppsInTossModule/constants.ts +6 -0
- package/src/AppsInTossModule/native-event-emitter/appsInTossEvent.ts +13 -0
- package/src/AppsInTossModule/native-event-emitter/contactsViral.ts +140 -0
- package/src/AppsInTossModule/native-event-emitter/event-plugins/EntryMessageExitedEvent.ts +10 -0
- package/src/AppsInTossModule/native-event-emitter/event-plugins/UpdateLocationEvent.ts +60 -0
- package/src/AppsInTossModule/native-event-emitter/index.ts +5 -0
- package/src/AppsInTossModule/native-event-emitter/internal/AppBridgeCallbackEvent.ts +45 -0
- package/src/AppsInTossModule/native-event-emitter/internal/VisibilityChangedByTransparentServiceWebEvent.ts +50 -0
- package/src/AppsInTossModule/native-event-emitter/internal/appBridge.spec.ts +135 -0
- package/src/AppsInTossModule/native-event-emitter/internal/appBridge.ts +79 -0
- package/src/AppsInTossModule/native-event-emitter/internal/onVisibilityChangedByTransparentServiceWeb.ts +20 -0
- package/src/AppsInTossModule/native-event-emitter/nativeEventEmitter.ts +35 -0
- package/src/AppsInTossModule/native-event-emitter/startUpdateLocation.ts +98 -0
- package/src/AppsInTossModule/native-event-emitter/types.ts +4 -0
- package/src/AppsInTossModule/native-modules/AppsInTossModule.ts +89 -0
- package/src/AppsInTossModule/native-modules/ads/googleAdMob.ts +690 -0
- package/src/AppsInTossModule/native-modules/ads/types.ts +106 -0
- package/src/AppsInTossModule/native-modules/appLogin.ts +29 -0
- package/src/AppsInTossModule/native-modules/checkoutPayment.ts +80 -0
- package/src/AppsInTossModule/native-modules/eventLog.spec.ts +300 -0
- package/src/AppsInTossModule/native-modules/eventLog.ts +77 -0
- package/src/AppsInTossModule/native-modules/fetchAlbumPhotos.ts +88 -0
- package/src/AppsInTossModule/native-modules/fetchContacts.ts +121 -0
- package/src/AppsInTossModule/native-modules/getClipboardText.ts +47 -0
- package/src/AppsInTossModule/native-modules/getCurrentLocation.ts +65 -0
- package/src/AppsInTossModule/native-modules/getDeviceId.ts +33 -0
- package/src/AppsInTossModule/native-modules/getGameCenterGameProfile.ts +68 -0
- package/src/AppsInTossModule/native-modules/getOperationalEnvironment.ts +37 -0
- package/src/AppsInTossModule/native-modules/getPermission.ts +58 -0
- package/src/AppsInTossModule/native-modules/getTossAppVersion.ts +33 -0
- package/src/AppsInTossModule/native-modules/getTossShareLink.ts +39 -0
- package/src/AppsInTossModule/native-modules/iap.ts +213 -0
- package/src/AppsInTossModule/native-modules/index.ts +86 -0
- package/src/AppsInTossModule/native-modules/isMinVersionSupported.spec.ts +190 -0
- package/src/AppsInTossModule/native-modules/isMinVersionSupported.ts +68 -0
- package/src/AppsInTossModule/native-modules/openCamera.ts +81 -0
- package/src/AppsInTossModule/native-modules/openGameCenterLeaderboard.ts +44 -0
- package/src/AppsInTossModule/native-modules/openPermissionDialog.ts +54 -0
- package/src/AppsInTossModule/native-modules/requestPermission.ts +63 -0
- package/src/AppsInTossModule/native-modules/saveBase64Data.ts +57 -0
- package/src/AppsInTossModule/native-modules/setClipboardText.ts +39 -0
- package/src/AppsInTossModule/native-modules/setDeviceOrientation.ts +74 -0
- package/src/AppsInTossModule/native-modules/storage.ts +100 -0
- package/src/AppsInTossModule/native-modules/submitGameCenterLeaderBoardScore.ts +74 -0
- package/src/AppsInTossModule/native-modules/tossCore.ts +29 -0
- package/src/BedrockModule/native-modules/core/BedrockCoreModule.ts +8 -0
- package/src/BedrockModule/native-modules/index.ts +4 -0
- package/src/BedrockModule/native-modules/natives/BedrockModule.ts +20 -0
- package/src/BedrockModule/native-modules/natives/closeView.ts +25 -0
- package/src/BedrockModule/native-modules/natives/generateHapticFeedback/index.ts +27 -0
- package/src/BedrockModule/native-modules/natives/generateHapticFeedback/types.ts +38 -0
- package/src/BedrockModule/native-modules/natives/getLocale.ts +46 -0
- package/src/BedrockModule/native-modules/natives/getNetworkStatus/index.ts +59 -0
- package/src/BedrockModule/native-modules/natives/getNetworkStatus/types.ts +1 -0
- package/src/BedrockModule/native-modules/natives/getPlatformOS.ts +37 -0
- package/src/BedrockModule/native-modules/natives/getSchemeUri.ts +27 -0
- package/src/BedrockModule/native-modules/natives/index.ts +11 -0
- package/src/BedrockModule/native-modules/natives/openURL.ts +40 -0
- package/src/BedrockModule/native-modules/natives/setIosSwipeGestureEnabled.ts +43 -0
- package/src/BedrockModule/native-modules/natives/setScreenAwakeMode.ts +66 -0
- package/src/BedrockModule/native-modules/natives/setSecureScreen.ts +31 -0
- package/src/BedrockModule/native-modules/natives/share.ts +36 -0
- package/src/async-bridges.ts +3 -0
- package/src/event-bridges.ts +2 -0
- package/src/index.ts +16 -0
- package/src/types.ts +108 -0
- package/src/utils/compareVersion.spec.ts +176 -0
- package/src/utils/compareVersion.ts +104 -0
- package/src/utils/generateUUID.ts +5 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AppsInTossModule } from './AppsInTossModule';
|
|
2
|
+
import { PermissionAccess, PermissionName, PermissionStatus } from '../../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @category AppsInTossModules
|
|
6
|
+
* @name openPermissionDialog
|
|
7
|
+
* @description 권한 요청 다이얼로그를 표시하는 함수예요. 사용자는 이 다이얼로그에서 특정 권한을 허용하거나 거부할 수 있어요.
|
|
8
|
+
* @param permission.name {PermissionName} 요청할 권한의 이름이에요. 예를 들어 `clipboard`는 클립보드 접근 권한을, `camera`는 카메라 접근 권한을 나타내요.
|
|
9
|
+
* @param permission.access {PermissionAccess} 요청할 권한의 접근 유형이에요. 예를 들어 `read`는 읽기 권한, `write`는 쓰기 권한을 의미해요.
|
|
10
|
+
* @returns {Promise<'allowed' | 'denied'>} 권한의 현재 상태를 반환해요. 반환값은 다음 중 하나예요:
|
|
11
|
+
* - `allowed`: 권한이 허용된 상태예요.
|
|
12
|
+
* - `denied`: 권한이 거부된 상태예요.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ### 클립보드 읽기 권한 다이얼로그 열기
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* import React, { useState } from 'react';
|
|
19
|
+
* import { View, Text, Button } from 'react-native';
|
|
20
|
+
* import { openPermissionDialog, type PermissionStatus } from '@apps-in-toss/framework';
|
|
21
|
+
*
|
|
22
|
+
* function PermissionRequest() {
|
|
23
|
+
* const [permission, setPermission] = useState<PermissionStatus | null>(null);
|
|
24
|
+
*
|
|
25
|
+
* const handleRequestPermission = async () => {
|
|
26
|
+
* try {
|
|
27
|
+
* // 클립보드 읽기 권한을 요청하는 다이얼로그를 표시해요.
|
|
28
|
+
* const status = await openPermissionDialog({
|
|
29
|
+
* name: 'clipboard',
|
|
30
|
+
* access: 'read',
|
|
31
|
+
* });
|
|
32
|
+
* setPermission(status); // 권한 상태를 업데이트해요.
|
|
33
|
+
* } catch (error) {
|
|
34
|
+
* console.error('권한 요청 중 오류가 발생했어요:', error);
|
|
35
|
+
* }
|
|
36
|
+
* };
|
|
37
|
+
*
|
|
38
|
+
* return (
|
|
39
|
+
* <View>
|
|
40
|
+
* <Text>
|
|
41
|
+
* 클립보드 읽기 권한 상태: {permission ? permission : '아직 요청하지 않음'}
|
|
42
|
+
* </Text>
|
|
43
|
+
* <Button title="권한 요청하기" onPress={handleRequestPermission} />
|
|
44
|
+
* </View>
|
|
45
|
+
* );
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function openPermissionDialog(permission: {
|
|
50
|
+
name: PermissionName;
|
|
51
|
+
access: PermissionAccess;
|
|
52
|
+
}): Promise<Exclude<PermissionStatus, 'notDetermined'>> {
|
|
53
|
+
return AppsInTossModule.openPermissionDialog(permission);
|
|
54
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getPermission } from './getPermission';
|
|
2
|
+
import { openPermissionDialog } from './openPermissionDialog';
|
|
3
|
+
import { PermissionAccess, PermissionName, PermissionStatus } from '../../types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @category PermissionManagement
|
|
7
|
+
* @name requestPermission
|
|
8
|
+
* @description 특정 권한을 요청하는 함수예요. 이미 허용되었거나 거부된 권한 상태를 확인한 뒤, 필요할 때 권한 요청 다이얼로그를 표시해요.
|
|
9
|
+
* @param permission.name {PermissionName} 요청할 권한의 이름이에요. 예를 들어 `clipboard`는 클립보드 접근 권한을, `camera`는 카메라 접근 권한을 나타내요.
|
|
10
|
+
* @param permission.access {PermissionAccess} 요청할 권한의 접근 유형이에요. 예를 들어 `read`는 읽기 권한, `write`는 쓰기 권한을 의미해요.
|
|
11
|
+
* @returns {Promise<'allowed' | 'denied'>} 사용자가 선택한 최종 권한 상태를 반환해요.
|
|
12
|
+
* 반환값은 다음 중 하나예요:
|
|
13
|
+
* - `allowed`: 권한이 허용된 경우
|
|
14
|
+
* - `denied`: 권한이 거부된 경우
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ### 클립보드 읽기 권한 요청하기
|
|
18
|
+
*
|
|
19
|
+
* ```tsx
|
|
20
|
+
* import React, { useState } from 'react';
|
|
21
|
+
* import { View, Text, Button } from 'react-native';
|
|
22
|
+
* import { requestPermission, type PermissionStatus } from '@apps-in-toss/framework';
|
|
23
|
+
*
|
|
24
|
+
* function PermissionRequest() {
|
|
25
|
+
* const [permissionStatus, setPermissionStatus] = useState<PermissionStatus | null>(null);
|
|
26
|
+
*
|
|
27
|
+
* const handleRequestPermission = async () => {
|
|
28
|
+
* try {
|
|
29
|
+
* // 클립보드 읽기 권한을 요청해요.
|
|
30
|
+
* const permissionStatus = await requestPermission({
|
|
31
|
+
* name: 'clipboard', // 권한 이름: 클립보드
|
|
32
|
+
* access: 'read', // 접근 유형: 읽기
|
|
33
|
+
* });
|
|
34
|
+
* setPermissionStatus(permissionStatus); // 최종 권한 상태를 저장해요.
|
|
35
|
+
* } catch (error) {
|
|
36
|
+
* console.error('권한 요청 중 오류가 발생했어요:', error);
|
|
37
|
+
* }
|
|
38
|
+
* };
|
|
39
|
+
*
|
|
40
|
+
* return (
|
|
41
|
+
* <View>
|
|
42
|
+
* <Text>
|
|
43
|
+
* 클립보드 읽기 권한 상태: {permissionStatus ? permissionStatus : '아직 요청하지 않음'}
|
|
44
|
+
* </Text>
|
|
45
|
+
* <Button title="권한 요청하기" onPress={handleRequestPermission} />
|
|
46
|
+
* </View>
|
|
47
|
+
* );
|
|
48
|
+
* }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export async function requestPermission(permission: {
|
|
52
|
+
name: PermissionName;
|
|
53
|
+
access: PermissionAccess;
|
|
54
|
+
}): Promise<Exclude<PermissionStatus, 'notDetermined'>> {
|
|
55
|
+
const permissionStatus = await getPermission(permission);
|
|
56
|
+
switch (permissionStatus) {
|
|
57
|
+
case 'allowed':
|
|
58
|
+
case 'denied':
|
|
59
|
+
return permissionStatus;
|
|
60
|
+
default:
|
|
61
|
+
return openPermissionDialog(permission);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AppsInTossModule } from './AppsInTossModule';
|
|
2
|
+
import { isMinVersionSupported } from './isMinVersionSupported';
|
|
3
|
+
|
|
4
|
+
export interface SaveBase64DataParams {
|
|
5
|
+
data: string;
|
|
6
|
+
fileName: string;
|
|
7
|
+
mimeType: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
* @category 데이터
|
|
13
|
+
* @name saveBase64Data
|
|
14
|
+
* @description 문자열로 인코딩된 Base64 데이터를 지정한 파일 이름과 MIME 타입으로 사용자 기기에 저장해요. 이미지, 텍스트, PDF 등 다양한 형식의 데이터를 저장할 수 있어요.
|
|
15
|
+
* @param {SaveBase64DataParams} params - 저장할 데이터와 파일 정보를 담은 객체예요.
|
|
16
|
+
* @param {string} params.data - Base64 형식으로 인코딩된 데이터 문자열이에요.
|
|
17
|
+
* @param {string} params.fileName - 저장할 파일 이름이에요. 확장자도 같이 붙여줘야해요. 예를 들어, 'example.png'로 저장할 수 있어요.
|
|
18
|
+
* @param {string} params.mimeType - 저장할 파일의 MIME 타입이에요. 예를 들어 'image/png' 로 지정하면 이미지, 'application/pdf'는 PDF 파일이에요. 자세한 내용은 [MIME 문서](https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/MIME_types)를 참고해주세요.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ### Base64 이미지 데이터를 사용자 기기에 저장하기
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* import { Button } from 'react-native';
|
|
25
|
+
* import { saveBase64Data } from '@apps-in-toss/framework';
|
|
26
|
+
*
|
|
27
|
+
* // '저장' 버튼을 누르면 이미지가 사용자 기기에 저장돼요.
|
|
28
|
+
* function SaveButton() {
|
|
29
|
+
* const handleSave = async () => {
|
|
30
|
+
* try {
|
|
31
|
+
* await saveBase64Data({
|
|
32
|
+
* data: 'iVBORw0KGgo...',
|
|
33
|
+
* fileName: 'some-photo.png',
|
|
34
|
+
* mimeType: 'image/png',
|
|
35
|
+
* });
|
|
36
|
+
* } catch (error) {
|
|
37
|
+
* console.error('데이터 저장에 실패했어요:', error);
|
|
38
|
+
* }
|
|
39
|
+
* };
|
|
40
|
+
*
|
|
41
|
+
* return <Button title="저장" onPress={handleSave} />;
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export async function saveBase64Data(params: SaveBase64DataParams) {
|
|
46
|
+
const isSupported = isMinVersionSupported({
|
|
47
|
+
android: '5.218.0',
|
|
48
|
+
ios: '5.216.0',
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
if (!isSupported) {
|
|
52
|
+
console.warn('saveBase64Data is not supported in this app version');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
await AppsInTossModule.saveBase64Data(params);
|
|
57
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AppsInTossModule } from './AppsInTossModule';
|
|
2
|
+
import { requestPermission } from './requestPermission';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
* @category 클립보드
|
|
7
|
+
* @name setClipboardText
|
|
8
|
+
* @description 텍스트를 클립보드에 복사해서 사용자가 다른 곳에 붙여 넣기 할 수 있어요.
|
|
9
|
+
* @param {Promise<void>} text - 클립보드에 복사할 텍스트예요. 문자열 형식으로 입력해요.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ### 텍스트를 클립보드에 복사하기
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { Button } from 'react-native';
|
|
16
|
+
* import { setClipboardText } from '@apps-in-toss/framework';
|
|
17
|
+
*
|
|
18
|
+
* // '복사' 버튼을 누르면 "복사할 텍스트"가 클립보드에 복사돼요.
|
|
19
|
+
* function CopyButton() {
|
|
20
|
+
* const handleCopy = async () => {
|
|
21
|
+
* try {
|
|
22
|
+
* await setClipboardText('복사할 텍스트');
|
|
23
|
+
* console.log('텍스트가 복사됐어요!');
|
|
24
|
+
* } catch (error) {
|
|
25
|
+
* console.error('텍스트 복사에 실패했어요:', error);
|
|
26
|
+
* }
|
|
27
|
+
* };
|
|
28
|
+
*
|
|
29
|
+
* return <Button title="복사" onPress={handleCopy} />;
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export async function setClipboardText(text: string): Promise<void> {
|
|
34
|
+
const permissionStatus = await requestPermission({ name: 'clipboard', access: 'write' });
|
|
35
|
+
if (permissionStatus === 'denied') {
|
|
36
|
+
throw new Error('클립보드 쓰기 권한이 거부되었어요.');
|
|
37
|
+
}
|
|
38
|
+
return AppsInTossModule.setClipboardText({ text });
|
|
39
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { AppsInTossModule } from './AppsInTossModule';
|
|
2
|
+
import { isMinVersionSupported } from './isMinVersionSupported';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
* @category 화면 제어
|
|
7
|
+
* @kind function
|
|
8
|
+
* @name setDeviceOrientation
|
|
9
|
+
* @description
|
|
10
|
+
* `setDeviceOrientation` 함수는 기기의 화면 방향을 설정하는 기능을 제공해요.
|
|
11
|
+
* 이 기능은 특정 화면에서 가로 모드나 세로 모드를 강제로 지정해야 할 때 유용해요.
|
|
12
|
+
*
|
|
13
|
+
* `type` 옵션을 통해 원하는 화면 방향을 지정할 수 있어요. 특히, 이 함수는 앱 전체에 영향을 미치므로
|
|
14
|
+
* 특정 화면에서만 사용하려면 화면을 벗어날 때 이전 상태로 복구하는 추가 작업이 필요해요.
|
|
15
|
+
*
|
|
16
|
+
* 예를 들어, 동영상 감상 화면에서는 가로 모드를 강제하고, 화면을 떠날 때 설정을 복구해서
|
|
17
|
+
* 다른 화면들의 방향 설정에 영향을 주지 않도록 할 수 있어요.
|
|
18
|
+
*
|
|
19
|
+
* @param {object} options 화면 방향 설정 값이에요.
|
|
20
|
+
* @param {string} options.type 화면 방향을 지정하는 옵션이에요.
|
|
21
|
+
* 'portrait' | 'landscape' 중 하나를 선택할 수 있어요.
|
|
22
|
+
*
|
|
23
|
+
* @returns {Promise<void>} 화면 방향 설정이 완료되면 해결되는 Promise를 반환해요.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ### 화면 방향 설정하기
|
|
27
|
+
*
|
|
28
|
+
* ```tsx
|
|
29
|
+
* import { Button } from 'react-native';
|
|
30
|
+
* import { setDeviceOrientation } from '@apps-in-toss/framework';
|
|
31
|
+
*
|
|
32
|
+
* function SetDeviceOrientation() {
|
|
33
|
+
* return (
|
|
34
|
+
* <Button
|
|
35
|
+
* title="가로 모드로 변경"
|
|
36
|
+
* onPress={() => {
|
|
37
|
+
* setDeviceOrientation({ type: 'landscape' });
|
|
38
|
+
* }}
|
|
39
|
+
* />
|
|
40
|
+
* );
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* ### 화면 방향 복구하기
|
|
45
|
+
* 특정 화면을 벗어날 때 이전 상태로 복구하려면 다음과 같이 `useEffect`를 사용하세요.
|
|
46
|
+
*
|
|
47
|
+
* ```tsx
|
|
48
|
+
* import { useEffect } from 'react';
|
|
49
|
+
* import { setDeviceOrientation } from '@apps-in-toss/framework';
|
|
50
|
+
*
|
|
51
|
+
* function VideoScreen() {
|
|
52
|
+
* useEffect(() => {
|
|
53
|
+
* setDeviceOrientation({ type: 'landscape' });
|
|
54
|
+
*
|
|
55
|
+
* return () => {
|
|
56
|
+
* setDeviceOrientation({ type: 'portrait' }); // 설정을 이전 상태로 복구해요.
|
|
57
|
+
* };
|
|
58
|
+
* }, []);
|
|
59
|
+
*
|
|
60
|
+
* return <Text>동영상을 감상하는 화면</Text>;
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export async function setDeviceOrientation(options: { type: 'portrait' | 'landscape' }): Promise<void> {
|
|
65
|
+
const isSupported = isMinVersionSupported({
|
|
66
|
+
android: '5.215.0',
|
|
67
|
+
ios: '5.215.0',
|
|
68
|
+
});
|
|
69
|
+
if (!isSupported) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return AppsInTossModule.setDeviceOrientation(options);
|
|
74
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { AppsInTossModule } from './AppsInTossModule';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @public
|
|
5
|
+
* @category 저장소
|
|
6
|
+
* @name getItem
|
|
7
|
+
* @description 모바일 앱의 로컬 저장소에서 문자열 데이터를 가져와요. 주로 앱이 종료되었다가 다시 시작해도 데이터가 유지되어야 하는 경우에 사용해요.
|
|
8
|
+
* @param {string} key - 가져올 아이템의 키를 입력해요.
|
|
9
|
+
* @returns {Promise<string | null>} 지정한 키에 저장된 문자열 값을 반환해요. 값이 없으면 `null`을 반환해요.
|
|
10
|
+
* @example
|
|
11
|
+
*
|
|
12
|
+
* ### `my-key`에 저장된 아이템 가져오기
|
|
13
|
+
* ```ts
|
|
14
|
+
* const value = await Storage.getItem('my-key');
|
|
15
|
+
* console.log(value); // 'value'
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
function getItem(key: string): Promise<string | null> {
|
|
19
|
+
return AppsInTossModule.getStorageItem({ key });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @public
|
|
24
|
+
* @category 저장소
|
|
25
|
+
* @name setItem
|
|
26
|
+
* @description 모바일 앱의 로컬 저장소에 문자열 데이터를 저장해요. 주로 앱이 종료되었다가 다시 시작해도 데이터가 유지되어야 하는 경우에 사용해요.
|
|
27
|
+
* @param {string} key - 저장할 아이템의 키를 입력해요.
|
|
28
|
+
* @param {string} value - 저장할 아이템의 값을 입력해요.
|
|
29
|
+
* @returns {Promise<void>} 아이템을 성공적으로 저장하면 아무 값도 반환하지 않아요.
|
|
30
|
+
* @example
|
|
31
|
+
*
|
|
32
|
+
* ### `my-key`에 아이템 저장하기
|
|
33
|
+
* ```ts
|
|
34
|
+
* import { Storage } from '@apps-in-toss/framework';
|
|
35
|
+
*
|
|
36
|
+
* await Storage.setItem('my-key', 'value');
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
function setItem(key: string, value: string): Promise<void> {
|
|
40
|
+
return AppsInTossModule.setStorageItem({
|
|
41
|
+
key,
|
|
42
|
+
value,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @public
|
|
48
|
+
* @category 저장소
|
|
49
|
+
* @name removeItem
|
|
50
|
+
* @description 모바일 앱의 로컬 저장소에서 특정 키에 해당하는 아이템을 삭제해요.
|
|
51
|
+
* @param {string} key - 삭제할 아이템의 키를 입력해요.
|
|
52
|
+
* @returns {Promise<void>} 아이템을 삭제하면 아무 값도 반환하지 않아요.
|
|
53
|
+
* @example
|
|
54
|
+
*
|
|
55
|
+
* ### `my-key`에 저장된 아이템 삭제하기
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { Storage } from '@apps-in-toss/framework';
|
|
58
|
+
*
|
|
59
|
+
* await Storage.removeItem('my-key');
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
function removeItem(key: string): Promise<void> {
|
|
63
|
+
return AppsInTossModule.removeStorageItem({ key });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @public
|
|
68
|
+
* @category 저장소
|
|
69
|
+
* @name clearItems
|
|
70
|
+
* @description 모바일 앱의 로컬 저장소의 모든 아이템을 삭제해요.
|
|
71
|
+
* @returns {Promise<void>} 아이템을 삭제하면 아무 값도 반환하지 않고 저장소가 초기화돼요.
|
|
72
|
+
* @example
|
|
73
|
+
*
|
|
74
|
+
* ### 저장소 초기화하기
|
|
75
|
+
* ```ts
|
|
76
|
+
* import { Storage } from '@apps-in-toss/framework';
|
|
77
|
+
*
|
|
78
|
+
* await Storage.clearItems();
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function clearItems(): Promise<void> {
|
|
82
|
+
return AppsInTossModule.clearStorage({});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @public
|
|
87
|
+
* @category 저장소
|
|
88
|
+
* @name Storage
|
|
89
|
+
* @description 네이티브의 저장소를 사용해요.
|
|
90
|
+
* @property {typeof getItem} [getItem] 모바일 앱의 로컬 저장소에서 아이템을 가져오는 함수예요. 자세한 내용은 [getItem](/react-native/reference/native-modules/저장소/getItem.html)을 참고하세요.
|
|
91
|
+
* @property {typeof setItem} [setItem] 모바일 앱의 로컬 저장소에 아이템을 저장하는 함수예요. 자세한 내용은 [setItem](/react-native/reference/native-modules/저장소/setItem.html)을 참고하셰요.
|
|
92
|
+
* @property {typeof removeItem} [removeItem] 모바일 앱의 로컬 저장소에서 아이템을 삭제하는 함수예요. 자세한 내용은 [removeItem](/react-native/reference/native-modules/저장소/removeItem.html)을 참고하세요.
|
|
93
|
+
* @property {typeof clearItems} [clearItems] 모바일 앱의 로컬 저장소를 초기화하는 함수예요. 자세한 내용은 [clearItems](/react-native/reference/native-modules/저장소/clearItems.html)을 참고하세요.
|
|
94
|
+
*/
|
|
95
|
+
export const Storage = {
|
|
96
|
+
getItem,
|
|
97
|
+
setItem,
|
|
98
|
+
removeItem,
|
|
99
|
+
clearItems,
|
|
100
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { AppsInTossModule } from './AppsInTossModule';
|
|
2
|
+
import { isMinVersionSupported } from './isMinVersionSupported';
|
|
3
|
+
import { GAME_CENTER_MIN_VERSION } from '../constants';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
* @category 게임센터
|
|
8
|
+
* @name SubmitGameCenterLeaderBoardScoreResponse
|
|
9
|
+
* @description
|
|
10
|
+
* 토스게임센터 리더보드에 점수를 제출한 결과 정보를 담아서 반환해요. 반환된 정보를 사용해서 점수 제출 결과에 따라 적절한 에러 처리를 할 수 있어요.
|
|
11
|
+
* @property {'SUCCESS' | 'LEADERBOARD_NOT_FOUND' | 'PROFILE_NOT_FOUND' | 'UNPARSABLE_SCORE'} statusCode
|
|
12
|
+
* 점수 제출 결과를 나타내는 상태 코드예요.
|
|
13
|
+
* - `'SUCCESS'`: 점수 제출이 성공했어요.
|
|
14
|
+
* - `'LEADERBOARD_NOT_FOUND'`: `gameId`에 해당하는 리더보드를 찾을 수 없어요.
|
|
15
|
+
* - `'PROFILE_NOT_FOUND'`: 사용자의 프로필이 없어요.
|
|
16
|
+
* - `'UNPARSABLE_SCORE'`: 점수를 해석할 수 없어요. 점수는 실수(float) 형태의 문자열로 전달해야 해요.
|
|
17
|
+
*/
|
|
18
|
+
export interface SubmitGameCenterLeaderBoardScoreResponse {
|
|
19
|
+
statusCode: 'SUCCESS' | 'LEADERBOARD_NOT_FOUND' | 'PROFILE_NOT_FOUND' | 'UNPARSABLE_SCORE';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @public
|
|
24
|
+
* @category 게임센터
|
|
25
|
+
* @name submitGameCenterLeaderBoardScore
|
|
26
|
+
* @description
|
|
27
|
+
* 사용자의 게임 점수를 토스게임센터 리더보드에 제출해요. 이 기능으로 사용자의 점수를 공식 리더보드에 기록하고 다른 사용자와 비교할 수 있어요.
|
|
28
|
+
* @param {string} params.score
|
|
29
|
+
* 제출할 게임 점수예요. 실수 형태의 숫자를 문자열로 전달해야 해요. 예를들어 `"123.45"` 또는 `"9999"` 예요.
|
|
30
|
+
* @returns {Promise<SubmitGameCenterLeaderBoardScoreResponse | undefined>}
|
|
31
|
+
* 점수 제출 결과를 반환해요. 앱 버전이 최소 지원 버전보다 낮으면 아무 동작도 하지 않고 `undefined`를 반환해요.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ### 게임 점수를 토스게임센터 리더보드에 제출하기
|
|
35
|
+
* ```tsx
|
|
36
|
+
* import { Button } from 'react-native';
|
|
37
|
+
* import { submitGameCenterLeaderBoardScore } from '@apps-in-toss/framework';
|
|
38
|
+
*
|
|
39
|
+
* function GameCenterLeaderBoardScoreSubmitButton() {
|
|
40
|
+
* async function handlePress() {
|
|
41
|
+
* try {
|
|
42
|
+
* const result = await submitGameCenterLeaderBoardScore({ score: '123.45' });
|
|
43
|
+
*
|
|
44
|
+
* if (!result) {
|
|
45
|
+
* console.warn('지원하지 않는 앱 버전이에요.');
|
|
46
|
+
* return;
|
|
47
|
+
* }
|
|
48
|
+
*
|
|
49
|
+
* if (result.statusCode === 'SUCCESS') {
|
|
50
|
+
* console.log('점수 제출 성공!');
|
|
51
|
+
* } else {
|
|
52
|
+
* console.error('점수 제출 실패:', result.statusCode);
|
|
53
|
+
* }
|
|
54
|
+
* } catch (error) {
|
|
55
|
+
* console.error('점수 제출 중 오류가 발생했어요.', error);
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
*
|
|
59
|
+
* return (
|
|
60
|
+
* <Button onPress={handlePress}>점수 제출하기</Button>
|
|
61
|
+
* );
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
export async function submitGameCenterLeaderBoardScore(params: { score: string }) {
|
|
67
|
+
const isSupported = isMinVersionSupported(GAME_CENTER_MIN_VERSION);
|
|
68
|
+
|
|
69
|
+
if (!isSupported) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return AppsInTossModule.submitGameCenterLeaderBoardScore(params);
|
|
74
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { NativeModules } from 'react-native';
|
|
2
|
+
import { getOperationalEnvironment } from './getOperationalEnvironment';
|
|
3
|
+
import { isMinVersionSupported } from './isMinVersionSupported';
|
|
4
|
+
|
|
5
|
+
const TossCoreModule: {
|
|
6
|
+
eventLog: (params: {
|
|
7
|
+
params: {
|
|
8
|
+
log_name: string;
|
|
9
|
+
log_type: string;
|
|
10
|
+
params: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
} = NativeModules.TossCoreModule;
|
|
14
|
+
|
|
15
|
+
export function tossCoreEventLog(params: { log_name: string; log_type: string; params: Record<string, unknown> }) {
|
|
16
|
+
const supported = isMinVersionSupported({ ios: '5.210.0', android: '5.210.0' });
|
|
17
|
+
const isSandbox = getOperationalEnvironment() === 'sandbox';
|
|
18
|
+
if (!supported || isSandbox) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
TossCoreModule.eventLog({
|
|
23
|
+
params: {
|
|
24
|
+
log_name: params.log_name,
|
|
25
|
+
log_type: params.log_type,
|
|
26
|
+
params: params.params,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NativeModules } from 'react-native';
|
|
2
|
+
import type { HapticFeedbackOptions } from './generateHapticFeedback/types';
|
|
3
|
+
import type { NetworkStatus } from './getNetworkStatus/types';
|
|
4
|
+
|
|
5
|
+
interface BedrockModule {
|
|
6
|
+
closeView: () => void;
|
|
7
|
+
generateHapticFeedback: (options: HapticFeedbackOptions) => Promise<void>;
|
|
8
|
+
share: (message: { message: string }) => void;
|
|
9
|
+
setSecureScreen: (options: { enabled: boolean }) => Promise<{ enabled: boolean }>;
|
|
10
|
+
setScreenAwakeMode: (options: { enabled: boolean }) => Promise<{ enabled: boolean }>;
|
|
11
|
+
getNetworkStatus: () => Promise<NetworkStatus>;
|
|
12
|
+
setIosSwipeGestureEnabled: ({ isEnabled }: { isEnabled: boolean }) => Promise<void>;
|
|
13
|
+
deviceId: string;
|
|
14
|
+
DeviceInfo: {
|
|
15
|
+
locale: string;
|
|
16
|
+
};
|
|
17
|
+
schemeUri: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const BedrockModule: BedrockModule = NativeModules.BedrockModule;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BedrockModule } from './BedrockModule';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @public
|
|
5
|
+
* @category 화면 제어
|
|
6
|
+
* @kind function
|
|
7
|
+
* @name closeView
|
|
8
|
+
* @description 현재 화면을 닫는 함수에요. 예를 들어, "닫기" 버튼을 눌러서 서비스를 종료할 때 사용할 수 있어요.
|
|
9
|
+
* @returns {Promise<void>}
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ### 닫기 버튼을 눌러 화면 닫기
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { Button } from 'react-native';
|
|
16
|
+
* import { closeView } from '@apps-in-toss/native-modules';
|
|
17
|
+
*
|
|
18
|
+
* function CloseButton() {
|
|
19
|
+
* return <Button title="닫기" onPress={closeView} />;
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export async function closeView() {
|
|
24
|
+
return BedrockModule.closeView();
|
|
25
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HapticFeedbackOptions, HapticFeedbackType } from './types';
|
|
2
|
+
import { BedrockModule } from '../BedrockModule';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
* @category 인터렉션
|
|
7
|
+
* @name generateHapticFeedback
|
|
8
|
+
* @description 디바이스에 햅틱 진동을 일으키는 함수예요. 예를 들어, 버튼 터치나 화면전환에 드라마틱한 효과를 주고 싶을 때 사용할 수 있어요. [HapticFeedbackOptions](/react-native/reference/native-modules/인터렉션/HapticFeedbackOptions.html)에서 진동타입을 확인해 보세요.
|
|
9
|
+
* @returns {void}
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ### 버튼을 눌러 햅틱 일으키기
|
|
13
|
+
*
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { Button } from 'react-native';
|
|
16
|
+
* import { generateHapticFeedback } from '@apps-in-toss/native-modules';
|
|
17
|
+
*
|
|
18
|
+
* function GenerateHapticFeedback() {
|
|
19
|
+
* return <Button title="햅틱" onPress={() => { generateHapticFeedback( { type: "tickWeak"}) }} />;
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function generateHapticFeedback(options: HapticFeedbackOptions) {
|
|
24
|
+
return BedrockModule.generateHapticFeedback(options);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type { HapticFeedbackType };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type HapticFeedbackType =
|
|
2
|
+
| 'tickWeak'
|
|
3
|
+
| 'tap'
|
|
4
|
+
| 'tickMedium'
|
|
5
|
+
| 'softMedium'
|
|
6
|
+
| 'basicWeak'
|
|
7
|
+
| 'basicMedium'
|
|
8
|
+
| 'success'
|
|
9
|
+
| 'error'
|
|
10
|
+
| 'wiggle'
|
|
11
|
+
| 'confetti';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
* @category 인터렉션
|
|
16
|
+
* @name HapticFeedbackOptions
|
|
17
|
+
* @description
|
|
18
|
+
* generateHapticFeedback 함수에 전달할 햅틱진동의 타입을 나타내요. 진동타입의 종류는 다음과 같아요.
|
|
19
|
+
* ```typescript
|
|
20
|
+
* type HapticFeedbackType =
|
|
21
|
+
* | "tickWeak"
|
|
22
|
+
* | "tap"
|
|
23
|
+
* | "tickMedium"
|
|
24
|
+
* | "softMedium"
|
|
25
|
+
* | "basicWeak"
|
|
26
|
+
* | "basicMedium"
|
|
27
|
+
* | "success"
|
|
28
|
+
* | "error"
|
|
29
|
+
* | "wiggle"
|
|
30
|
+
* | "confetti";
|
|
31
|
+
* ```
|
|
32
|
+
* @typedef { type: HapticFeedbackType } HapticFeedbackOptions
|
|
33
|
+
* @typedef { "tickWeak" | "tap" | "tickMedium" | "softMedium" | "basicWeak" | "basicMedium" | "success" | "error" | "wiggle" | "confetti" } HapticFeedbackType
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
export interface HapticFeedbackOptions {
|
|
37
|
+
type: HapticFeedbackType;
|
|
38
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Platform } from 'react-native';
|
|
2
|
+
import { BedrockModule } from './BedrockModule';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
* @category 언어
|
|
7
|
+
* @kind function
|
|
8
|
+
* @name getLocale
|
|
9
|
+
* @description
|
|
10
|
+
* 사용자의 로케일(locale) 정보를 반환해요. 네이티브 모듈에서 로케일 정보를 가져올 수 없을 때는 기본값으로 'ko-KR'을 반환합니다. 앱의 현지화 및 언어 설정과 관련된 기능을 구현할 때 사용하세요.
|
|
11
|
+
*
|
|
12
|
+
* @returns {string} 사용자의 로케일 정보를 반환해요.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ### 현재 사용자의 로케일 정보 가져오기
|
|
16
|
+
*
|
|
17
|
+
* ```tsx
|
|
18
|
+
* import { getLocale } from '@apps-in-toss/native-modules';
|
|
19
|
+
* import { Text } from 'react-native';
|
|
20
|
+
*
|
|
21
|
+
* function MyPage() {
|
|
22
|
+
* const locale = getLocale();
|
|
23
|
+
*
|
|
24
|
+
* return (
|
|
25
|
+
* <Text>사용자의 로케일 정보: {locale}</Text>
|
|
26
|
+
* )
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function getLocale() {
|
|
32
|
+
const locale = BedrockModule?.DeviceInfo?.locale ?? 'ko-KR';
|
|
33
|
+
|
|
34
|
+
if (Platform.OS === 'android') {
|
|
35
|
+
return replaceUnderbarToHypen(locale);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return locale;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* android 에서 언더바(`_`) 로 구분되고 있어서, 이를 하이픈(`-`)으로 변경합니다.
|
|
43
|
+
*/
|
|
44
|
+
function replaceUnderbarToHypen(locale: string) {
|
|
45
|
+
return locale.replace(/_/g, '-');
|
|
46
|
+
}
|