@apps-in-toss/web-bridge 1.0.3 → 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.
@@ -1,16 +1,36 @@
1
+ export type SetClipboardText = (text: string) => Promise<void>;
2
+ type PermissionStatus$1 = "notDetermined" | "denied" | "allowed";
3
+ export type PermissionDialogFunction = () => Promise<Exclude<PermissionStatus$1, "notDetermined">>;
4
+ export type GetPermissionFunction = () => Promise<PermissionStatus$1>;
5
+ export type PermissionFunctionWithDialog<T extends (...args: any[]) => any> = T & {
6
+ getPermission: GetPermissionFunction;
7
+ openPermissionDialog: PermissionDialogFunction;
8
+ };
1
9
  /**
2
10
  * @public
3
11
  * @category 클립보드
4
12
  * @name setClipboardText
5
13
  * @description 텍스트를 클립보드에 복사해서 사용자가 다른 곳에 붙여 넣기 할 수 있어요.
6
14
  * @param {Promise<void>} text - 클립보드에 복사할 텍스트예요. 문자열 형식으로 입력해요.
15
+ * @property [openPermissionDialog] - 클립보드 쓰기 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
16
+ * @property [getPermission] - 클립보드 쓰기 권한의 현재 상태를 반환해요. `allowed`는 사용자가 클립보드 쓰기 권한을 허용한 상태예요. `denied`는 사용자가 클립보드 쓰기 권한을 거부한 상태예요. `notDetermined`는 클립보드 쓰기 권한 요청을 한 번도 하지 않은 상태예요.
17
+ *
18
+ * @signature
19
+ * ```typescript
20
+ * function setClipboardText(text: string): Promise<void>;
21
+ * ```
7
22
  *
8
23
  * @example
9
24
  * ### 텍스트를 클립보드에 복사하기
10
25
  *
26
+ * 텍스트를 클립보드에 복사하는 예제예요.
27
+ * "권한 확인하기"버튼을 눌러서 현재 클립보드 쓰기 권한을 확인해요.
28
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`SetClipboardTextPermissionError`](/react-native/reference/types/권한/SetClipboardTextPermissionError)를 반환해요.
29
+ * "권한 요청하기"버튼을 눌러서 클립보드 쓰기 권한을 요청할 수 있어요.
30
+ *
11
31
  * ```tsx
32
+ * import { setClipboardText, SetClipboardTextPermissionError } from '@apps-in-toss/web-framework';
12
33
  *
13
- * import { setClipboardText } from '@apps-in-toss/web-framework';
14
34
  *
15
35
  * // '복사' 버튼을 누르면 "복사할 텍스트"가 클립보드에 복사돼요.
16
36
  * function CopyButton() {
@@ -19,14 +39,34 @@
19
39
  * await setClipboardText('복사할 텍스트');
20
40
  * console.log('텍스트가 복사됐어요!');
21
41
  * } catch (error) {
22
- * console.error('텍스트 복사에 실패했어요:', error);
42
+ * if (error instanceof SetClipboardTextPermissionError) {
43
+ * // 텍스트 쓰기 권한 거부됨
44
+ * }
23
45
  * }
24
46
  * };
25
47
  *
26
- * return <input type="button" value="복사" onClick={handleCopy} />;
48
+ * return (
49
+ * <>
50
+ * <input type="button" value="복사" onClick={handleCopy} />
51
+ * <input type="button"
52
+ * value="권한 확인하기"
53
+ * onClick={async () => {
54
+ * const permission = await setClipboardText.getPermission();
55
+ * Alert.alert(permission);
56
+ * }}
57
+ * />
58
+ * <input type="button"
59
+ * value="권한 요청하기"
60
+ * onClick={async () => {
61
+ * const permission = await setClipboardText.openPermissionDialog();
62
+ * Alert.alert(permission);
63
+ * }}
64
+ * />
65
+ * </>
66
+ * );
27
67
  * }
28
68
  * ```
29
69
  */
30
- export declare function setClipboardText(text: string): Promise<void>;
70
+ export declare const setClipboardText: PermissionFunctionWithDialog<SetClipboardText>;
31
71
 
32
72
  export {};
@@ -1,9 +1,3 @@
1
-
2
-
3
- export interface EventEmitterSchema<K extends string, P extends unknown[]> {
4
- name: K;
5
- params: P;
6
- }
7
1
  declare enum Accuracy {
8
2
  /**
9
3
  * 오차범위 3KM 이내
@@ -95,8 +89,17 @@ export interface StartUpdateLocationOptions {
95
89
  */
96
90
  distanceInterval: number;
97
91
  }
98
- export interface StartUpdateLocationSubscription extends EmitterSubscription {
99
- remove: () => Promise<void>;
92
+ export type StartUpdateLocationEventParams = {
93
+ onEvent: (response: Location$1) => void;
94
+ onError: (error: unknown) => void;
95
+ options: StartUpdateLocationOptions;
96
+ };
97
+ type PermissionStatus$1 = "notDetermined" | "denied" | "allowed";
98
+ export type PermissionDialogFunction = () => Promise<Exclude<PermissionStatus$1, "notDetermined">>;
99
+ export type GetPermissionFunction = () => Promise<PermissionStatus$1>;
100
+ export interface EventEmitterSchema<K extends string, P extends unknown[]> {
101
+ name: K;
102
+ params: P;
100
103
  }
101
104
  /**
102
105
  * @name UpdateLocationEventEmitter
@@ -115,26 +118,46 @@ export type UpdateLocationEventEmitter = EventEmitterSchema<"updateLocation", [
115
118
  * 실시간 위치 추적이 필요한 기능을 구현할 때 사용할 수 있어요. 예를 들어 지도 앱에서 사용자의 현재 위치를 실시간으로 업데이트할 때, 운동 앱에서 사용자의 이동 거리를 기록할 때 등이에요.
116
119
  * 위치 업데이트 주기와 정확도를 조정해 배터리 소모를 최소화하면서도 필요한 정보를 얻을 수 있어요.
117
120
  *
121
+ *
122
+ * @param {(error: unknown) => void} onError 위치 정보 감지에 실패했을 때 호출되는 콜백 함수예요.
123
+ * @param {(location: Location) => void} onEvent 위치 정보가 변경될 때 호출되는 콜백 함수예요. 자세한 내용은 [Location](/react-native/reference/native-modules/Types/Location.html)을 참고해주세요.
118
124
  * @param {StartUpdateLocationOptions} options - 위치 정보 감지에 필요한 설정 객체에요.
119
125
  * @param {number} [options.accuracy] 위치 정확도를 설정해요.
120
126
  * @param {number} [options.timeInterval] 위치 정보를 업데이트하는 최소 주기로, 단위는 밀리초(ms)예요. 이 값은 위치 업데이트가 발생하는 가장 짧은 간격을 설정하지만, 시스템이나 환경의 영향을 받아 지정한 주기보다 더 긴 간격으로 업데이트될 수 있어요.
121
127
  * @param {number} [options.distanceInterval] 위치 변경 거리를 미터(m) 단위로 설정해요.
122
- * @param {(location: Location) => void} [options.callback] 위치 정보가 변경될 때 호출되는 콜백 함수예요. 자세한 내용은 [Location](/react-native/reference/native-modules/Types/Location.html)을 참고해주세요.
128
+ *
129
+ * @property [openPermissionDialog] - 위치 정보 권한을 다시 요청하는 다이얼로그를 표시해요. 사용자는 "허용", "한 번만 허용", "안하기" 중 하나를 선택할 수 있어요. "허용"이나 "한 번만 허용"을 선택하면 `allowed`를 반환하고, "안하기"를 선택하면 `denied`를 반환해요.
130
+ * @property [getPermission] - 위치 정보 권한의 현재 상태를 반환해요. `allowed`는 사용자가 위치 정보 권한을 허용한 상태예요. `denied`는 사용자가 위치 정보 권한을 거부한 상태예요. `notDetermined`는 위치 정보 권한 요청을 한 번도 하지 않은 상태예요.
131
+ *
132
+ * @signature
133
+ * ```typescript
134
+ * function startUpdateLocation(options: {
135
+ * onError: (error: unknown) => void;
136
+ * onEvent: (location: Location) => void;
137
+ * options: StartUpdateLocationOptions;
138
+ * }): () => void;
139
+ * ```
123
140
  *
124
141
  * @example
125
142
  * ### 위치 정보 변경 감지하기
126
143
  *
144
+ * 위치 정보가 변경되는것을 감지하는 예제예요. "위치 정보 변경 감지하기"를 눌러서 감지할 수 있어요.
145
+ *
146
+ * "권한 확인하기"버튼을 눌러서 현재 위치 정보 변경 감지 권한을 확인해요.
147
+ * 사용자가 권한을 거부했거나 시스템에서 권한이 제한된 경우에는 [`StartUpdateLocationPermissionError`](/react-native/reference/types/권한/StartUpdateLocationPermissionError)를 반환해요.
148
+ * "권한 요청하기"버튼을 눌러서 위치 정보 변경 감지 권한을 요청할 수 있어요.
149
+ *
127
150
  * ```tsx
128
- * import React, { useState, useEffect } from 'react';
151
+ * import { Accuracy, Location, startUpdateLocation, StartUpdateLocationPermissionError } from '@apps-in-toss/web-framework';
152
+ * import { useCallback, useState } from 'react';
129
153
  *
130
- * import { startUpdateLocation } from '@apps-in-toss/web-framework';
131
154
  *
132
155
  * // 위치 정보 변경 감지하기
133
156
  * function LocationWatcher() {
134
- * const [location, setLocation] = useState(null);
157
+ * const [location, setLocation] = useState<Location | null>(null);
135
158
  *
136
- * useEffect(() => {
137
- * return startUpdateLocation({
159
+ * const handlePress = useCallback(() => {
160
+ * startUpdateLocation({
138
161
  * options: {
139
162
  * accuracy: Accuracy.Balanced,
140
163
  * timeInterval: 3000,
@@ -144,32 +167,52 @@ export type UpdateLocationEventEmitter = EventEmitterSchema<"updateLocation", [
144
167
  * setLocation(location);
145
168
  * },
146
169
  * onError: (error) => {
170
+ * if (error instanceof StartUpdateLocationPermissionError) {
171
+ * // 위치 정보 변경 감지 권한 없음
172
+ * }
147
173
  * console.error('위치 정보를 가져오는데 실패했어요:', error);
148
174
  * },
149
175
  * });
150
176
  * }, []);
151
177
  *
152
- * if (location == null) {
153
- * return <span>위치 정보를 가져오는 중이에요...</span>;
154
- * }
155
- *
156
178
  * return (
157
179
  * <div>
158
- * <span>위도: {location.coords.latitude}</span>
159
- * <span>경도: {location.coords.longitude}</span>
160
- * <span>위치 정확도: {location.coords.accuracy}m</span>
161
- * <span>높이: {location.coords.altitude}m</span>
162
- * <span>고도 정확도: {location.coords.altitudeAccuracy}m</span>
163
- * <span>방향: {location.coords.heading}°</span>
180
+ * {location != null && (
181
+ * <>
182
+ * <span>위도: {location.coords.latitude}</span>
183
+ * <span>경도: {location.coords.longitude}</span>
184
+ * <span>위치 정확도: {location.coords.accuracy}m</span>
185
+ * <span>높이: {location.coords.altitude}m</span>
186
+ * <span>고도 정확도: {location.coords.altitudeAccuracy}m</span>
187
+ * <span>방향: {location.coords.heading}°</span>
188
+ * </>
189
+ * )}
190
+ *
191
+ * <input type="button" value="위치 정보 변경 감지하기" onClick={handlePress} />
192
+ *
193
+ * <input type="button"
194
+ * value="권한 확인하기"
195
+ * onClick={async () => {
196
+ * const permission = await startUpdateLocation.getPermission();
197
+ * Alert.alert(permission);
198
+ * }}
199
+ * />
200
+ * <input type="button"
201
+ * value="권한 요청하기"
202
+ * onClick={async () => {
203
+ * const permission = await startUpdateLocation.openPermissionDialog();
204
+ * Alert.alert(permission);
205
+ * }}
206
+ * />
164
207
  * </div>
165
208
  * );
166
209
  * }
167
210
  * ```
168
211
  */
169
- export declare function startUpdateLocation(eventParams: {
170
- onEvent: (response: Location$1) => void;
171
- onError: (error: unknown) => void;
172
- options: StartUpdateLocationOptions;
173
- }): () => void;
212
+ export declare function startUpdateLocation(eventParams: StartUpdateLocationEventParams): () => void;
213
+ export declare namespace startUpdateLocation {
214
+ var openPermissionDialog: PermissionDialogFunction;
215
+ var getPermission: GetPermissionFunction;
216
+ }
174
217
 
175
218
  export {};
package/built/types.d.ts CHANGED
@@ -1,110 +1,3 @@
1
- type PermissionStatus$1 = "notDetermined" | "denied" | "allowed";
2
- export type PermissionAccess = "read" | "write" | "access";
3
- type PermissionName$1 = "clipboard" | "contacts" | "photos" | "geolocation" | "camera";
4
1
  export type Primitive = string | number | boolean | null | undefined | symbol;
5
- /**
6
- * @public
7
- * @category 위치 정보
8
- * @name Accuracy
9
- * @description 위치 정확도 옵션이에요.
10
- */
11
- export declare enum Accuracy {
12
- /**
13
- * 오차범위 3KM 이내
14
- */
15
- Lowest = 1,
16
- /**
17
- * 오차범위 1KM 이내
18
- */
19
- Low = 2,
20
- /**
21
- * 오차범위 몇 백미터 이내
22
- */
23
- Balanced = 3,
24
- /**
25
- * 오차범위 10M 이내
26
- */
27
- High = 4,
28
- /**
29
- * 가장 높은 정확도
30
- */
31
- Highest = 5,
32
- /**
33
- * 네비게이션을 위한 최고 정확도
34
- */
35
- BestForNavigation = 6
36
- }
37
- /**
38
- * @public
39
- * @category 위치 정보
40
- * @name Location
41
- * @description 위치 정보를 나타내는 객체예요.
42
- */
43
- interface Location$1 {
44
- /**
45
- * Android에서만 지원하는 옵션이에요.
46
- *
47
- * - `FINE`: 정확한 위치
48
- * - `COARSE`: 대략적인 위치
49
- *
50
- * @see https://developer.android.com/codelabs/approximate-location
51
- */
52
- accessLocation?: "FINE" | "COARSE";
53
- /**
54
- * 위치가 업데이트된 시점의 유닉스 타임스탬프예요.
55
- */
56
- timestamp: number;
57
- /**
58
- * @description 위치 정보를 나타내는 객체예요. 자세한 내용은 [LocationCoords](/react-native/reference/native-modules/Types/LocationCoords.html)을 참고해주세요.
59
- */
60
- coords: LocationCoords;
61
- }
62
- /**
63
- * @public
64
- * @category 위치 정보
65
- * @name LocationCoords
66
- * @description 세부 위치 정보를 나타내는 객체예요.
67
- */
68
- export interface LocationCoords {
69
- /**
70
- * 위도
71
- */
72
- latitude: number;
73
- /**
74
- * 경도
75
- */
76
- longitude: number;
77
- /**
78
- * 높이
79
- */
80
- altitude: number;
81
- /**
82
- * 위치 정확도
83
- */
84
- accuracy: number;
85
- /**
86
- * 고도 정확도
87
- */
88
- altitudeAccuracy: number;
89
- /**
90
- * 방향
91
- */
92
- heading: number;
93
- }
94
- /**
95
- * 사진 조회 결과를 나타내는 타입이에요.
96
- */
97
- export interface ImageResponse {
98
- /** 가져온 사진의 고유 ID예요. */
99
- id: string;
100
- /** 사진의 데이터 URI예요. `base64` 옵션이 `true`인 경우 Base64 문자열로 반환돼요. */
101
- dataUri: string;
102
- }
103
-
104
- export {
105
- Location$1 as Location,
106
- PermissionName$1 as PermissionName,
107
- PermissionStatus$1 as PermissionStatus,
108
- };
109
2
 
110
3
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@apps-in-toss/web-bridge",
3
3
  "type": "module",
4
- "version": "1.0.3",
4
+ "version": "1.1.0",
5
5
  "description": "Web Bridge for Apps In Toss",
6
6
  "scripts": {
7
7
  "prepack": "yarn build",
@@ -27,9 +27,12 @@
27
27
  "files": [
28
28
  "built"
29
29
  ],
30
+ "dependencies": {
31
+ "@apps-in-toss/types": "1.1.0"
32
+ },
30
33
  "devDependencies": {
31
- "@apps-in-toss/bridge-core": "1.0.3",
32
- "@apps-in-toss/framework": "1.0.3",
34
+ "@apps-in-toss/bridge-core": "1.1.0",
35
+ "@apps-in-toss/framework": "1.1.0",
33
36
  "@swc/core": "^1.12.7",
34
37
  "picocolors": "^1.1.1",
35
38
  "ts-morph": "^26.0.0",
@@ -43,5 +46,5 @@
43
46
  "publishConfig": {
44
47
  "access": "public"
45
48
  },
46
- "gitHead": "380ad5f697a176bcc6adae409153fa43e700d053"
49
+ "gitHead": "614cfd1ee039b44cd6efeb94cefac18ed3c0e6c3"
47
50
  }