@apps-in-toss/native-modules 1.0.2 → 1.1.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.
Files changed (42) hide show
  1. package/dist/VisibilityChangedByTransparentServiceWebEvent-D6XJvPVh.d.cts +20 -0
  2. package/dist/VisibilityChangedByTransparentServiceWebEvent-D6XJvPVh.d.ts +20 -0
  3. package/dist/bridges-meta.json +24 -12
  4. package/dist/chunk-YS54L7RG.js +209 -0
  5. package/dist/index.cjs +209 -150
  6. package/dist/index.d.cts +662 -592
  7. package/dist/index.d.ts +662 -592
  8. package/dist/index.js +186 -128
  9. package/dist/private.cjs +236 -0
  10. package/dist/private.d.cts +17 -0
  11. package/dist/private.d.ts +17 -0
  12. package/dist/private.js +11 -0
  13. package/package.json +3 -2
  14. package/src/AppsInTossModule/native-event-emitter/StartUpdateLocationPermissionError.ts +1 -0
  15. package/src/AppsInTossModule/native-event-emitter/appsInTossEvent.ts +2 -0
  16. package/src/AppsInTossModule/native-event-emitter/event-plugins/HomeIconButtonClickHandleEvent.ts +10 -0
  17. package/src/AppsInTossModule/native-event-emitter/event-plugins/UpdateLocationEvent.ts +3 -3
  18. package/src/AppsInTossModule/native-event-emitter/index.ts +2 -0
  19. package/src/AppsInTossModule/native-event-emitter/internal/appBridge.ts +7 -1
  20. package/src/AppsInTossModule/native-event-emitter/startUpdateLocation.ts +64 -44
  21. package/src/AppsInTossModule/native-modules/AppsInTossModule.ts +22 -27
  22. package/src/AppsInTossModule/native-modules/ads/googleAdMobV2.ts +3 -3
  23. package/src/AppsInTossModule/native-modules/ads/types.ts +1 -1
  24. package/src/AppsInTossModule/native-modules/getPermission.ts +1 -1
  25. package/src/AppsInTossModule/native-modules/index.ts +9 -6
  26. package/src/AppsInTossModule/native-modules/permissions/createPermissionFunction.ts +25 -0
  27. package/src/AppsInTossModule/native-modules/permissions/fetchAlbumPhotos/fetchAlbumPhotos.ts +109 -0
  28. package/src/AppsInTossModule/native-modules/{fetchContacts.ts → permissions/fetchContacts/fetchContacts.ts} +51 -40
  29. package/src/AppsInTossModule/native-modules/permissions/getClipboardText/getClipboardText.ts +87 -0
  30. package/src/AppsInTossModule/native-modules/permissions/getCurrentLocation/getCurrentLocation.ts +88 -0
  31. package/src/AppsInTossModule/native-modules/permissions/openCamera/openCamera.ts +99 -0
  32. package/src/AppsInTossModule/native-modules/{openPermissionDialog.ts → permissions/openPermissionDialog.ts} +3 -3
  33. package/src/AppsInTossModule/native-modules/{requestPermission.ts → permissions/requestPermission.ts} +2 -2
  34. package/src/AppsInTossModule/native-modules/permissions/setClipboardText/setClipboardText.ts +75 -0
  35. package/src/AppsInTossModule/native-modules/saveBase64Data.ts +1 -1
  36. package/src/async-bridges.ts +9 -6
  37. package/src/types.ts +0 -106
  38. package/src/AppsInTossModule/native-modules/fetchAlbumPhotos.ts +0 -88
  39. package/src/AppsInTossModule/native-modules/getClipboardText.ts +0 -47
  40. package/src/AppsInTossModule/native-modules/getCurrentLocation.ts +0 -65
  41. package/src/AppsInTossModule/native-modules/openCamera.ts +0 -81
  42. package/src/AppsInTossModule/native-modules/setClipboardText.ts +0 -39
@@ -1,21 +1,6 @@
1
- import { AppsInTossModule } from './AppsInTossModule';
2
- import { requestPermission } from './requestPermission';
3
-
4
- /**
5
- * 연락처 정보를 나타내는 타입이에요.
6
- */
7
- export interface ContactEntity {
8
- /** 연락처 이름이에요. */
9
- name: string;
10
- /** 연락처 전화번호로, 문자열 형식이에요. */
11
- phoneNumber: string;
12
- }
13
-
14
- export interface ContactResult {
15
- result: ContactEntity[];
16
- nextOffset: number | null;
17
- done: boolean;
18
- }
1
+ import { FetchContactsPermissionError, type FetchContacts } from '@apps-in-toss/types';
2
+ import { AppsInTossModule } from '../../AppsInTossModule';
3
+ import { createPermissionFunction } from '../createPermissionFunction';
19
4
 
20
5
  /**
21
6
  * @public
@@ -27,6 +12,9 @@ export interface ContactResult {
27
12
  * @param options.offset - 가져올 연락처의 시작 지점이에요. 처음 호출할 때는 `0`을 전달해야 해요. 이후에는 이전 호출에서 반환된 `nextOffset` 값을 사용해요.
28
13
  * @param options.query - 추가적인 필터링 옵션이에요.
29
14
  * @param options.query.contains - 이름에 특정 문자열이 포함된 연락처만 가져오고 싶을 때 사용해요. 이 값을 전달하지 않으면 모든 연락처를 가져와요.
15
+ * @property [openPermissionDialog] - 연락처 읽기 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
16
+ * @property [getPermission] - 연락처 읽기 권한의 현재 상태를 반환해요. `allowed`는 사용자가 연락처 읽기 권한을 허용한 상태예요. `denied`는 사용자가 연락처 읽기 권한을 거부한 상태예요. `notDetermined`는 연락처 읽기 권한 요청을 한 번도 하지 않은 상태예요.
17
+ *
30
18
  * @returns {Promise<ContactResult>}
31
19
  * 연락처 목록과 페이지네이션 정보를 포함한 객체를 반환해요.
32
20
  * - `result`: 가져온 연락처 목록이에요.
@@ -47,10 +35,15 @@ export interface ContactResult {
47
35
  * @example
48
36
  * ### 특정 문자열이 포함된 연락처 목록 가져오기
49
37
  *
38
+ * 연락처 목록을 가져오는 예제예요.
39
+ * "권한 확인하기"버튼을 눌러서 현재 연락처 읽기 권한을 확인해요.
40
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`FetchContactsPermissionError`](/react-native/reference/types/권한/FetchContactsPermissionError)를 반환해요.
41
+ * "권한 요청하기"버튼을 눌러서 연락처 읽기 권한을 요청할 수 있어요.
42
+ *
50
43
  * ```tsx
51
- * import React, { useState } from 'react';
52
- * import { View, Text, Button } from 'react-native';
53
- * import { fetchContacts, ContactEntity } from '@apps-in-toss/framework';
44
+ * import { ContactEntity, fetchContacts, FetchContactsPermissionError } from '@apps-in-toss/framework';
45
+ * import { useState } from 'react';
46
+ * import { Alert, Button, Text, View } from 'react-native';
54
47
  *
55
48
  * // 특정 문자열을 포함한 연락처 목록을 가져와 화면에 표시하는 컴포넌트
56
49
  * function ContactsList() {
@@ -82,6 +75,9 @@ export interface ContactResult {
82
75
  * done: response.done,
83
76
  * }));
84
77
  * } catch (error) {
78
+ * if (error instanceof FetchContactsPermissionError) {
79
+ * // 연락처 읽기 권한 없음
80
+ * }
85
81
  * console.error('연락처를 가져오는 데 실패했어요:', error);
86
82
  * }
87
83
  * };
@@ -89,33 +85,48 @@ export interface ContactResult {
89
85
  * return (
90
86
  * <View>
91
87
  * {contacts.result.map((contact, index) => (
92
- * <Text key={index}>{contact.name}: {contact.phoneNumber}</Text>
88
+ * <Text key={index}>
89
+ * {contact.name}: {contact.phoneNumber}
90
+ * </Text>
93
91
  * ))}
94
92
  * <Button
95
93
  * title={contacts.done ? '모든 연락처를 가져왔어요.' : '다음 연락처 가져오기'}
96
94
  * disabled={contacts.done}
97
95
  * onPress={handlePress}
98
96
  * />
97
+ * <Button
98
+ * title="권한 확인하기"
99
+ * onPress={async () => {
100
+ * const permission = await fetchContacts.getPermission();
101
+ * Alert.alert(permission);
102
+ * }}
103
+ * />
104
+ * <Button
105
+ * title="권한 요청하기"
106
+ * onPress={async () => {
107
+ * const permission = await fetchContacts.openPermissionDialog();
108
+ * Alert.alert(permission);
109
+ * }}
110
+ * />
99
111
  * </View>
100
112
  * );
101
113
  * }
102
114
  * ```
103
115
  */
104
- export async function fetchContacts(options: {
105
- size: number;
106
- offset: number;
107
- query?: {
108
- contains?: string;
109
- };
110
- }): Promise<ContactResult> {
111
- const permissionStatus = await requestPermission({ name: 'contacts', access: 'read' });
112
- if (permissionStatus === 'denied') {
113
- throw new Error('연락처 권한이 거부되었어요.');
114
- }
115
- const contacts = await AppsInTossModule.fetchContacts(options);
116
- return {
117
- result: contacts.result,
118
- nextOffset: contacts.nextOffset ?? null,
119
- done: contacts.done,
120
- };
121
- }
116
+
117
+ export const fetchContacts = createPermissionFunction<FetchContacts>({
118
+ handler: async (options) => {
119
+ const contacts = await AppsInTossModule.fetchContacts(options);
120
+
121
+ return {
122
+ result: contacts.result,
123
+ nextOffset: contacts.nextOffset ?? null,
124
+ done: contacts.done,
125
+ };
126
+ },
127
+ permission: {
128
+ name: 'contacts',
129
+ access: 'read',
130
+ },
131
+ error: FetchContactsPermissionError,
132
+ });
@@ -0,0 +1,87 @@
1
+ import { GetClipboardTextPermissionError, type GetClipboardText } from '@apps-in-toss/types';
2
+ import { AppsInTossModule } from '../../AppsInTossModule';
3
+ import { createPermissionFunction } from '../createPermissionFunction';
4
+
5
+ /**
6
+ * @public
7
+ * @category 클립보드
8
+ * @name getClipboardText
9
+ * @description 클립보드에 저장된 텍스트를 가져오는 함수예요. 복사된 텍스트를 읽어서 다른 작업에 활용할 수 있어요.
10
+ * @property [openPermissionDialog] - 클립보드 읽기 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
11
+ * @property [getPermission] - 클립보드 읽기 권한의 현재 상태를 반환해요. `allowed`는 사용자가 클립보드 읽기 권한을 허용한 상태예요. `denied`는 사용자가 클립보드 읽기 권한을 거부한 상태예요. `notDetermined`는 클립보드 읽기 권한 요청을 한 번도 하지 않은 상태예요.
12
+ * @returns {Promise<string>} - 클립보드에 저장된 텍스트를 반환해요. 클립보드에 텍스트가 없으면 빈 문자열을 반환해요.
13
+ *
14
+ * @signature
15
+ * ```typescript
16
+ * function getClipboardText(): Promise<string>;
17
+ * ```
18
+ *
19
+ * @example
20
+ * ### 클립보드의 텍스트 가져오기
21
+ *
22
+ * 클립보드의 텍스트를 가져오는 예제예요.
23
+ * "권한 확인하기"버튼을 눌러서 현재 클립보드 읽기 권한을 확인해요.
24
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`GetClipboardTextPermissionError`](/react-native/reference/types/권한/GetClipboardTextPermissionError)를 반환해요.
25
+ * "권한 요청하기"버튼을 눌러서 클립보드 읽기 권한을 요청할 수 있어요.
26
+ *
27
+ * ```tsx
28
+ * import {
29
+ * getClipboardText,
30
+ * GetClipboardTextPermissionError,
31
+ * SetClipboardTextPermissionError,
32
+ * } from '@apps-in-toss/framework';
33
+ * import { useState } from 'react';
34
+ * import { Alert, Button, Text, View } from 'react-native'; *
35
+
36
+ * // '붙여넣기' 버튼을 누르면 클립보드에 저장된 텍스트를 가져와 화면에 표시해요.
37
+ * function PasteButton() {
38
+ * const [text, setText] = useState(''); *
39
+
40
+ * const handlePress = async () => {
41
+ * try {
42
+ * const clipboardText = await getClipboardText();
43
+ * setText(clipboardText || '클립보드에 텍스트가 없어요.');
44
+ * } catch (error) {
45
+ * if (error instanceof GetClipboardTextPermissionError) {
46
+ * // 클립보드 읽기 권한 없음
47
+ * } *
48
+
49
+ * if (error instanceof SetClipboardTextPermissionError) {
50
+ * // 클립보드 쓰기 권한 없음
51
+ * }
52
+ * }
53
+ * }; *
54
+
55
+ * return (
56
+ * <View>
57
+ * <Text>{text}</Text>
58
+ * <Button title="붙여넣기" onPress={handlePress} />
59
+ * <Button
60
+ * title="권한 확인하기"
61
+ * onPress={async () => {
62
+ * const permission = await getClipboardText.getPermission();
63
+ * Alert.alert(permission);
64
+ * }}
65
+ * />
66
+ * <Button
67
+ * title="권한 요청하기"
68
+ * onPress={async () => {
69
+ * const permission = await getClipboardText.openPermissionDialog();
70
+ * Alert.alert(permission);
71
+ * }}
72
+ * />
73
+ * </View>
74
+ * );
75
+ * }
76
+ * ```
77
+ */
78
+ export const getClipboardText = createPermissionFunction<GetClipboardText>({
79
+ handler: () => {
80
+ return AppsInTossModule.getClipboardText({});
81
+ },
82
+ permission: {
83
+ name: 'clipboard',
84
+ access: 'read',
85
+ },
86
+ error: GetClipboardTextPermissionError,
87
+ });
@@ -0,0 +1,88 @@
1
+ import { GetCurrentLocation, GetCurrentLocationPermissionError } from '@apps-in-toss/types';
2
+ import { AppsInTossModule } from '../../AppsInTossModule';
3
+ import { createPermissionFunction } from '../createPermissionFunction';
4
+
5
+ /**
6
+ * @public
7
+ * @category 위치 정보
8
+ * @name getCurrentLocation
9
+ * @description 디바이스의 현재 위치 정보를 가져오는 함수예요.
10
+ * 위치 기반 서비스를 구현할 때 사용되고, 한 번만 호출되어 현재 위치를 즉시 반환해요.
11
+ * 예를 들어 지도 앱에서 사용자의 현재 위치를 한 번만 가져올 때, 날씨 앱에서 사용자의 위치를 기반으로 기상 정보를 제공할 때, 매장 찾기 기능에서 사용자의 위치를 기준으로 가까운 매장을 검색할 때 사용하면 유용해요.
12
+ *
13
+ * @param {GetCurrentLocationOptions} options 위치 정보를 가져올 때 사용하는 옵션 객체예요.
14
+ * @param {Accuracy} [options.accuracy] 위치 정보의 정확도 수준이에요. 정확도는 `Accuracy` 타입으로 설정돼요.
15
+ * @property [openPermissionDialog] - 위치 정보 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
16
+ * @property [getPermission] - 위치 정보 권한의 현재 상태를 반환해요. `allowed`는 사용자가 위치 정보 권한을 허용한 상태예요. `denied`는 사용자가 위치 정보 권한을 거부한 상태예요. `notDetermined`는 위치 정보 권한 요청을 한 번도 하지 않은 상태예요.
17
+ * @returns {Promise<Location>} 디바이스의 위치 정보가 담긴 객체를 반환해요. 자세한 내용은 [Location](/react-native/reference/native-modules/Types/Location.html)을 참고해주세요.
18
+ *
19
+ * @signature
20
+ * ```typescript
21
+ * function getCurrentLocation(options: {
22
+ * accuracy: Accuracy;
23
+ * }): Promise<Location>;
24
+ * ```
25
+ *
26
+ * @example
27
+ * ### 디바이스의 현재 위치 정보 가져오기
28
+ *
29
+ * "권한 확인하기"버튼을 눌러서 현재 위치정보 권한을 확인해요.
30
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`GetCurrentLocationPermissionError`](/react-native/reference/types/권한/GetCurrentLocationPermissionError)를 반환해요.
31
+ * "권한 요청하기"버튼을 눌러서 위치정보 권한을 요청할 수 있어요.
32
+ *
33
+ * ```tsx
34
+ * import { Accuracy, getCurrentLocation, Location } from '@apps-in-toss/framework';
35
+ * import { useState } from 'react';
36
+ * import { Alert, Button, Text, View } from 'react-native';
37
+ *
38
+ * // 현재 위치 정보를 가져와 화면에 표시하는 컴포넌트
39
+ * function CurrentPosition() {
40
+ * const [position, setPosition] = useState<Location | null>(null);
41
+ *
42
+ * const handlePress = async () => {
43
+ * try {
44
+ * const response = await getCurrentLocation({ accuracy: Accuracy.Balanced });
45
+ * setPosition(response);
46
+ * } catch (error) {
47
+ * console.error('위치 정보를 가져오는 데 실패했어요:', error);
48
+ * }
49
+ * };
50
+ *
51
+ * return (
52
+ * <View>
53
+ * {position ? (
54
+ * <Text>
55
+ * 위치: {position.coords.latitude}, {position.coords.longitude}
56
+ * </Text>
57
+ * ) : (
58
+ * <Text>위치 정보를 아직 가져오지 않았어요</Text>
59
+ * )}
60
+ * <Button title="현재 위치 정보 가져오기" onPress={handlePress} />
61
+ * <Button
62
+ * title="권한 확인하기"
63
+ * onPress={async () => {
64
+ * Alert.alert(await getCurrentLocation.getPermission());
65
+ * }}
66
+ * />
67
+ * <Button
68
+ * title="권한 요청하기"
69
+ * onPress={async () => {
70
+ * Alert.alert(await getCurrentLocation.openPermissionDialog());
71
+ * }}
72
+ * />
73
+ * </View>
74
+ * );
75
+ * }
76
+ *
77
+ * ```
78
+ */
79
+ export const getCurrentLocation = createPermissionFunction<GetCurrentLocation>({
80
+ handler: async (options) => {
81
+ return AppsInTossModule.getCurrentLocation(options);
82
+ },
83
+ permission: {
84
+ name: 'geolocation',
85
+ access: 'access',
86
+ },
87
+ error: GetCurrentLocationPermissionError,
88
+ });
@@ -0,0 +1,99 @@
1
+ import { OpenCameraPermissionError, type OpenCamera } from '@apps-in-toss/types';
2
+ import { AppsInTossModule } from '../../AppsInTossModule';
3
+ import { createPermissionFunction } from '../createPermissionFunction';
4
+
5
+ /**
6
+ * @public
7
+ * @category 카메라
8
+ * @name openCamera
9
+ * @description 카메라를 실행해서 촬영된 이미지를 반환하는 함수예요.
10
+ * @param {OpenCameraOptions} options - 카메라 실행 시 사용되는 옵션 객체예요.
11
+ * @param {boolean} [options.base64=false] - 이미지를 Base64 형식으로 반환할지 여부를 나타내는 불리언 값이에요. 기본값은 `false`예요. `true`로 설정하면 `dataUri` 대신 Base64 인코딩된 문자열을 반환해요.
12
+ * @param {number} [options.maxWidth=1024] - 이미지의 최대 너비를 나타내는 숫자 값이에요. 기본값은 `1024`예요.
13
+ * @property [openPermissionDialog] - 카메라 접근 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
14
+ * @property [getPermission] - 카메라 접근 권한의 현재 상태를 반환해요. `allowed`는 사용자가 카메라 접근 권한을 허용한 상태예요. `denied`는 사용자가 카메라 접근 권한을 거부한 상태예요. `notDetermined`는 카메라 접근 권한 요청을 한 번도 하지 않은 상태예요.
15
+ * @returns {Promise<ImageResponse>}
16
+ * 촬영된 이미지 정보를 포함한 객체를 반환해요. 반환 객체의 구성은 다음과 같아요:
17
+ * - `id`: 이미지의 고유 식별자예요.
18
+ * - `dataUri`: 이미지 데이터를 표현하는 데이터 URI예요.
19
+ *
20
+ * @signature
21
+ * ```typescript
22
+ * function openCamera(options: {
23
+ * base64: boolean;
24
+ * maxWidth: number;
25
+ * }): Promise<ImageResponse>;
26
+ * ```
27
+ *
28
+ * @example
29
+ * ### 카메라 실행 후 촬영된 사진 가져오기
30
+ *
31
+ * 카메라로 사진을 찍고 결과를 가져오는 예제예요.
32
+ * 이 과정에서 현재 카메라 권한 상태를 확인할 수 있고, 권한이 없으면 권한을 요청해요.
33
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`OpenCameraPermissionError`](/react-native/reference/types/권한/OpenCameraPermissionError)를 반환해요.
34
+ *
35
+ * ```tsx
36
+ * import { ImageResponse, openCamera, OpenCameraPermissionError } from '@apps-in-toss/framework';
37
+ * import { useState } from 'react';
38
+ * import { Alert, Button, Image, Text, View } from 'react-native';
39
+ *
40
+ * const base64 = true;
41
+ *
42
+ * // 카메라를 실행하고 촬영된 이미지를 화면에 표시하는 컴포넌트
43
+ * function Camera() {
44
+ * const [image, setImage] = useState<ImageResponse | null>(null);
45
+ *
46
+ * const handlePress = async () => {
47
+ * try {
48
+ * const response = await openCamera({ base64 });
49
+ * setImage(response);
50
+ * } catch (error) {
51
+ * if (error instanceof OpenCameraPermissionError) {
52
+ * console.log('권한 에러');
53
+ * }
54
+ *
55
+ * console.error('사진을 가져오는 데 실패했어요:', error);
56
+ * }
57
+ * };
58
+ *
59
+ * // base64 형식으로 반환된 이미지를 표시하려면 데이터 URL 스키마 Prefix를 붙여야해요.
60
+ * const imageUri = base64 ? 'data:image/jpeg;base64,' + image?.dataUri : image?.dataUri;
61
+ *
62
+ * return (
63
+ * <View>
64
+ * {image ? <Image source={{ uri: imageUri }} style={{ width: 200, height: 200 }} /> : <Text>사진이 없어요</Text>}
65
+ * <Button title="사진 촬영하기" onPress={handlePress} />
66
+ * <Button
67
+ * title="권한 확인하기"
68
+ * onPress={async () => {
69
+ * const permission = await openCamera.getPermission();
70
+ * Alert.alert(permission);
71
+ * }}
72
+ * />
73
+ *
74
+ * <Button
75
+ * title="권한 요청하기"
76
+ * onPress={async () => {
77
+ * const currentPermission = await openCamera.openPermissionDialog();
78
+ * Alert.alert(currentPermission);
79
+ * }}
80
+ * />
81
+ * </View>
82
+ * );
83
+ * }
84
+ * ```
85
+ */
86
+ export const openCamera = createPermissionFunction<OpenCamera>({
87
+ handler: (options) => {
88
+ return AppsInTossModule.openCamera({
89
+ base64: false,
90
+ maxWidth: 1024,
91
+ ...options,
92
+ });
93
+ },
94
+ permission: {
95
+ name: 'camera',
96
+ access: 'access',
97
+ },
98
+ error: OpenCameraPermissionError,
99
+ });
@@ -1,5 +1,5 @@
1
- import { AppsInTossModule } from './AppsInTossModule';
2
- import { PermissionAccess, PermissionName, PermissionStatus } from '../../types';
1
+ import type { PermissionAccess, PermissionDialogFunction, PermissionName } from '@apps-in-toss/types';
2
+ import { AppsInTossModule } from '../AppsInTossModule';
3
3
 
4
4
  /**
5
5
  * @category AppsInTossModules
@@ -49,6 +49,6 @@ import { PermissionAccess, PermissionName, PermissionStatus } from '../../types'
49
49
  export function openPermissionDialog(permission: {
50
50
  name: PermissionName;
51
51
  access: PermissionAccess;
52
- }): Promise<Exclude<PermissionStatus, 'notDetermined'>> {
52
+ }): ReturnType<PermissionDialogFunction> {
53
53
  return AppsInTossModule.openPermissionDialog(permission);
54
54
  }
@@ -1,6 +1,6 @@
1
- import { getPermission } from './getPermission';
1
+ import type { PermissionAccess, PermissionName, PermissionStatus } from '@apps-in-toss/types';
2
2
  import { openPermissionDialog } from './openPermissionDialog';
3
- import { PermissionAccess, PermissionName, PermissionStatus } from '../../types';
3
+ import { getPermission } from '../getPermission';
4
4
 
5
5
  /**
6
6
  * @category PermissionManagement
@@ -0,0 +1,75 @@
1
+ import { SetClipboardTextPermissionError, type SetClipboardText } from '@apps-in-toss/types';
2
+ import { AppsInTossModule } from '../../AppsInTossModule';
3
+ import { createPermissionFunction } from '../createPermissionFunction';
4
+
5
+ /**
6
+ * @public
7
+ * @category 클립보드
8
+ * @name setClipboardText
9
+ * @description 텍스트를 클립보드에 복사해서 사용자가 다른 곳에 붙여 넣기 할 수 있어요.
10
+ * @param {Promise<void>} text - 클립보드에 복사할 텍스트예요. 문자열 형식으로 입력해요.
11
+ * @property [openPermissionDialog] - 클립보드 쓰기 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
12
+ * @property [getPermission] - 클립보드 쓰기 권한의 현재 상태를 반환해요. `allowed`는 사용자가 클립보드 쓰기 권한을 허용한 상태예요. `denied`는 사용자가 클립보드 쓰기 권한을 거부한 상태예요. `notDetermined`는 클립보드 쓰기 권한 요청을 한 번도 하지 않은 상태예요.
13
+ *
14
+ * @signature
15
+ * ```typescript
16
+ * function setClipboardText(text: string): Promise<void>;
17
+ * ```
18
+ *
19
+ * @example
20
+ * ### 텍스트를 클립보드에 복사하기
21
+ *
22
+ * 텍스트를 클립보드에 복사하는 예제예요.
23
+ * "권한 확인하기"버튼을 눌러서 현재 클립보드 쓰기 권한을 확인해요.
24
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`SetClipboardTextPermissionError`](/react-native/reference/types/권한/SetClipboardTextPermissionError)를 반환해요.
25
+ * "권한 요청하기"버튼을 눌러서 클립보드 쓰기 권한을 요청할 수 있어요.
26
+ *
27
+ * ```tsx
28
+ * import { setClipboardText, SetClipboardTextPermissionError } from '@apps-in-toss/framework';
29
+ * import { Alert, Button } from 'react-native';
30
+ *
31
+ * // '복사' 버튼을 누르면 "복사할 텍스트"가 클립보드에 복사돼요.
32
+ * function CopyButton() {
33
+ * const handleCopy = async () => {
34
+ * try {
35
+ * await setClipboardText('복사할 텍스트');
36
+ * console.log('텍스트가 복사됐어요!');
37
+ * } catch (error) {
38
+ * if (error instanceof SetClipboardTextPermissionError) {
39
+ * // 텍스트 쓰기 권한 거부됨
40
+ * }
41
+ * }
42
+ * };
43
+ *
44
+ * return (
45
+ * <>
46
+ * <Button title="복사" onPress={handleCopy} />
47
+ * <Button
48
+ * title="권한 확인하기"
49
+ * onPress={async () => {
50
+ * const permission = await setClipboardText.getPermission();
51
+ * Alert.alert(permission);
52
+ * }}
53
+ * />
54
+ * <Button
55
+ * title="권한 요청하기"
56
+ * onPress={async () => {
57
+ * const permission = await setClipboardText.openPermissionDialog();
58
+ * Alert.alert(permission);
59
+ * }}
60
+ * />
61
+ * </>
62
+ * );
63
+ * }
64
+ * ```
65
+ */
66
+ export const setClipboardText = createPermissionFunction<SetClipboardText>({
67
+ handler: (text) => {
68
+ return AppsInTossModule.setClipboardText({ text });
69
+ },
70
+ permission: {
71
+ name: 'clipboard',
72
+ access: 'write',
73
+ },
74
+ error: SetClipboardTextPermissionError,
75
+ });
@@ -14,7 +14,7 @@ export interface SaveBase64DataParams {
14
14
  * @description 문자열로 인코딩된 Base64 데이터를 지정한 파일 이름과 MIME 타입으로 사용자 기기에 저장해요. 이미지, 텍스트, PDF 등 다양한 형식의 데이터를 저장할 수 있어요.
15
15
  * @param {SaveBase64DataParams} params - 저장할 데이터와 파일 정보를 담은 객체예요.
16
16
  * @param {string} params.data - Base64 형식으로 인코딩된 데이터 문자열이에요.
17
- * @param {string} params.fileName - 저장할 파일 이름이에요. 확장자도 같이 붙여줘야해요. 예를 들어, 'example.png'로 저장할 수 있어요.
17
+ * @param {string} params.fileName - 저장할 파일 이름이에요. 확장자도 같이 붙여줘야해요. 예를 들어, 'example.png'로 저장할 수 있어요.
18
18
  * @param {string} params.mimeType - 저장할 파일의 MIME 타입이에요. 예를 들어 'image/png' 로 지정하면 이미지, 'application/pdf'는 PDF 파일이에요. 자세한 내용은 [MIME 문서](https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/MIME_types)를 참고해주세요.
19
19
  *
20
20
  * @example
@@ -9,12 +9,15 @@ export * from './BedrockModule/native-modules/natives/setIosSwipeGestureEnabled'
9
9
  export * from './BedrockModule/native-modules/natives/openURL';
10
10
 
11
11
  // AppsInTossModule
12
- export * from './AppsInTossModule/native-modules/setClipboardText';
13
- export * from './AppsInTossModule/native-modules/getClipboardText';
14
- export * from './AppsInTossModule/native-modules/fetchContacts';
15
- export * from './AppsInTossModule/native-modules/fetchAlbumPhotos';
16
- export * from './AppsInTossModule/native-modules/getCurrentLocation';
17
- export * from './AppsInTossModule/native-modules/openCamera';
12
+ export * from './AppsInTossModule/native-modules/permissions/openPermissionDialog';
13
+ export * from './AppsInTossModule/native-modules/permissions/requestPermission';
14
+ export * from './AppsInTossModule/native-modules/getPermission';
15
+ export * from './AppsInTossModule/native-modules/permissions/setClipboardText/setClipboardText';
16
+ export * from './AppsInTossModule/native-modules/permissions/getClipboardText/getClipboardText';
17
+ export * from './AppsInTossModule/native-modules/permissions/fetchContacts/fetchContacts';
18
+ export * from './AppsInTossModule/native-modules/permissions/fetchAlbumPhotos/fetchAlbumPhotos';
19
+ export * from './AppsInTossModule/native-modules/permissions/getCurrentLocation/getCurrentLocation';
20
+ export * from './AppsInTossModule/native-modules/permissions/openCamera/openCamera';
18
21
  export * from './AppsInTossModule/native-modules/appLogin';
19
22
  export * from './AppsInTossModule/native-modules/eventLog';
20
23
  export * from './AppsInTossModule/native-modules/getTossShareLink';
package/src/types.ts CHANGED
@@ -1,108 +1,2 @@
1
- export type PermissionStatus = 'notDetermined' | 'denied' | 'allowed';
2
- export type PermissionAccess = 'read' | 'write' | 'access';
3
- export type PermissionName = 'clipboard' | 'contacts' | 'photos' | 'geolocation' | 'camera';
4
-
5
1
  // Log
6
2
  export type Primitive = string | number | boolean | null | undefined | symbol;
7
-
8
- /**
9
- * @public
10
- * @category 위치 정보
11
- * @name Accuracy
12
- * @description 위치 정확도 옵션이에요.
13
- */
14
- export enum Accuracy {
15
- /**
16
- * 오차범위 3KM 이내
17
- */
18
- Lowest = 1,
19
- /**
20
- * 오차범위 1KM 이내
21
- */
22
- Low,
23
- /**
24
- * 오차범위 몇 백미터 이내
25
- */
26
- Balanced,
27
- /**
28
- * 오차범위 10M 이내
29
- */
30
- High,
31
- /**
32
- * 가장 높은 정확도
33
- */
34
- Highest,
35
- /**
36
- * 네비게이션을 위한 최고 정확도
37
- */
38
- BestForNavigation,
39
- }
40
-
41
- /**
42
- * @public
43
- * @category 위치 정보
44
- * @name Location
45
- * @description 위치 정보를 나타내는 객체예요.
46
- */
47
- export interface Location {
48
- /**
49
- * Android에서만 지원하는 옵션이에요.
50
- *
51
- * - `FINE`: 정확한 위치
52
- * - `COARSE`: 대략적인 위치
53
- *
54
- * @see https://developer.android.com/codelabs/approximate-location
55
- */
56
- accessLocation?: 'FINE' | 'COARSE';
57
- /**
58
- * 위치가 업데이트된 시점의 유닉스 타임스탬프예요.
59
- */
60
- timestamp: number;
61
- /**
62
- * @description 위치 정보를 나타내는 객체예요. 자세한 내용은 [LocationCoords](/react-native/reference/native-modules/Types/LocationCoords.html)을 참고해주세요.
63
- */
64
- coords: LocationCoords;
65
- }
66
-
67
- /**
68
- * @public
69
- * @category 위치 정보
70
- * @name LocationCoords
71
- * @description 세부 위치 정보를 나타내는 객체예요.
72
- */
73
- export interface LocationCoords {
74
- /**
75
- * 위도
76
- */
77
- latitude: number;
78
- /**
79
- * 경도
80
- */
81
- longitude: number;
82
- /**
83
- * 높이
84
- */
85
- altitude: number;
86
- /**
87
- * 위치 정확도
88
- */
89
- accuracy: number;
90
- /**
91
- * 고도 정확도
92
- */
93
- altitudeAccuracy: number;
94
- /**
95
- * 방향
96
- */
97
- heading: number;
98
- }
99
-
100
- /**
101
- * 사진 조회 결과를 나타내는 타입이에요.
102
- */
103
- export interface ImageResponse {
104
- /** 가져온 사진의 고유 ID예요. */
105
- id: string;
106
- /** 사진의 데이터 URI예요. `base64` 옵션이 `true`인 경우 Base64 문자열로 반환돼요. */
107
- dataUri: string;
108
- }