@apps-in-toss/web-framework 0.0.0-dev.1743135526084 → 0.0.0-dev.1744801739343

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,14 +1,14 @@
1
1
  [
2
2
  {
3
3
  "platform": "ios",
4
- "totalModuleCount": 1602,
5
- "duration": 1035.676083,
6
- "size": 409089
4
+ "totalModuleCount": 1600,
5
+ "duration": 1026.3825829999998,
6
+ "size": 427594
7
7
  },
8
8
  {
9
9
  "platform": "android",
10
- "totalModuleCount": 1602,
11
- "duration": 1038.966791,
12
- "size": 408290
10
+ "totalModuleCount": 1600,
11
+ "duration": 1015.0549169999997,
12
+ "size": 426973
13
13
  }
14
14
  ]
@@ -5,9 +5,9 @@ export * from './setSecureScreen';
5
5
  export * from './setScreenAwakeMode';
6
6
  export * from './getNetworkStatus';
7
7
  export * from './setIosSwipeGestureEnabled';
8
+ export * from './openURL';
8
9
  export * from './getLocale';
9
10
  export * from './getSchemeUri';
10
- export * from './getDeviceId';
11
11
  export * from './getPlatformOS';
12
12
  export * from './setClipboardText';
13
13
  export * from './getClipboardText';
@@ -19,4 +19,6 @@ export * from './appLogin';
19
19
  export * from './checkoutPayment';
20
20
  export * from './executePayment';
21
21
  export * from './getOperationalEnvironment';
22
+ export * from './getTossAppVersion';
23
+ export * from './getDeviceId';
22
24
  export * from './startUpdateLocation';
@@ -1 +1 @@
1
- export const createEvents=()=>({emit(event,args){for(let callbacks=this.events[event]||[],i=0,length=callbacks.length;i<length;i++){callbacks[i](args)}},events:{},on(event,cb){var _this_events,_event;((_this_events=this.events)[_event=event]||(_this_events[_event]=[])).push(cb);return()=>{var _this_events_event;this.events[event]=(_this_events_event=this.events[event])===null||_this_events_event===void 0?void 0:_this_events_event.filter(i=>cb!==i)}}});const createEventId=()=>Math.random().toString(36).substring(2,15);const deserializeError=value=>{if(value&&value.__isError){const err=new Error(value.message);err.name=value.name;err.stack=value.stack;return err}return value};window.__BEDROCK_NATIVE_EMITTER=createEvents();export function closeView(...args){if(!window.ReactNativeWebView){throw new Error("This closeView is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`closeView/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`closeView/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"closeView",eventId,args}))})}export function generateHapticFeedback(...args){if(!window.ReactNativeWebView){throw new Error("This generateHapticFeedback is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`generateHapticFeedback/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`generateHapticFeedback/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"generateHapticFeedback",eventId,args}))})}export function share(...args){if(!window.ReactNativeWebView){throw new Error("This share is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`share/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`share/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"share",eventId,args}))})}export function setSecureScreen(...args){if(!window.ReactNativeWebView){throw new Error("This setSecureScreen is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setSecureScreen/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setSecureScreen/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setSecureScreen",eventId,args}))})}export function setScreenAwakeMode(...args){if(!window.ReactNativeWebView){throw new Error("This setScreenAwakeMode is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setScreenAwakeMode/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setScreenAwakeMode/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setScreenAwakeMode",eventId,args}))})}export function getNetworkStatus(...args){if(!window.ReactNativeWebView){throw new Error("This getNetworkStatus is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getNetworkStatus/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getNetworkStatus/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"getNetworkStatus",eventId,args}))})}export function setIosSwipeGestureEnabled(...args){if(!window.ReactNativeWebView){throw new Error("This setIosSwipeGestureEnabled is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setIosSwipeGestureEnabled/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setIosSwipeGestureEnabled/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setIosSwipeGestureEnabled",eventId,args}))})}export function getLocale(){if(!window.ReactNativeWebView){throw new Error("This getLocale is not available in browser environment")}if("getLocale"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getLocale"]}throw new Error("getLocale is not a constant handler")}export function getSchemeUri(){if(!window.ReactNativeWebView){throw new Error("This getSchemeUri is not available in browser environment")}if("getSchemeUri"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getSchemeUri"]}throw new Error("getSchemeUri is not a constant handler")}export function getDeviceId(){if(!window.ReactNativeWebView){throw new Error("This getDeviceId is not available in browser environment")}if("getDeviceId"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getDeviceId"]}throw new Error("getDeviceId is not a constant handler")}export function getPlatformOS(){if(!window.ReactNativeWebView){throw new Error("This getPlatformOS is not available in browser environment")}if("getPlatformOS"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getPlatformOS"]}throw new Error("getPlatformOS is not a constant handler")}export function setClipboardText(...args){if(!window.ReactNativeWebView){throw new Error("This setClipboardText is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setClipboardText/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`setClipboardText/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"setClipboardText",eventId,args}))})}export function getClipboardText(...args){if(!window.ReactNativeWebView){throw new Error("This getClipboardText is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getClipboardText/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getClipboardText/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"getClipboardText",eventId,args}))})}export function fetchContacts(...args){if(!window.ReactNativeWebView){throw new Error("This fetchContacts is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchContacts/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchContacts/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"fetchContacts",eventId,args}))})}export function fetchAlbumPhotos(...args){if(!window.ReactNativeWebView){throw new Error("This fetchAlbumPhotos is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchAlbumPhotos/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`fetchAlbumPhotos/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"fetchAlbumPhotos",eventId,args}))})}export var Accuracy=function(Accuracy){Accuracy[Accuracy["Lowest"]=1]="Lowest";Accuracy[Accuracy["Low"]=2]="Low";Accuracy[Accuracy["Balanced"]=3]="Balanced";Accuracy[Accuracy["High"]=4]="High";Accuracy[Accuracy["Highest"]=5]="Highest";Accuracy[Accuracy["BestForNavigation"]=6]="BestForNavigation";return Accuracy}({});export function getCurrentLocation(...args){if(!window.ReactNativeWebView){throw new Error("This getCurrentLocation is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getCurrentLocation/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`getCurrentLocation/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"getCurrentLocation",eventId,args}))})}export function openCamera(...args){if(!window.ReactNativeWebView){throw new Error("This openCamera is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`openCamera/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`openCamera/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"openCamera",eventId,args}))})}export function appLogin(...args){if(!window.ReactNativeWebView){throw new Error("This appLogin is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`appLogin/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`appLogin/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"appLogin",eventId,args}))})}export function checkoutPayment(...args){if(!window.ReactNativeWebView){throw new Error("This checkoutPayment is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`checkoutPayment/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`checkoutPayment/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"checkoutPayment",eventId,args}))})}export function executePayment(...args){if(!window.ReactNativeWebView){throw new Error("This executePayment is not available in browser environment")}const eventId=createEventId();const emitters=[];const unsubscribe=()=>{for(const emitter of emitters){emitter()}};return new Promise((resolve,reject)=>{emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`executePayment/resolve/${eventId}`,args=>{unsubscribe();resolve(args)}));emitters.push(window.__BEDROCK_NATIVE_EMITTER.on(`executePayment/reject/${eventId}`,error=>{unsubscribe();reject(deserializeError(error))}));window.ReactNativeWebView.postMessage(JSON.stringify({type:"method",functionName:"executePayment",eventId,args}))})}export function getOperationalEnvironment(){if(!window.ReactNativeWebView){throw new Error("This getOperationalEnvironment is not available in browser environment")}if("getOperationalEnvironment"in window.__CONSTANT_HANDLER_MAP){return window.__CONSTANT_HANDLER_MAP["getOperationalEnvironment"]}throw new Error("getOperationalEnvironment is not a constant handler")}export function startUpdateLocation({onEvent,onError,options}){if(!window.ReactNativeWebView){onError(new Error("This startUpdateLocation is not available in browser environment"));return()=>{}}const eventId=createEventId();const removes=[window.__BEDROCK_NATIVE_EMITTER.on(`startUpdateLocation/onEvent/${eventId}`,response=>{onEvent(response)}),window.__BEDROCK_NATIVE_EMITTER.on(`startUpdateLocation/onError/${eventId}`,error=>{onError(deserializeError(error))})];window.ReactNativeWebView.postMessage(JSON.stringify({type:"addEventListener",functionName:"startUpdateLocation",eventId,args:options}));return()=>{window.ReactNativeWebView.postMessage(JSON.stringify({type:"removeEventListener",functionName:"startUpdateLocation",eventId}));for(const remove of removes){remove()}}}
1
+ import{createAsyncBridge,createConstantBridge,createEventBridge}from"@apps-in-toss/bridge-core";var createEvents=function(){return{emit:function emit(event,args){for(var callbacks=this.events[event]||[],i=0,length=callbacks.length;i<length;i++){callbacks[i](args)}},events:{},on:function on(event,cb){var _this=this;var _this_events,_event;((_this_events=this.events)[_event=event]||(_this_events[_event]=[])).push(cb);return function(){var _this_events_event;_this.events[event]=(_this_events_event=_this.events[event])===null||_this_events_event===void 0?void 0:_this_events_event.filter(function(i){return cb!==i})}}}};if(typeof window!=="undefined"){window.__BEDROCK_NATIVE_EMITTER=createEvents()}export var closeView=createAsyncBridge("closeView");export var generateHapticFeedback=createAsyncBridge("generateHapticFeedback");export var share=createAsyncBridge("share");export var setSecureScreen=createAsyncBridge("setSecureScreen");export var setScreenAwakeMode=createAsyncBridge("setScreenAwakeMode");export var getNetworkStatus=createAsyncBridge("getNetworkStatus");export var setIosSwipeGestureEnabled=createAsyncBridge("setIosSwipeGestureEnabled");export var openURL=createAsyncBridge("openURL");export var getLocale=createConstantBridge("getLocale");export var getSchemeUri=createConstantBridge("getSchemeUri");export var getPlatformOS=createConstantBridge("getPlatformOS");export var setClipboardText=createAsyncBridge("setClipboardText");export var getClipboardText=createAsyncBridge("getClipboardText");export var fetchContacts=createAsyncBridge("fetchContacts");export var fetchAlbumPhotos=createAsyncBridge("fetchAlbumPhotos");export var Accuracy=function(Accuracy){Accuracy[Accuracy["Lowest"]=1]="Lowest";Accuracy[Accuracy["Low"]=2]="Low";Accuracy[Accuracy["Balanced"]=3]="Balanced";Accuracy[Accuracy["High"]=4]="High";Accuracy[Accuracy["Highest"]=5]="Highest";Accuracy[Accuracy["BestForNavigation"]=6]="BestForNavigation";return Accuracy}({});export var getCurrentLocation=createAsyncBridge("getCurrentLocation");export var openCamera=createAsyncBridge("openCamera");export var appLogin=createAsyncBridge("appLogin");export var checkoutPayment=createAsyncBridge("checkoutPayment");export var executePayment=createAsyncBridge("executePayment");export var getOperationalEnvironment=createConstantBridge("getOperationalEnvironment");export var getTossAppVersion=createConstantBridge("getTossAppVersion");export var getDeviceId=createConstantBridge("getDeviceId");export var startUpdateLocation=createEventBridge("startUpdateLocation");
@@ -236,7 +236,7 @@ export interface TossMoneyExecutePaymentResult {
236
236
  * @param {ExecutePaymentOptions} options 결제를 실행할 때 필요한 옵션이에요.
237
237
  * @param {string} options.orderNo 결제를 생성할 때 사용한 주문번호예요.
238
238
  * @param {string} options.payToken 결제 인증 과정에서 전달받은 결제 토큰이에요. 결제를 실행할 때 사용해요.
239
- * @returns {Promise<CardExecutePaymentResult | TossMoneyExecutePaymentResult>} 결제 결과 객체를 반환해요. 자세한 내용은 [카드 결제 결과](reference/framework/토스페이/CardExecutePaymentResult.html) 또는 [토스머니 결제 결과](reference/framework/토스페이/TossMoneyExecutePaymentResult.html)를 참고하세요.
239
+ * @returns {Promise<CardExecutePaymentResult | TossMoneyExecutePaymentResult>} 결제 결과 객체를 반환해요. 자세한 내용은 [카드 결제 결과](/react-native/reference/framework/토스페이/CardExecutePaymentResult.html) 또는 [토스머니 결제 결과](/react-native/reference/framework/토스페이/TossMoneyExecutePaymentResult.html)를 참고하세요.
240
240
  *
241
241
  * @example
242
242
  *
@@ -29,7 +29,7 @@ export interface HapticFeedbackOptions {
29
29
  * @public
30
30
  * @category 인터렉션
31
31
  * @name generateHapticFeedback
32
- * @description 디바이스에 햅틱 진동을 일으키는 함수예요. 예를 들어, 버튼 터치나 화면전환에 드라마틱한 효과를 주고 싶을 때 사용할 수 있어요. [HapticFeedbackOptions](/reference/@apps-in-toss/web-framework/인터렉션/HapticFeedbackOptions.html)에서 진동타입을 확인해 보세요.
32
+ * @description 디바이스에 햅틱 진동을 일으키는 함수예요. 예를 들어, 버튼 터치나 화면전환에 드라마틱한 효과를 주고 싶을 때 사용할 수 있어요. [HapticFeedbackOptions](/react-native/reference/@apps-in-toss/web-framework/인터렉션/HapticFeedbackOptions.html)에서 진동타입을 확인해 보세요.
33
33
  * @returns {void}
34
34
  *
35
35
  * @example
@@ -51,7 +51,7 @@ export interface Location {
51
51
  */
52
52
  timestamp: number;
53
53
  /**
54
- * @description 위치 정보를 나타내는 객체예요. 자세한 내용은 [LocationCoords](/reference/framework/Types/LocationCoords.html)을 참고해주세요.
54
+ * @description 위치 정보를 나타내는 객체예요. 자세한 내용은 [LocationCoords](/react-native/reference/framework/Types/LocationCoords.html)을 참고해주세요.
55
55
  */
56
56
  coords: LocationCoords;
57
57
  }
@@ -103,7 +103,7 @@ export interface GetCurrentLocationOptions {
103
103
  *
104
104
  * @param {GetCurrentLocationOptions} options 위치 정보를 가져올 때 사용하는 옵션 객체예요.
105
105
  * @param {Accuracy} [options.accuracy] 위치 정보의 정확도 수준이에요. 정확도는 `Accuracy` 타입으로 설정돼요.
106
- * @returns {Promise<Location>} 디바이스의 위치 정보가 담긴 객체를 반환해요. 자세한 내용은 [Location](/reference/framework/Types/Location.html)을 참고해주세요.
106
+ * @returns {Promise<Location>} 디바이스의 위치 정보가 담긴 객체를 반환해요. 자세한 내용은 [Location](/react-native/reference/framework/Types/Location.html)을 참고해주세요.
107
107
  *
108
108
  * @example
109
109
  * ### 디바이스의 현재 위치 정보 가져오기
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @public
3
+ * @category 환경 확인
4
+ * @name getTossAppVersion
5
+ * @description 토스 앱 버전을 가져옵니다. 예를 들어, `5.206.0`과 같은 형태로 반환돼요. 토스 앱 버전을 로그로 남기거나, 특정 기능이 특정 버전 이상에서만 실행될 때 사용돼요.
6
+ * @signature
7
+ * ```typescript
8
+ * function getTossAppVersion(): string
9
+ * ```
10
+ *
11
+ * @returns {string} 토스 앱 버전
12
+ *
13
+ * @example
14
+ *
15
+ *
16
+ * ### 토스 앱 버전 확인하기
17
+ *
18
+ * ```tsx
19
+ * import { getTossAppVersion } from '@apps-in-toss/web-framework';
20
+ *
21
+ *
22
+ * export function TossAppVersionPage() {
23
+ * return (
24
+ * <span>{getTossAppVersion()}</span>
25
+ * )
26
+ * }
27
+ * ```
28
+ */
29
+ export declare function getTossAppVersion(): string;
30
+
31
+ export {};
@@ -1,70 +1,104 @@
1
- export * from './bridge'
2
- /**
3
- * 비동기 브릿지 함수 생성
4
- * @param method 호출할 메서드 이름
5
- * @returns args를 받아 Promise를 반환하는 함수
6
- * @typeParam T: 인자로 전달할 데이터 타입
7
- * @typeParam R: resolve 시 반환될 데이터 타입 (기본 any)
8
- * @example
9
- * // 카메라 열기 브릿지 함수 생성
10
- * const openCamera = createAsyncBridge<{base64: boolean}, { dataUri: string }>('openCamera');
11
- *
12
- * // 사용 예시
13
- * async function takePicture() {
14
- * try {
15
- * const result = await openCamera();
16
- * console.log('카메라로 찍은 이미지 URL:', result.dataUri);
17
- * } catch (error) {
18
- * console.error('카메라 오류:', error);
19
- * }
20
- * }
21
- */
22
- declare function createAsyncBridge<T, R = any>(method: string): (args: T) => Promise<R>;
1
+ export * from './bridge';
2
+ export * from '@apps-in-toss/bridge-core';
23
3
 
24
4
  /**
25
- * 상수 브릿지 함수 생성
26
- * @param method 호출할 상수 핸들러 이름
27
- * @returns 상수 값을 반환하는 함수
28
- * @typeParam T: 상수 값의 타입
29
- * @example
30
- * // 디바이스 ID를 가져오는 상수 브릿지 생성
31
- * const getDeviceId = createConstantBridge<string>('getDeviceId');
32
- *
33
- * // 사용 예시
34
- * function displayDeviceInfo() {
35
- * const deviceId = getDeviceId();
36
- * console.log('디바이스 ID:', deviceId);
37
- * }
5
+ * @public
6
+ * @category 저장소
7
+ * @name Storage
8
+ * @description 네이티브의 저장소를 사용해요.
9
+ * @property {typeof getItem} [getItem] 모바일 앱의 로컬 저장소에서 아이템을 가져오는 함수예요. 자세한 내용은 [getItem](/react-native/reference/framework/저장소/getItem)을 참고하세요.
10
+ * @property {typeof setItem} [setItem] 모바일 앱의 로컬 저장소에 아이템을 저장하는 함수예요. 자세한 내용은 [setItem](/react-native/reference/framework/저장소/setItem)을 참고하세요.
11
+ * @property {typeof removeItem} [removeItem] 모바일 앱의 로컬 저장소에서 아이템을 삭제하는 함수예요. 자세한 내용은 [removeItem](/react-native/reference/framework/저장소/removeItem)을 참고하세요.
12
+ * @property {typeof clearItems} [clearItems] 모바일 앱의 로컬 저장소를 초기화하는 함수예요. 자세한 내용은 [clearItems](/react-native/reference/framework/저장소/clearItems)을 참고하세요.
38
13
  */
39
- declare function createConstantBridge<T>(method: string): () => T;
14
+ declare const Storage: {
15
+ /**
16
+ * @public
17
+ * @category 저장소
18
+ * @name getItem
19
+ * @description 모바일 앱의 로컬 저장소에서 문자열 데이터를 가져와요. 주로 앱이 종료되었다가 다시 시작해도 데이터가 유지되어야 하는 경우에 사용해요.
20
+ * @param {string} key - 가져올 아이템의 키를 입력해요.
21
+ * @returns {Promise<string | null>} 지정한 키에 저장된 문자열 값을 반환해요. 값이 없으면 `null`을 반환해요.
22
+ * @example
23
+ *
24
+ * ### `my-key`에 저장된 아이템 가져오기
25
+ * ```ts
26
+ * const value = await Storage.getItem('my-key');
27
+ * console.log(value); // 'value'
28
+ * ```
29
+ */
30
+ getItem: (args_0: string) => Promise<string | null>;
31
+ /**
32
+ * @public
33
+ * @category 저장소
34
+ * @name setItem
35
+ * @description 모바일 앱의 로컬 저장소에 문자열 데이터를 저장해요. 주로 앱이 종료되었다가 다시 시작해도 데이터가 유지되어야 하는 경우에 사용해요.
36
+ * @param {string} key - 저장할 아이템의 키를 입력해요.
37
+ * @param {string} value - 저장할 아이템의 값을 입력해요.
38
+ * @returns {Promise<void>} 아이템을 성공적으로 저장하면 아무 값도 반환하지 않아요.
39
+ * @example
40
+ *
41
+ * ### `my-key`에 아이템 저장하기
42
+ * ```ts
43
+ * import { Storage } from '@apps-in-toss/framework';
44
+ *
45
+ * await Storage.setItem('my-key', 'value');
46
+ * ```
47
+ */
48
+ setItem: (args_0: string, args_1: string) => Promise<void>;
49
+ /**
50
+ * @public
51
+ * @category 저장소
52
+ * @name removeItem
53
+ * @description 모바일 앱의 로컬 저장소에서 특정 키에 해당하는 아이템을 삭제해요.
54
+ * @param {string} key - 삭제할 아이템의 키를 입력해요.
55
+ * @returns {Promise<void>} 아이템을 삭제하면 아무 값도 반환하지 않아요.
56
+ * @example
57
+ *
58
+ * ### `my-key`에 저장된 아이템 삭제하기
59
+ * ```ts
60
+ * import { Storage } from '@apps-in-toss/framework';
61
+ *
62
+ * await Storage.removeItem('my-key');
63
+ * ```
64
+ */
65
+ removeItem: (args_0: string) => Promise<void>;
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
+ clearItems: (args_0: void) => Promise<void>;
82
+ };
40
83
 
41
- /**
42
- * 이벤트 브릿지 함수 생성
43
- * @param method 호출할 이벤트 핸들러 이름
44
- * @returns 이벤트 및 에러 핸들러를 포함한 객체를 받아 리스너 해제 함수를 반환하는 함수
45
- * @typeParam T: 이벤트 관련 추가 옵션 등의 타입
46
- * @example
47
- * // 위치 추적 이벤트 브릿지 생성
48
- * const startUpdatingLocation = createEventBridge<{ interval: number }>('startUpdatingLocation');
49
- *
50
- * // 사용 예시
51
- * const unsubscribe = startUpdatingLocation({
52
- * options: { interval: 1000 }, // 1초마다 위치 업데이트
53
- * onEvent: (location) => {
54
- * console.log('현재 위치:', location.latitude, location.longitude);
55
- * },
56
- * onError: (error) => {
57
- * console.error('위치 추적 오류:', error);
58
- * }
59
- * });
60
- *
61
- * // 위치 추적 중단
62
- * unsubscribe();
63
- */
64
- declare function createEventBridge<TOptions, TData>(method: string): (args: {
65
- onEvent: (data: TData) => void;
66
- onError: (error: Error) => void;
67
- options?: TOptions;
68
- }) => () => void;
84
+ declare function getSafeAreaInsets(): {
85
+ top: number;
86
+ bottom: number;
87
+ };
88
+
89
+ type BedrockEvent = {
90
+ backEvent: {
91
+ onEvent: () => void;
92
+ onError?: (error: Error) => void;
93
+ options?: void;
94
+ };
95
+ };
96
+ declare const bedrockEvent: {
97
+ addEventListener: <K extends "backEvent">(event: K, { onEvent, onError, options, }: {
98
+ onEvent: BedrockEvent[K]["onEvent"];
99
+ onError?: BedrockEvent[K]["onError"] | undefined;
100
+ options?: BedrockEvent[K]["options"] | undefined;
101
+ }) => () => void;
102
+ };
69
103
 
70
- export { createAsyncBridge, createConstantBridge, createEventBridge };
104
+ export { type BedrockEvent, Storage, bedrockEvent, getSafeAreaInsets };
package/dist-web/index.js CHANGED
@@ -1,144 +1,104 @@
1
1
  export * from './bridge.js'
2
2
 
3
- // src-web/nativeWindow.ts
4
- var NativeWindow = class {
5
- get _window() {
6
- return window;
7
- }
3
+ // src-web/index.ts
4
+ export * from "@apps-in-toss/bridge-core";
5
+
6
+ // src-web/storage.ts
7
+ import { createAsyncBridge } from "@apps-in-toss/bridge-core";
8
+ var Storage = {
8
9
  /**
9
- * ReactNativeWebView를 이용해 메시지를 전송합니다.
10
- * @param message 전송할 메시지(JSON 문자열)
10
+ * @public
11
+ * @category 저장소
12
+ * @name getItem
13
+ * @description 모바일 앱의 로컬 저장소에서 문자열 데이터를 가져와요. 주로 앱이 종료되었다가 다시 시작해도 데이터가 유지되어야 하는 경우에 사용해요.
14
+ * @param {string} key - 가져올 아이템의 키를 입력해요.
15
+ * @returns {Promise<string | null>} 지정한 키에 저장된 문자열 값을 반환해요. 값이 없으면 `null`을 반환해요.
11
16
  * @example
12
- * const nativeWindow = new NativeWindow();
13
- * nativeWindow.postMessage({ type: 'method', functionName: 'getDeviceId', eventId: '123', args: [] });
17
+ *
18
+ * ### `my-key`에 저장된 아이템 가져오기
19
+ * ```ts
20
+ * const value = await Storage.getItem('my-key');
21
+ * console.log(value); // 'value'
22
+ * ```
14
23
  */
15
- postMessage(message) {
16
- const webView = this._window.ReactNativeWebView;
17
- if (!webView) {
18
- throw new Error("ReactNativeWebView is not available in browser environment");
19
- }
20
- webView.postMessage(JSON.stringify(message));
21
- }
24
+ getItem: createAsyncBridge("getStorageItem"),
22
25
  /**
23
- * __BEDROCK_NATIVE_EMITTER를 이용해 이벤트 리스너를 등록합니다.
24
- * @param event 이벤트 이름
25
- * @param callback 데이터가 도착했을 때 호출되는 콜백
26
- * @returns 리스너 해제 함수
26
+ * @public
27
+ * @category 저장소
28
+ * @name setItem
29
+ * @description 모바일 앱의 로컬 저장소에 문자열 데이터를 저장해요. 주로 앱이 종료되었다가 다시 시작해도 데이터가 유지되어야 하는 경우에 사용해요.
30
+ * @param {string} key - 저장할 아이템의 키를 입력해요.
31
+ * @param {string} value - 저장할 아이템의 값을 입력해요.
32
+ * @returns {Promise<void>} 아이템을 성공적으로 저장하면 아무 값도 반환하지 않아요.
27
33
  * @example
28
- * const nativeWindow = new NativeWindow();
29
- * const unsubscribe = nativeWindow.on('deviceInfo', (data) => {
30
- * console.log('Device info received:', data);
31
- * });
32
34
  *
33
- * // 리스너 해제
34
- * unsubscribe();
35
+ * ### `my-key`에 아이템 저장하기
36
+ * ```ts
37
+ * import { Storage } from '@apps-in-toss/framework';
38
+ *
39
+ * await Storage.setItem('my-key', 'value');
40
+ * ```
35
41
  */
36
- on(event, callback) {
37
- const emitter = this._window.__BEDROCK_NATIVE_EMITTER;
38
- if (!emitter) {
39
- throw new Error("__BEDROCK_NATIVE_EMITTER is not available");
40
- }
41
- return emitter.on(event, callback);
42
- }
42
+ setItem: createAsyncBridge("setStorageItem"),
43
43
  /**
44
- * __CONSTANT_HANDLER_MAP에 등록된 상수 값을 반환합니다.
45
- * @param method 상수 핸들러 이름
46
- * @returns 상수 값
44
+ * @public
45
+ * @category 저장소
46
+ * @name removeItem
47
+ * @description 모바일 앱의 로컬 저장소에서 특정 키에 해당하는 아이템을 삭제해요.
48
+ * @param {string} key - 삭제할 아이템의 키를 입력해요.
49
+ * @returns {Promise<void>} 아이템을 삭제하면 아무 값도 반환하지 않아요.
47
50
  * @example
48
- * const nativeWindow = new NativeWindow();
49
- * const deviceId = nativeWindow.getConstant('getDeviceId');
50
- * console.log('Device ID:', deviceId);
51
+ *
52
+ * ### `my-key`에 저장된 아이템 삭제하기
53
+ * ```ts
54
+ * import { Storage } from '@apps-in-toss/framework';
55
+ *
56
+ * await Storage.removeItem('my-key');
57
+ * ```
51
58
  */
52
- getConstant(method) {
53
- const constantHandlerMap = this._window.__CONSTANT_HANDLER_MAP;
54
- if (constantHandlerMap && method in constantHandlerMap) {
55
- return constantHandlerMap[method];
56
- }
57
- throw new Error(`${method} is not a constant handler`);
58
- }
59
- };
60
- var nativeWindow = new NativeWindow();
61
- var createEventId = () => Math.random().toString(36).substring(2, 15);
62
- var deserializeError = (value) => {
63
- if (value && value.__isError) {
64
- const err = new Error(value.message);
65
- err.name = value.name;
66
- err.stack = value.stack;
67
- return err;
68
- }
69
- return value;
59
+ removeItem: createAsyncBridge("removeStorageItem"),
60
+ /**
61
+ * @public
62
+ * @category 저장소
63
+ * @name clearItems
64
+ * @description 모바일 앱의 로컬 저장소의 모든 아이템을 삭제해요.
65
+ * @returns {Promise<void>} 아이템을 삭제하면 아무 값도 반환하지 않고 저장소가 초기화돼요.
66
+ * @example
67
+ *
68
+ * ### 저장소 초기화하기
69
+ * ```ts
70
+ * import { Storage } from '@apps-in-toss/framework';
71
+ *
72
+ * await Storage.clearItems();
73
+ * ```
74
+ */
75
+ clearItems: createAsyncBridge("clearItems")
70
76
  };
71
77
 
72
- // src-web/createAsyncBridge.ts
73
- function createAsyncBridge(method) {
74
- return (args) => {
75
- const eventId = createEventId();
76
- const emitters = [];
77
- const unsubscribe = () => {
78
- for (const remove of emitters) {
79
- remove();
80
- }
81
- };
82
- return new Promise((resolve, reject) => {
83
- emitters.push(
84
- nativeWindow.on(`${method}/resolve/${eventId}`, (data) => {
85
- unsubscribe();
86
- resolve(data);
87
- })
88
- );
89
- emitters.push(
90
- nativeWindow.on(`${method}/reject/${eventId}`, (error) => {
91
- unsubscribe();
92
- reject(deserializeError(error));
93
- })
94
- );
95
- nativeWindow.postMessage({
96
- type: "method",
97
- functionName: method,
98
- eventId,
99
- args: [args]
100
- });
101
- });
102
- };
78
+ // src-web/getSafeAreaInsets.ts
79
+ import { createConstantBridge } from "@apps-in-toss/bridge-core";
80
+ var getSafeAreaBottom = createConstantBridge("getSafeAreaBottom");
81
+ var getSafeAreaTop = createConstantBridge("getSafeAreaTop");
82
+ function getSafeAreaInsets() {
83
+ return { top: getSafeAreaTop(), bottom: getSafeAreaBottom() };
103
84
  }
104
85
 
105
- // src-web/createConstantBridge.ts
106
- function createConstantBridge(method) {
107
- return () => {
108
- return nativeWindow.getConstant(method);
109
- };
110
- }
111
-
112
- // src-web/createEventBridge.ts
113
- function createEventBridge(method) {
114
- return (args) => {
115
- const eventId = createEventId();
116
- const removes = [
117
- nativeWindow.on(`${method}/onEvent/${eventId}`, (data) => {
118
- args.onEvent(data);
119
- }),
120
- nativeWindow.on(`${method}/onError/${eventId}`, (error) => {
121
- args.onError(deserializeError(error));
122
- })
123
- ];
124
- nativeWindow.postMessage({
125
- type: "addEventListener",
126
- functionName: method,
127
- eventId,
128
- args: args.options
129
- });
130
- return () => {
131
- nativeWindow.postMessage({
132
- type: "removeEventListener",
133
- functionName: method,
134
- eventId
135
- });
136
- removes.forEach((remove) => remove());
137
- };
138
- };
139
- }
86
+ // src-web/bedrockEvent.ts
87
+ import { createEventBridge } from "@apps-in-toss/bridge-core";
88
+ var bedrockEvent = {
89
+ addEventListener: (event, {
90
+ onEvent,
91
+ onError,
92
+ options
93
+ }) => createEventBridge(event)({
94
+ onEvent,
95
+ onError: onError ?? (() => {
96
+ }),
97
+ options
98
+ })
99
+ };
140
100
  export {
141
- createAsyncBridge,
142
- createConstantBridge,
143
- createEventBridge
101
+ Storage,
102
+ bedrockEvent,
103
+ getSafeAreaInsets
144
104
  };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @public
3
+ * @kind function
4
+ * @category 화면 이동
5
+ *
6
+ * @name openURL
7
+ * @signature
8
+ * ```typescript
9
+ * function openURL(url: string): Promise<any>;
10
+ * ```
11
+ *
12
+ * @description
13
+ * 지정된 URL을 기기의 기본 브라우저나 관련 앱에서 열어요.
14
+ * 이 함수는 `react-native`의 [`Linking.openURL`](https://reactnative.dev/docs/0.72/linking#openurl) 메서드를 사용하여 URL을 열어요.
15
+ *
16
+ * @param {string} url 열고자 하는 URL 주소
17
+ * @returns {Promise<any>} URL이 성공적으로 열렸을 때 해결되는 Promise
18
+ *
19
+ * @example
20
+ *
21
+ * ### 외부 URL 열기
22
+ *
23
+ * ```tsx
24
+ * import { openURL } from '@apps-in-toss/web-framework';
25
+ *
26
+ *
27
+ * function Page() {
28
+ * const handlePress = () => {
29
+ * openURL('https://google.com');
30
+ * };
31
+ *
32
+ * return <input type="button" value="구글 웹사이트 열기" onClick={handlePress} />;
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function openURL(url: string): Promise<any>;
37
+
38
+ export {};
@@ -51,7 +51,7 @@ export interface Location {
51
51
  */
52
52
  timestamp: number;
53
53
  /**
54
- * @description 위치 정보를 나타내는 객체예요. 자세한 내용은 [LocationCoords](/reference/framework/Types/LocationCoords.html)을 참고해주세요.
54
+ * @description 위치 정보를 나타내는 객체예요. 자세한 내용은 [LocationCoords](/react-native/reference/framework/Types/LocationCoords.html)을 참고해주세요.
55
55
  */
56
56
  coords: LocationCoords;
57
57
  }
@@ -127,7 +127,7 @@ export interface UpdateLocationEventEmitter extends EventEmitterSchema<"updateLo
127
127
  * @param {number} [options.accuracy] 위치 정확도를 설정해요.
128
128
  * @param {number} [options.timeInterval] 위치 정보를 업데이트하는 최소 주기로, 단위는 밀리초(ms)예요. 이 값은 위치 업데이트가 발생하는 가장 짧은 간격을 설정하지만, 시스템이나 환경의 영향을 받아 지정한 주기보다 더 긴 간격으로 업데이트될 수 있어요.
129
129
  * @param {number} [options.distanceInterval] 위치 변경 거리를 미터(m) 단위로 설정해요.
130
- * @param {(location: Location) => void} [options.callback] 위치 정보가 변경될 때 호출되는 콜백 함수예요. 자세한 내용은 [Location](/reference/framework/Types/Location.html)을 참고해주세요.
130
+ * @param {(location: Location) => void} [options.callback] 위치 정보가 변경될 때 호출되는 콜백 함수예요. 자세한 내용은 [Location](/react-native/reference/framework/Types/Location.html)을 참고해주세요.
131
131
  *
132
132
  * @example
133
133
  * ### 위치 정보 변경 감지하기