react-native-bootpay-api 13.13.42 → 13.13.46
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/README.md +37 -0
- package/lib/Bootpay.js +4 -4
- package/lib/BootpayCommerce.js +14 -0
- package/lib/BootpayWidget.js +103 -0
- package/lib/CommerceTypes.js +1 -0
- package/lib/UserInfo.js +1 -1
- package/lib/WidgetTypes.js +1 -0
- package/lib/bootpayAnalytics.js +1 -1
- package/lib/index.js +1 -1
- package/package.json +40 -41
- package/react-native.config.js +1 -59
- package/src/Bootpay.tsx +20 -6
- package/src/BootpayCommerce.tsx +429 -0
- package/src/BootpayTypes.ts +19 -7
- package/src/BootpayWidget.tsx +1095 -0
- package/src/CommerceTypes.ts +123 -0
- package/src/UserInfo.ts +4 -1
- package/src/WidgetTypes.ts +110 -0
- package/src/__tests__/index.test.d.ts +1 -1
- package/src/__tests__/index.test.js +1 -1
- package/src/index.tsx +132 -2
package/README.md
CHANGED
|
@@ -321,6 +321,43 @@ const styles = StyleSheet.create({
|
|
|
321
321
|
```
|
|
322
322
|
|
|
323
323
|
|
|
324
|
+
## WebView 프리워밍 (iOS/Android)
|
|
325
|
+
|
|
326
|
+
WebView는 처음 생성 시 프로세스 초기화에 시간이 소요됩니다 (iOS: 3-7초, Android: 200-300ms).
|
|
327
|
+
Bootpay SDK는 **자동으로** 패키지 import 시 백그라운드에서 프로세스를 미리 초기화하여 첫 결제 화면 로딩 속도를 개선합니다.
|
|
328
|
+
|
|
329
|
+
### 자동 프리워밍
|
|
330
|
+
|
|
331
|
+
SDK import 시 자동으로 프리워밍이 수행됩니다. 개발자가 별도로 호출할 필요가 없습니다.
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
// 자동으로 warmUp이 수행됩니다
|
|
335
|
+
import { Bootpay } from 'react-native-bootpay-api';
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 메모리 관리 (선택사항)
|
|
339
|
+
|
|
340
|
+
메모리 부족 시 프리워밍된 리소스를 해제할 수 있습니다:
|
|
341
|
+
|
|
342
|
+
```typescript
|
|
343
|
+
import { releaseWarmUp } from 'react-native-bootpay-api';
|
|
344
|
+
|
|
345
|
+
// 메모리 정리가 필요할 때 (선택사항)
|
|
346
|
+
releaseWarmUp();
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### 효과
|
|
350
|
+
|
|
351
|
+
| 플랫폼 | 개선 효과 |
|
|
352
|
+
|--------|----------|
|
|
353
|
+
| iOS | WKWebView 프로세스 초기화 3-7초 단축 |
|
|
354
|
+
| Android | Chromium 엔진 초기화 200-300ms 단축 |
|
|
355
|
+
|
|
356
|
+
### 참고사항
|
|
357
|
+
|
|
358
|
+
- 프리워밍은 SDK import 시 자동으로 수행되므로 별도 설정이 필요 없습니다.
|
|
359
|
+
- 두 번째 결제부터는 ProcessPool/WebView 재사용으로 자동으로 빠릅니다.
|
|
360
|
+
|
|
324
361
|
## Documentation
|
|
325
362
|
|
|
326
363
|
[부트페이 개발매뉴얼](https://docs.bootpay.co.kr/?front=react-native&backend=nodejs)을 참조해주세요
|
package/lib/Bootpay.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Bootpay=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _possibleConstructorReturn2=_interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));var _getPrototypeOf2=_interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));var _inherits2=_interopRequireDefault(require("@babel/runtime/helpers/inherits"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeWebviewBootpay=_interopRequireDefault(require("react-native-webview-bootpay"));var _BootpayTypes=require("./BootpayTypes");var _lodash=require("lodash");var _UserInfo=_interopRequireDefault(require("./UserInfo"));var _jsxRuntime=require("react/jsx-runtime");var _jsxFileName="/Users/taesupyoon/bootpay/client/react-native/react-native
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.Bootpay=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _possibleConstructorReturn2=_interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));var _getPrototypeOf2=_interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));var _inherits2=_interopRequireDefault(require("@babel/runtime/helpers/inherits"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeWebviewBootpay=_interopRequireDefault(require("react-native-webview-bootpay"));var _BootpayTypes=require("./BootpayTypes");var _lodash=require("lodash");var _UserInfo=_interopRequireDefault(require("./UserInfo"));var _jsxRuntime=require("react/jsx-runtime");var _jsxFileName="/Users/taesupyoon/bootpay/client/react-native/bootpay-react-native/api/src/Bootpay.tsx";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t in e)"default"!==_t&&{}.hasOwnProperty.call(e,_t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t))&&(i.get||i.set)?o(f,_t,i):f[_t]=e[_t]);return f;})(e,t);}function _callSuper(t,o,e){return o=(0,_getPrototypeOf2.default)(o),(0,_possibleConstructorReturn2.default)(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],(0,_getPrototypeOf2.default)(t).constructor):o.apply(t,e));}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t;})();}var SDK_VERSION='13.13.4';var DEBUG_MODE=false;var Bootpay=exports.Bootpay=function(_Component){function Bootpay(props){var _this;(0,_classCallCheck2.default)(this,Bootpay);_this=_callSuper(this,Bootpay,[props]);_this.getMountJavascript=(0,_asyncToGenerator2.default)(function*(){return`
|
|
2
2
|
${_this.getSDKVersion()}
|
|
3
3
|
${_this.getEnvironmentMode()}
|
|
4
4
|
${_this.getBootpayPlatform()}
|
|
5
5
|
${_this.close()}
|
|
6
6
|
${yield _this.getAnalyticsData()}
|
|
7
|
-
`;});_this.state={visibility:false,script:'',firstLoad:false,showCloseButton:false,isShowProgress:false};_this.dismiss=function(){_this.setState({visibility:false});};_this.showProgressBar=function(isShow){_this.setState({isShowProgress:isShow});};_this.closeDismiss=function(){if(_this.props.onClose)_this.props.onClose();_this.dismiss();};_this.callJavaScript=function(script){var _this$webView$current;(_this$webView$current=_this.webView.current)==null
|
|
7
|
+
`;});_this.state={visibility:false,script:'',firstLoad:false,showCloseButton:false,isShowProgress:false};_this.dismiss=function(){_this.setState({visibility:false});};_this.showProgressBar=function(isShow){_this.setState({isShowProgress:isShow});};_this.closeDismiss=function(){if(_this.props.onClose)_this.props.onClose();_this.dismiss();};_this.callJavaScript=function(script){var _this$webView$current;(_this$webView$current=_this.webView.current)==null||_this$webView$current.injectJavaScript(`setTimeout(function() { ${script} }, 30);`);};_this.transactionConfirm=function(){var script=`
|
|
8
8
|
Bootpay.confirm()
|
|
9
9
|
.then(res => {
|
|
10
10
|
${_this.confirm()}
|
|
@@ -24,7 +24,7 @@ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault
|
|
|
24
24
|
${_this.error()}
|
|
25
25
|
${_this.cancel()}
|
|
26
26
|
});
|
|
27
|
-
`;};_this.getSDKVersion=function(){var os=_reactNative.Platform.OS;return`Bootpay.setVersion('${SDK_VERSION}', '${os}_react_native')`;};_this.getEnvironmentMode=function(){return DEBUG_MODE?"Bootpay.setEnvironmentMode('development');":'';};_this.getBootpayPlatform=function(){return _reactNative.Platform.OS==='ios'?"Bootpay.setDevice('IOS');":"Bootpay.setDevice('ANDROID');";};_this.removePaymentWindow=function(){_this.dismiss();};_this.getAnalyticsData=(0,_asyncToGenerator2.default)(function*(){var uuid=yield _UserInfo.default.getBootpayUUID();var bootpaySK=yield _UserInfo.default.getBootpaySK();var bootLastTime=yield _UserInfo.default.getBootpayLastTime();var elaspedTime=Date.now()-bootLastTime;console.log(uuid,bootpaySK,bootLastTime);return`window.Bootpay.$analytics.setAnalyticsData({uuid:'${uuid}',sk:'${bootpaySK}',time:${elaspedTime}});`;});_this.requestPayment=function(){var _ref4=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){_this.bootpayRequest(payload,items,user,extra,'requestPayment');});return function(_x2,_x3,_x4,_x5){return _ref4.apply(this,arguments);};}();_this.requestSubscription=function(){var _ref5=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){_this.bootpayRequest(payload,items,user,extra,'requestSubscription');});return function(_x6,_x7,_x8,_x9){return _ref5.apply(this,arguments);};}();_this.requestAuthentication=function(){var _ref6=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){_this.bootpayRequest(payload,items,user,extra,'requestAuthentication');});return function(_x10,_x11
|
|
27
|
+
`;};_this.getSDKVersion=function(){var os=_reactNative.Platform.OS;return`Bootpay.setVersion('${SDK_VERSION}', '${os}_react_native')`;};_this.getEnvironmentMode=function(){return DEBUG_MODE?"Bootpay.setEnvironmentMode('development');":'';};_this.getBootpayPlatform=function(){return _reactNative.Platform.OS==='ios'?"Bootpay.setDevice('IOS');":"Bootpay.setDevice('ANDROID');";};_this.removePaymentWindow=function(){_this.dismiss();};_this.getAnalyticsData=(0,_asyncToGenerator2.default)(function*(){var uuid=yield _UserInfo.default.getBootpayUUID();var bootpaySK=yield _UserInfo.default.getBootpaySK();var bootLastTime=yield _UserInfo.default.getBootpayLastTime();var elaspedTime=Date.now()-bootLastTime;if(DEBUG_MODE)console.log('analytics:',uuid,bootpaySK,bootLastTime);return`window.Bootpay.$analytics.setAnalyticsData({uuid:'${uuid}',sk:'${bootpaySK}',time:${elaspedTime}});`;});_this.requestPayment=function(){var _ref4=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){_this.bootpayRequest(payload,items,user,extra,'requestPayment');});return function(_x2,_x3,_x4,_x5){return _ref4.apply(this,arguments);};}();_this.requestSubscription=function(){var _ref5=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){_this.bootpayRequest(payload,items,user,extra,'requestSubscription');});return function(_x6,_x7,_x8,_x9){return _ref5.apply(this,arguments);};}();_this.requestAuthentication=function(){var _ref6=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){_this.bootpayRequest(payload,items,user,extra,'requestAuthentication');});return function(_x0,_x1,_x10,_x11){return _ref6.apply(this,arguments);};}();_this.bootpayRequest=function(){var _ref7=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra,requestMethod){payload.application_id=_reactNative.Platform.OS==='ios'?_this.props.ios_application_id:_this.props.android_application_id;payload.items=items;payload.user=user;payload.user=Object.assign(new _BootpayTypes.User(),user);payload.extra=Object.assign(new _BootpayTypes.Extra(),extra);_this.payload=payload;_this.setState({visibility:true,script:`
|
|
28
28
|
${yield _this.getMountJavascript()}
|
|
29
29
|
${_this.generateScript(payload,requestMethod)}
|
|
30
|
-
`,firstLoad:false,showCloseButton:extra.show_close_button||false,spinner:false});_UserInfo.default.updateInfo();});return function(_x14,_x15,_x16
|
|
30
|
+
`,firstLoad:false,showCloseButton:extra.show_close_button||false,spinner:false});_UserInfo.default.updateInfo();});return function(_x12,_x13,_x14,_x15,_x16){return _ref7.apply(this,arguments);};}();_this.webView=_react.default.createRef();return _this;}(0,_inherits2.default)(Bootpay,_Component);return(0,_createClass2.default)(Bootpay,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.setState({visibility:false,firstLoad:false,showCloseButton:false});_UserInfo.default.setBootpayLastTime(Date.now());}},{key:"componentDidMount",value:function componentDidMount(){this.closeDismiss=(0,_lodash.debounce)(this.closeDismiss,30);}},{key:"render",value:function render(){var _this2=this;return(0,_jsxRuntime.jsx)(_reactNative.Modal,{animationType:"slide",transparent:false,visible:this.state.visibility,onRequestClose:this.closeDismiss,children:(0,_jsxRuntime.jsxs)(_reactNative.SafeAreaView,{style:{flex:1},children:[this.state.showCloseButton&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:this.closeDismiss,children:(0,_jsxRuntime.jsx)(_reactNative.Image,{style:styles.overlay,source:require('../images/close.png')})}),(0,_jsxRuntime.jsx)(_reactNativeWebviewBootpay.default,{ref:this.webView,originWhitelist:['*'],source:{uri:'https://webview.bootpay.co.kr/5.2.2'},injectedJavaScript:this.state.script,javaScriptEnabled:true,javaScriptCanOpenWindowsAutomatically:true,useSharedProcessPool:true,sharedCookiesEnabled:true,onMessage:this.onMessage,onError:function onError(syntheticEvent){var nativeEvent=syntheticEvent.nativeEvent;if(nativeEvent.code===3){_this2.showProgressBar(false);if(_this2.props.onError)_this2.props.onError({event:'error',code:nativeEvent.code,message:nativeEvent.description});_this2.closeDismiss();}}})]})});}}]);}(_react.Component);var styles=_reactNative.StyleSheet.create({overlay:{width:25,height:25,right:5,alignSelf:'flex-end'}});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.BootpayCommerce=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _possibleConstructorReturn2=_interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));var _getPrototypeOf2=_interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));var _inherits2=_interopRequireDefault(require("@babel/runtime/helpers/inherits"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeWebviewBootpay=_interopRequireDefault(require("react-native-webview-bootpay"));var _lodash=require("lodash");var _jsxRuntime=require("react/jsx-runtime");var _jsxFileName="/Users/taesupyoon/bootpay/client/react-native/bootpay-react-native/api/src/BootpayCommerce.tsx";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t in e)"default"!==_t&&{}.hasOwnProperty.call(e,_t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t))&&(i.get||i.set)?o(f,_t,i):f[_t]=e[_t]);return f;})(e,t);}function _callSuper(t,o,e){return o=(0,_getPrototypeOf2.default)(o),(0,_possibleConstructorReturn2.default)(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],(0,_getPrototypeOf2.default)(t).constructor):o.apply(t,e));}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t;})();}var COMMERCE_URL='https://webview.bootpay.co.kr/commerce/1.0.5/index.html';var DEBUG_MODE=false;var BootpayCommerce=exports.BootpayCommerce=function(_Component){function BootpayCommerce(props){var _this;(0,_classCallCheck2.default)(this,BootpayCommerce);_this=_callSuper(this,BootpayCommerce,[props]);_this.isScriptInjected=false;_this.state={visibility:false,script:'',firstLoad:false,showCloseButton:true,isShowProgress:false};_this.dismiss=function(){_this.setState({visibility:false});};_this.showProgressBar=function(isShow){_this.setState({isShowProgress:isShow});};_this.closeDismiss=function(){_this.callJavaScript('BootpayCommerce.destroy();');if(_this.props.onClose)_this.props.onClose();_this.dismiss();};_this.callJavaScript=function(script){var _this$webView$current;(_this$webView$current=_this.webView.current)==null||_this$webView$current.injectJavaScript(`setTimeout(function() { ${script} }, 30);`);};_this.getEnvironmentMode=function(){return DEBUG_MODE?"BootpayCommerce.setEnvironmentMode('development');":'';};_this.generateCommerceScript=function(payload){var scripts=[];if(DEBUG_MODE){scripts.push('BootpayCommerce.setLogLevel(1);');}scripts.push("document.addEventListener('bootpayclose', function(e) { "+"window.BootpayRNWebView.postMessage('close'); "+'});');scripts.push('BootpayCommerce.requestCheckout(');scripts.push(payload.toJSONString());scripts.push(')');scripts.push('.then(function(res) {');scripts.push(' window.BootpayRNWebView.postMessage(JSON.stringify(res));');scripts.push('}).catch(function(err) {');scripts.push(" window.BootpayRNWebView.postMessage(JSON.stringify({event: 'error', data: err}));");scripts.push('});');return scripts.join('');};_this.getMountJavascript=function(){return`
|
|
2
|
+
${_this.getEnvironmentMode()}
|
|
3
|
+
`;};_this.removePaymentWindow=function(){_this.dismiss();};_this.requestCheckout=function(payload){_this.payload=payload;_this.isScriptInjected=false;_this.setState({visibility:true,script:`
|
|
4
|
+
${_this.getMountJavascript()}
|
|
5
|
+
${_this.generateCommerceScript(payload)}
|
|
6
|
+
`,firstLoad:false,showCloseButton:true,spinner:false});};_this.onLoadEnd=function(event){var url=event.nativeEvent.url;if(DEBUG_MODE){console.log('[BootpayCommerce] onLoadEnd URL:',url);}if(!_this.payload){if(DEBUG_MODE){console.log('[BootpayCommerce] No payload, skipping script injection');}return;}if(url.includes('webview.bootpay.co.kr/commerce')&&!_this.isScriptInjected){_this.isScriptInjected=true;if(DEBUG_MODE){console.log('[BootpayCommerce] Injecting JavaScript...');}var fullScript=`
|
|
7
|
+
try {
|
|
8
|
+
${_this.getMountJavascript()}
|
|
9
|
+
${_this.generateCommerceScript(_this.payload)}
|
|
10
|
+
} catch(e) {
|
|
11
|
+
console.error('[BootpayCommerce] Script error:', e);
|
|
12
|
+
window.BootpayRNWebView.postMessage(JSON.stringify({event: 'error', message: e.message}));
|
|
13
|
+
}
|
|
14
|
+
`;_this.callJavaScript(fullScript);}};_this.onShouldStartLoadWithRequest=function(request){var url=request.url;if(DEBUG_MODE){console.log('[BootpayCommerce] onShouldStartLoadWithRequest:',url);}if(url.includes('api.bootpay.co.kr/v2/callback')){if(DEBUG_MODE){console.log('[BootpayCommerce] Callback URL detected, handling...');}_this.handleCallbackURL(url);return false;}if(url.startsWith('about:blank')){return true;}if(!url.startsWith('http://')&&!url.startsWith('https://')){if(DEBUG_MODE){console.log('[BootpayCommerce] Non-http scheme, should open external app:',url);}return false;}return true;};_this.parseQueryString=function(urlString){var result={};var queryIndex=urlString.indexOf('?');if(queryIndex===-1)return result;var queryString=urlString.substring(queryIndex+1);var pairs=queryString.split('&');for(var pair of pairs){var eqIndex=pair.indexOf('=');if(eqIndex>0){var key=pair.substring(0,eqIndex);var value=pair.substring(eqIndex+1);try{result[key]=decodeURIComponent(value);}catch(_unused){result[key]=value;}}}return result;};_this.handleCallbackURL=function(urlString){try{var params=_this.parseQueryString(urlString);var data={};for(var _ref of Object.entries(params)){var _ref2=(0,_slicedToArray2.default)(_ref,2);var key=_ref2[0];var value=_ref2[1];if(key==='metadata'){try{data[key]=JSON.parse(value);}catch(_unused2){data[key]=value;}}else{data[key]=value;}}if(DEBUG_MODE){console.log('[BootpayCommerce] Callback data:',data);}var event=data.event||'';_this.showProgressBar(false);switch(event){case'done':if(_this.props.onDone){_this.props.onDone(data);}break;case'issued':if(_this.props.onIssued){_this.props.onIssued(data);}break;case'cancel':if(_this.props.onCancel){_this.props.onCancel(data);}break;case'error':if(_this.props.onError){_this.props.onError(data);}break;default:if(data.receipt_id){if(_this.props.onDone){_this.props.onDone(data);}}else{if(_this.props.onCancel){_this.props.onCancel(data);}}break;}_this.closeDismiss();}catch(error){console.error('[BootpayCommerce] Error parsing callback URL:',error);if(_this.props.onError){_this.props.onError({event:'error',message:'Failed to parse callback URL'});}_this.closeDismiss();}};_this.onMessage=function(){var _ref3=(0,_asyncToGenerator2.default)(function*(event){if(!event)return;try{var messageData=event.nativeEvent.data;if(messageData==='close'){_this.showProgressBar(false);_this.closeDismiss();return;}var data=typeof messageData==='string'?JSON.parse(messageData):messageData;var handleEvent=function handleEvent(_eventName,callback){_this.showProgressBar(false);if(callback)callback(data);_this.closeDismiss();};switch(data.event){case'cancel':handleEvent('cancel',_this.props.onCancel);break;case'error':handleEvent('error',_this.props.onError);break;case'done':handleEvent('done',_this.props.onDone);break;case'issued':handleEvent('issued',_this.props.onIssued);break;case'close':_this.showProgressBar(false);_this.closeDismiss();break;default:if(data.receipt_id){handleEvent('done',_this.props.onDone);}else{console.warn(`Unknown commerce event type: ${data.event}`);}break;}}catch(error){console.error('Error processing commerce message:',error);}});return function(_x){return _ref3.apply(this,arguments);};}();_this.webView=_react.default.createRef();return _this;}(0,_inherits2.default)(BootpayCommerce,_Component);return(0,_createClass2.default)(BootpayCommerce,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.setState({visibility:false,firstLoad:false,showCloseButton:true});}},{key:"componentDidMount",value:function componentDidMount(){this.closeDismiss=(0,_lodash.debounce)(this.closeDismiss,30);}},{key:"render",value:function render(){var _this2=this;return(0,_jsxRuntime.jsx)(_reactNative.Modal,{animationType:"slide",transparent:false,visible:this.state.visibility,onRequestClose:this.closeDismiss,children:(0,_jsxRuntime.jsxs)(_reactNative.SafeAreaView,{style:{flex:1},children:[this.state.showCloseButton&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:this.closeDismiss,children:(0,_jsxRuntime.jsx)(_reactNative.Image,{style:styles.overlay,source:require('../images/close.png')})}),(0,_jsxRuntime.jsx)(_reactNativeWebviewBootpay.default,{ref:this.webView,originWhitelist:['*'],source:{uri:COMMERCE_URL},javaScriptEnabled:true,javaScriptCanOpenWindowsAutomatically:true,useSharedProcessPool:true,sharedCookiesEnabled:true,onMessage:this.onMessage,onLoadEnd:this.onLoadEnd,onShouldStartLoadWithRequest:this.onShouldStartLoadWithRequest,onError:function onError(syntheticEvent){var nativeEvent=syntheticEvent.nativeEvent;if(nativeEvent.code===3){_this2.showProgressBar(false);if(_this2.props.onError)_this2.props.onError({event:'error',code:nativeEvent.code,message:nativeEvent.description});_this2.closeDismiss();}}})]})});}}]);}(_react.Component);var styles=_reactNative.StyleSheet.create({overlay:{width:25,height:25,right:5,alignSelf:'flex-end'}});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=exports.BootpayWidget=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _possibleConstructorReturn2=_interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));var _getPrototypeOf2=_interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));var _inherits2=_interopRequireDefault(require("@babel/runtime/helpers/inherits"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _reactNativeWebviewBootpay=_interopRequireDefault(require("react-native-webview-bootpay"));var _reactNativeGestureHandler=require("react-native-gesture-handler");var _BootpayTypes=require("./BootpayTypes");var _lodash=require("lodash");var _UserInfo=_interopRequireDefault(require("./UserInfo"));var _jsxRuntime=require("react/jsx-runtime");var _jsxFileName="/Users/taesupyoon/bootpay/client/react-native/bootpay-react-native/api/src/BootpayWidget.tsx";function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t in e)"default"!==_t&&{}.hasOwnProperty.call(e,_t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t))&&(i.get||i.set)?o(f,_t,i):f[_t]=e[_t]);return f;})(e,t);}function _callSuper(t,o,e){return o=(0,_getPrototypeOf2.default)(o),(0,_possibleConstructorReturn2.default)(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],(0,_getPrototypeOf2.default)(t).constructor):o.apply(t,e));}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t;})();}var SDK_VERSION='13.13.4';var DEBUG_MODE=false;var WIDGET_URL='https://webview.bootpay.co.kr/5.2.2/widget.html';var BootpayWidget=exports.BootpayWidget=function(_Component){function BootpayWidget(props){var _this;(0,_classCallCheck2.default)(this,BootpayWidget);_this=_callSuper(this,BootpayWidget,[props]);_this.isValidSwipe=false;_this.swipeStartX=0;_this.getBridgeHelperJS=function(){return`
|
|
2
|
+
window.bridgePost = function(message) {
|
|
3
|
+
// iOS WebKit MessageHandler
|
|
4
|
+
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.BootpayRNWebView) {
|
|
5
|
+
window.webkit.messageHandlers.BootpayRNWebView.postMessage(message);
|
|
6
|
+
}
|
|
7
|
+
// Android JavascriptInterface or WebMessageListener
|
|
8
|
+
else if (window.BootpayRNWebView && window.BootpayRNWebView.postMessage) {
|
|
9
|
+
window.BootpayRNWebView.postMessage(String(message));
|
|
10
|
+
}
|
|
11
|
+
// Fallback: ReactNativeWebView (기본 react-native-webview)
|
|
12
|
+
else if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {
|
|
13
|
+
window.ReactNativeWebView.postMessage(String(message));
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var bridgePost = window.bridgePost;
|
|
17
|
+
`;};_this.buildInitialScript=function(){return`
|
|
18
|
+
(function() {
|
|
19
|
+
console.log('[BootpayWidget JS] Initial script started');
|
|
20
|
+
|
|
21
|
+
// iOS/Android 브릿지 헬퍼 함수 정의 (전역으로 등록)
|
|
22
|
+
${_this.getBridgeHelperJS()}
|
|
23
|
+
|
|
24
|
+
// waitForBootpayWidget 함수 정의 (전역으로 등록)
|
|
25
|
+
${_this.getWaitForBootpayWidgetJS()}
|
|
26
|
+
|
|
27
|
+
// BootpayWidget이 준비되면 widgetReady 이벤트만 전송
|
|
28
|
+
// 이벤트 리스너는 renderWidget에서 등록됨 (Flutter 패턴)
|
|
29
|
+
waitForBootpayWidget(function() {
|
|
30
|
+
console.log('[BootpayWidget JS] BootpayWidget SDK loaded');
|
|
31
|
+
try {
|
|
32
|
+
window.bridgePost(JSON.stringify({event:'widgetReady'}));
|
|
33
|
+
console.log('[BootpayWidget JS] Sent widgetReady message');
|
|
34
|
+
} catch(e) {
|
|
35
|
+
console.error('[BootpayWidget JS] postMessage error:', e);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
})();
|
|
39
|
+
true;
|
|
40
|
+
`;};_this.setupBackHandler=function(){if(_reactNative.Platform.OS==='android'){_this.backHandler=_reactNative.BackHandler.addEventListener('hardwareBackPress',function(){if(_this.state.isFullScreen){_this.revertToWidget();return true;}return false;});}};_this.removeBackHandler=function(){if(_this.backHandler){_this.backHandler.remove();_this.backHandler=undefined;}};_this.goFullScreen=function(){console.log('[Fullscreen] >>> goFullScreen called');_this.setupBackHandler();_this.setState({isFullScreen:true,paymentResult:'NONE'});};_this.revertToWidget=function(){var shouldReload=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;console.log('[Fullscreen] <<< revertToWidget called, paymentResult:',_this.state.paymentResult,'shouldReload:',shouldReload);var paymentResult=_this.state.paymentResult;_this._widgetRendered=false;_this._isProcessingPayment=false;_this.removeBackHandler();if(shouldReload){console.log('[Fullscreen] reloading widget URL before collapse animation');_this.reloadWidget();}setTimeout(function(){_this.setState({isFullScreen:false,isReady:false});if(paymentResult==='NONE'){if(_this.props.onCancel){_this.props.onCancel({action:'BootpayCancel',status:-100,message:'사용자에 의한 취소'});}}_this.setState({paymentResult:'NONE'});},100);};_this.closeDismiss=function(){console.log('[Fullscreen] closeDismiss called');if(_this.state.isFullScreen){_this.revertToWidget();}if(_this.props.onClose){_this.props.onClose();}};_this.callJavaScript=function(script){var _this$webView$current;if(DEBUG_MODE){console.log('[BootpayWidget] callJavaScript:',script.substring(0,200));}(_this$webView$current=_this.webView.current)==null||_this$webView$current.injectJavaScript(`setTimeout(function() { ${script} }, 30); true;`);};_this.reloadWidget=function(){console.log('[BootpayWidget] reloadWidget called');_this._widgetRendered=false;_this.setState({isReady:false});_this.callJavaScript(`window.location.href = '${WIDGET_URL}';`);};_this.updateWidget=function(payload){var refresh=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;_this.payload=payload;_this.callJavaScript(`BootpayWidget.update(${JSON.stringify(payload)}, ${refresh});`);};_this._widgetRendered=false;_this.renderWidget=function(payload){if(_this._widgetRendered){if(DEBUG_MODE){console.log('[BootpayWidget] renderWidget ignored - already rendered');}return;}if(DEBUG_MODE){console.log('[BootpayWidget] ===== renderWidget called =====');console.log('[BootpayWidget] isReady:',_this.state.isReady);console.log('[BootpayWidget] payload:',JSON.stringify(payload).substring(0,200));}_this.payload=payload;payload.application_id=_reactNative.Platform.OS==='ios'?_this.props.ios_application_id:_this.props.android_application_id;_UserInfo.default.updateInfo();if(_this.state.isReady){if(DEBUG_MODE){console.log('[BootpayWidget] isReady=true, injecting render script');console.log('[BootpayWidget] payload.application_id:',payload.application_id);console.log('[BootpayWidget] Full payload:',JSON.stringify(payload));}_this._widgetRendered=true;_this.runDeviceSetup();var renderScript=_this.getRenderWidgetScript();if(DEBUG_MODE){console.log('[BootpayWidget] Render script:',renderScript);}_this.callJavaScript(renderScript);}else{if(DEBUG_MODE){console.log('[BootpayWidget] isReady=false, will render on next onLoadEnd');console.log('[BootpayWidget] payload.application_id:',payload.application_id);console.log('[BootpayWidget] Full payload:',JSON.stringify(payload));}}};_this.runDeviceSetup=function(){if(DEBUG_MODE){console.log('[BootpayWidget] runDeviceSetup - calling setDevice/setVersion');}_this.callJavaScript(_this.getBootpayPlatform());_this.callJavaScript(_this.getSDKVersion());};_this.getRenderWidgetScript=function(){var widgetPayload=_this.getWidgetPayloadForRender();var payloadJson=JSON.stringify(widgetPayload);return`
|
|
41
|
+
// Flutter waitForBootpayWidget과 동일
|
|
42
|
+
${_this.getWaitForBootpayWidgetJS()}
|
|
43
|
+
|
|
44
|
+
// Flutter bridgeHelper와 동일
|
|
45
|
+
${_this.getBridgeHelperJS()}
|
|
46
|
+
|
|
47
|
+
console.log('[WebView JS] renderWidget script started');
|
|
48
|
+
waitForBootpayWidget(function() {
|
|
49
|
+
console.log('[WebView JS] waitForBootpayWidget callback');
|
|
50
|
+
|
|
51
|
+
// 이벤트 리스너 중복 등록 방지
|
|
52
|
+
// 주의: readyWatch는 여기서 등록하지 않음 (무한 루프 방지)
|
|
53
|
+
// widgetReady는 buildInitialScript에서 한 번만 전송됨
|
|
54
|
+
if (!window._bootpayListenersRegistered) {
|
|
55
|
+
window._bootpayListenersRegistered = true;
|
|
56
|
+
console.log('[WebView JS] Registering event listeners');
|
|
57
|
+
${_this.resizeWatch()}
|
|
58
|
+
${_this.changeMethodWatch()}
|
|
59
|
+
${_this.changeTermsWatch()}
|
|
60
|
+
${_this.closeEventHandler()}
|
|
61
|
+
console.log('[WebView JS] Event listeners registered');
|
|
62
|
+
} else {
|
|
63
|
+
console.log('[WebView JS] Event listeners already registered, skipping');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.log('[WebView JS] Calling BootpayWidget.render');
|
|
67
|
+
|
|
68
|
+
// BootpayWidget.render 호출
|
|
69
|
+
BootpayWidget.render('#bootpay-widget', ${payloadJson});
|
|
70
|
+
console.log('[WebView JS] BootpayWidget.render called');
|
|
71
|
+
});
|
|
72
|
+
`;};_this.requestPayment=function(){var _ref=(0,_asyncToGenerator2.default)(function*(payload,items,user,extra){console.log('[Fullscreen] requestPayment called');if(payload){payload.application_id=_reactNative.Platform.OS==='ios'?_this.props.ios_application_id:_this.props.android_application_id;if(items)payload.items=items;if(user)payload.user=Object.assign(new _BootpayTypes.User(),user);if(extra)payload.extra=Object.assign(new _BootpayTypes.Extra(),extra);}var payloadToUse=payload||_this.payload;_this._isProcessingPayment=true;_this.goFullScreen();setTimeout(function(){_this.executeRequestPayment(payloadToUse);},400);});return function(_x,_x2,_x3,_x4){return _ref.apply(this,arguments);};}();_this.executeRequestPayment=function(payload){if(!payload){console.log('[Fullscreen] executeRequestPayment - payload is null');return;}console.log('[Fullscreen] executeRequestPayment called');_this.callJavaScript(_this.getBootpayPlatform());_this.callJavaScript(_this.getSDKVersion());var requestScript=`
|
|
73
|
+
${_this.getBridgeHelperJS()}
|
|
74
|
+
BootpayWidget.requestPayment(${JSON.stringify(_this.getRequestPaymentPayload(payload))})
|
|
75
|
+
.then(function(res) {
|
|
76
|
+
console.log('[BootpayWidget] requestPayment response:', res);
|
|
77
|
+
${_this.confirmEventHandler()}
|
|
78
|
+
${_this.issuedEventHandler()}
|
|
79
|
+
${_this.doneEventHandler()}
|
|
80
|
+
}, function(res) {
|
|
81
|
+
console.log('[BootpayWidget] requestPayment error:', res);
|
|
82
|
+
${_this.errorEventHandler()}
|
|
83
|
+
${_this.cancelEventHandler()}
|
|
84
|
+
});
|
|
85
|
+
`;_this.callJavaScript(requestScript);};_this.getRequestPaymentPayload=function(payload){var result={};if('order_name'in payload&&payload.order_name)result.order_name=payload.order_name;if('order_id'in payload&&payload.order_id)result.order_id=payload.order_id;if('metadata'in payload&&payload.metadata)result.metadata=payload.metadata;var extra={};var payloadExtra='extra'in payload?payload.extra:undefined;if(payloadExtra){if('app_scheme'in payloadExtra&&payloadExtra.app_scheme)extra.app_scheme=payloadExtra.app_scheme;extra.show_close_button='show_close_button'in payloadExtra?payloadExtra.show_close_button:false;extra.display_success_result='display_success_result'in payloadExtra?payloadExtra.display_success_result:false;extra.display_error_result='display_error_result'in payloadExtra?payloadExtra.display_error_result:true;if('separately_confirmed'in payloadExtra&&payloadExtra.separately_confirmed){extra.separately_confirmed=true;}}extra.redirect_url=payloadExtra&&'redirect_url'in payloadExtra&&payloadExtra.redirect_url?payloadExtra.redirect_url:'https://api.bootpay.co.kr/v2/callback';extra.use_bootpay_inapp_sdk=payloadExtra&&'use_bootpay_inapp_sdk'in payloadExtra?payloadExtra.use_bootpay_inapp_sdk:true;result.extra=extra;if('user'in payload&&payload.user){var user={};if(payload.user.id)user.id=payload.user.id;if(payload.user.username)user.username=payload.user.username;if(payload.user.email)user.email=payload.user.email;if(payload.user.phone)user.phone=payload.user.phone;if(Object.keys(user).length>0)result.user=user;}if('items'in payload&&payload.items&&payload.items.length>0){result.items=payload.items;}return result;};_this._isProcessingPayment=false;_this._widgetData=null;_this.transactionConfirm=function(){var script=`
|
|
86
|
+
Bootpay.confirm()
|
|
87
|
+
.then(function(res) {
|
|
88
|
+
${_this.confirmEventHandler()}
|
|
89
|
+
${_this.issuedEventHandler()}
|
|
90
|
+
${_this.doneEventHandler()}
|
|
91
|
+
}, function(res) {
|
|
92
|
+
${_this.errorEventHandler()}
|
|
93
|
+
${_this.cancelEventHandler()}
|
|
94
|
+
});
|
|
95
|
+
`;_this.callJavaScript(script);};_this.confirmEventHandler=function(){return"if (res.event === 'confirm') { window.bridgePost(JSON.stringify(res)); }";};_this.doneEventHandler=function(){return"else if (res.event === 'done') { window.bridgePost(JSON.stringify(res)); }";};_this.issuedEventHandler=function(){return"else if (res.event === 'issued') { window.bridgePost(JSON.stringify(res)); }";};_this.errorEventHandler=function(){return"if (res.event === 'error') { window.bridgePost(JSON.stringify(res)); }";};_this.cancelEventHandler=function(){return"else if (res.event === 'cancel') { window.bridgePost(JSON.stringify(res)); }";};_this.closeEventHandler=function(){return"document.addEventListener('bootpayclose', function(e) { window.bridgePost(JSON.stringify({event:'close'})); });";};_this.readyWatch=function(){return"document.addEventListener('bootpay-widget-ready', function(e) { window.bridgePost(JSON.stringify({event:'widgetReady', detail: e.detail})); });";};_this.resizeWatch=function(){return"document.addEventListener('bootpay-widget-resize', function(e) { window.bridgePost(JSON.stringify({event:'widgetResize', detail: e.detail})); });";};_this.changeMethodWatch=function(){return"document.addEventListener('bootpay-widget-change-payment', function(e) { window.bridgePost(JSON.stringify({event:'widgetChangePayment', detail: e.detail})); });";};_this.changeTermsWatch=function(){return"document.addEventListener('bootpay-widget-change-terms', function(e) { window.bridgePost(JSON.stringify({event:'widgetChangeTerms', detail: e.detail})); });";};_this.getSDKVersion=function(){return`Bootpay.setVersion('${SDK_VERSION}', 'react_native');`;};_this.getEnvironmentMode=function(){return DEBUG_MODE?"BootpayWidget.setEnvironmentMode('development');":'';};_this.getBootpayPlatform=function(){return _reactNative.Platform.OS==='ios'?"Bootpay.setDevice('IOS');":"Bootpay.setDevice('ANDROID');";};_this.getWaitForBootpayWidgetJS=function(){return`
|
|
96
|
+
function waitForBootpayWidget(callback) {
|
|
97
|
+
if (typeof BootpayWidget !== 'undefined') {
|
|
98
|
+
callback();
|
|
99
|
+
} else {
|
|
100
|
+
setTimeout(function() { waitForBootpayWidget(callback); }, 50);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
`;};_this.getWidgetPayloadForRender=function(){if(!_this.payload)return{};var payload=_this.payload;var result={};if(payload.application_id)result.application_id=payload.application_id;if(payload.pg)result.pg=payload.pg;if(payload.method)result.method=payload.method;if(payload.methods&&payload.methods.length>0){result.method=payload.methods;}if(payload.order_name)result.order_name=payload.order_name;if(payload.price!==undefined)result.price=payload.price;if(payload.tax_free!==undefined)result.tax_free=payload.tax_free;if(payload.order_id)result.order_id=payload.order_id;if(payload.subscription_id)result.subscription_id=payload.subscription_id;if(payload.metadata)result.metadata=payload.metadata;if(payload.extra)result.extra=payload.extra;if(payload.widget_use_terms!==undefined){result.use_terms=payload.widget_use_terms;}if(payload.widget_sandbox!==undefined){result.sandbox=payload.widget_sandbox;}if(payload.widget_key){result.key=payload.widget_key;result.widget=1;result.use_bootpay_inapp_sdk=true;}return result;};_this.getRenderWidgetJS=function(){if(!_this.payload)return'';var widgetPayload=_this.getWidgetPayloadForRender();return`BootpayWidget.render('#bootpay-widget', ${JSON.stringify(widgetPayload)});`;};_this.onLoadEnd=(0,_asyncToGenerator2.default)(function*(){if(DEBUG_MODE){console.log('[BootpayWidget] ===== onLoadEnd called =====');console.log('[BootpayWidget] payload:',_this.payload?'set':'null');console.log('[BootpayWidget] isReady:',_this.state.isReady);console.log('[BootpayWidget] webView ref:',_this.webView.current?'exists':'null');}});_this.onMessage=function(){var _ref3=(0,_asyncToGenerator2.default)(function*(event){var _data$detail;if(DEBUG_MODE){var _event$nativeEvent;console.log('[BootpayWidget] ===== onMessage received =====');console.log('[BootpayWidget] raw data:',event==null||(_event$nativeEvent=event.nativeEvent)==null?void 0:_event$nativeEvent.data);}if(!event)return;try{var data=JSON.parse(event.nativeEvent.data);if(DEBUG_MODE){console.log('[BootpayWidget] parsed data:',JSON.stringify(data));}switch(data.event){case'widgetReady':_this.setState({isReady:true},function(){if(_this.props.onWidgetReady){_this.props.onWidgetReady();}});break;case'widgetResize':if((_data$detail=data.detail)!=null&&_data$detail.height){var height=parseFloat(data.detail.height);if(Math.abs(height-_this.state.widgetHeight)>1){if(DEBUG_MODE){console.log('[BootpayWidget] Height changed:',_this.state.widgetHeight,'->',height);}_this.setState({widgetHeight:height});if(!_this.state.isFullScreen){_reactNative.Animated.timing(_this.animatedHeight,{toValue:height,duration:100,useNativeDriver:false}).start();}if(_this.props.onWidgetResize){_this.props.onWidgetResize(height);}}}break;case'widgetChangePayment':{var widgetData=data.detail||null;_this._widgetData=widgetData;if(_this.props.onWidgetChangePayment){_this.props.onWidgetChangePayment(widgetData);}}break;case'widgetChangeTerms':{var _widgetData=data.detail||null;_this._widgetData=_widgetData;if(_this.props.onWidgetChangeTerms){_this.props.onWidgetChangeTerms(_widgetData);}}break;case'bootpayWidgetFullSizeScreen':_this.goFullScreen();break;case'bootpayWidgetRevertScreen':_this.revertToWidget();break;case'cancel':_this._isProcessingPayment=false;_this.setState({paymentResult:'CANCEL'});if(_this.props.onCancel){_this.props.onCancel(data);}_this.closeDismiss();break;case'error':_this._isProcessingPayment=false;_this.setState({paymentResult:'ERROR'});if(_this.props.onError){_this.props.onError(data);}_this.closeDismiss();break;case'issued':_this._isProcessingPayment=false;if(_this.props.onIssued){_this.props.onIssued(data);}_this.closeDismiss();break;case'confirm':if(_this.props.onConfirm&&_this.props.onConfirm(data)){_this.transactionConfirm();}break;case'done':_this._isProcessingPayment=false;_this.setState({paymentResult:'DONE'});if(_this.props.onDone){_this.props.onDone(data);}_this.closeDismiss();break;case'close':console.log('[Fullscreen] close event received, _isProcessingPayment:',_this._isProcessingPayment);if(_this._isProcessingPayment){break;}_this.closeDismiss();break;default:if(DEBUG_MODE){console.warn('Unknown event:',data.event);}break;}}catch(error){if(DEBUG_MODE){console.error('Error parsing message:',error);}}});return function(_x5){return _ref3.apply(this,arguments);};}();_this.renderWebView=function(){return(0,_jsxRuntime.jsx)(_reactNativeWebviewBootpay.default,{ref:_this.webView,originWhitelist:['*'],source:{uri:WIDGET_URL},javaScriptEnabled:true,javaScriptCanOpenWindowsAutomatically:true,useSharedProcessPool:true,sharedCookiesEnabled:true,injectedJavaScript:_this.initialScript,onLoadStart:function onLoadStart(){if(DEBUG_MODE){console.log('[BootpayWidget] WebView onLoadStart');}},onLoad:function onLoad(){if(DEBUG_MODE){console.log('[BootpayWidget] WebView onLoad');}},onLoadEnd:_this.onLoadEnd,onMessage:_this.onMessage,style:styles.webview,onError:function onError(syntheticEvent){var nativeEvent=syntheticEvent.nativeEvent;if(DEBUG_MODE){console.error('[BootpayWidget] WebView error:',nativeEvent);}if(_this.props.onError){_this.props.onError({event:'error',code:nativeEvent.code,message:nativeEvent.description});}}});};_this.webView=_react.default.createRef();var _Dimensions$get=_reactNative.Dimensions.get('window'),width=_Dimensions$get.width,_height=_Dimensions$get.height;var initialHeight=props.height||200;_this.animatedTop=new _reactNative.Animated.Value(0);_this.animatedLeft=new _reactNative.Animated.Value(0);_this.animatedWidth=new _reactNative.Animated.Value(width);_this.animatedHeight=new _reactNative.Animated.Value(initialHeight);_this.swipeAnimatedValue=new _reactNative.Animated.Value(0);_this.state={isFullScreen:false,widgetHeight:initialHeight,isReady:false,paymentResult:'NONE',screenWidth:width,screenHeight:_height,isSwiping:false};_this.initialScript=_this.buildInitialScript();_this.panGesture=_reactNativeGestureHandler.Gesture.Pan().activeOffsetX(10).failOffsetX(-10).failOffsetY([-20,20]).onBegin(function(event){_this.swipeStartX=event.x;_this.isValidSwipe=event.x<70;if(DEBUG_MODE){console.log('[Gesture] onBegin x:',event.x,'isValid:',_this.isValidSwipe);}}).onStart(function(){if(_this.isValidSwipe){_this.setState({isSwiping:true});}}).onUpdate(function(event){if(_this.isValidSwipe&&event.translationX>0){_this.swipeAnimatedValue.setValue(event.translationX);}}).onEnd(function(event){if(!_this.isValidSwipe){_this.setState({isSwiping:false});return;}var screenWidth=_this.state.screenWidth;var translationX=event.translationX||0;if(DEBUG_MODE){console.log('[Gesture] onEnd translationX:',translationX,'threshold:',screenWidth*0.4);}if(translationX>screenWidth*0.4){_this._widgetRendered=false;_this.callJavaScript(`window.location.href = '${WIDGET_URL}';`);_reactNative.Animated.timing(_this.swipeAnimatedValue,{toValue:screenWidth,duration:200,useNativeDriver:true}).start(function(){_this.swipeAnimatedValue.setValue(0);_this.setState({isSwiping:false,isFullScreen:false,isReady:false});_this._isProcessingPayment=false;_this.removeBackHandler();if(_this.props.onClose){_this.props.onClose();}});}else{_reactNative.Animated.spring(_this.swipeAnimatedValue,{toValue:0,useNativeDriver:true}).start(function(){_this.setState({isSwiping:false});});}_this.isValidSwipe=false;}).onFinalize(function(){if(_this.state.isSwiping){_reactNative.Animated.spring(_this.swipeAnimatedValue,{toValue:0,useNativeDriver:true}).start(function(){_this.setState({isSwiping:false});});}_this.isValidSwipe=false;});return _this;}(0,_inherits2.default)(BootpayWidget,_Component);return(0,_createClass2.default)(BootpayWidget,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;if(DEBUG_MODE){console.log('[BootpayWidget] ===== componentDidMount =====');console.log('[BootpayWidget] WIDGET_URL:',WIDGET_URL);}this.closeDismiss=(0,_lodash.debounce)(this.closeDismiss,30);var subscription=_reactNative.Dimensions.addEventListener('change',function(_ref4){var window=_ref4.window;_this2.setState({screenWidth:window.width,screenHeight:window.height});});this._dimensionsSubscription=subscription;}},{key:"componentWillUnmount",value:function componentWillUnmount(){var _this$_dimensionsSubs;this.removeBackHandler();(_this$_dimensionsSubs=this._dimensionsSubscription)==null||_this$_dimensionsSubs.remove();_UserInfo.default.setBootpayLastTime(Date.now());}},{key:"render",value:function render(){var _this$state=this.state,isFullScreen=_this$state.isFullScreen,screenWidth=_this$state.screenWidth,screenHeight=_this$state.screenHeight;var _this$props=this.props,style=_this$props.style,widgetTop=_this$props.widgetTop;return(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureHandlerRootView,{style:[styles.gestureRootBase,isFullScreen?styles.gestureRootFullScreen:{top:widgetTop||0,height:this.state.widgetHeight,zIndex:1}],children:(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[styles.container,style,{flex:1,width:screenWidth},isFullScreen&&{transform:[{translateX:this.swipeAnimatedValue}]}],children:[isFullScreen&&(0,_jsxRuntime.jsx)(_reactNative.SafeAreaView,{style:styles.fullScreenHeader}),this.renderWebView(),isFullScreen&&_reactNative.Platform.OS==='ios'&&(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:this.panGesture,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.swipeEdge})})]})});}}]);}(_react.Component);var styles=_reactNative.StyleSheet.create({gestureRootBase:{position:'absolute',left:0,right:0},gestureRootFullScreen:{top:0,bottom:0,zIndex:9999},container:{width:'100%',backgroundColor:'#fff',overflow:'hidden'},hidden:{height:0,opacity:0},fullScreenHeader:{backgroundColor:'#fff'},swipeEdge:{position:'absolute',left:0,top:0,bottom:0,width:70,backgroundColor:DEBUG_MODE?'rgba(255, 0, 0, 0.1)':'transparent'},webview:{flex:1,backgroundColor:DEBUG_MODE?'#f0f0f0':'transparent',borderWidth:DEBUG_MODE?1:0,borderColor:'blue'}});var _default=exports.default=BootpayWidget;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.CommerceUser=exports.CommerceProduct=exports.CommercePayload=exports.CommerceExtra=void 0;var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var CommerceUser=exports.CommerceUser=(0,_createClass2.default)(function CommerceUser(){(0,_classCallCheck2.default)(this,CommerceUser);this.membershipType='guest';});var CommerceProduct=exports.CommerceProduct=(0,_createClass2.default)(function CommerceProduct(){(0,_classCallCheck2.default)(this,CommerceProduct);this.productId='';this.duration=-1;this.quantity=1;});var CommerceExtra=exports.CommerceExtra=(0,_createClass2.default)(function CommerceExtra(){(0,_classCallCheck2.default)(this,CommerceExtra);this.separatelyConfirmed=false;this.createOrderImmediately=true;});var CommercePayload=exports.CommercePayload=function(){function CommercePayload(){(0,_classCallCheck2.default)(this,CommercePayload);this.clientKey='';this.price=0;this.useAutoLogin=false;this.useNotification=false;}return(0,_createClass2.default)(CommercePayload,[{key:"toJSON",value:function toJSON(){var _this$useAutoLogin,_this$useNotification;var json={client_key:this.clientKey};if(this.price>0)json.price=this.price;if(this.name)json.name=this.name;if(this.memo)json.memo=this.memo;if(this.redirectUrl)json.redirect_url=this.redirectUrl;if(this.usageApiUrl)json.usage_api_url=this.usageApiUrl;json.use_auto_login=(_this$useAutoLogin=this.useAutoLogin)!=null?_this$useAutoLogin:false;if(this.requestId)json.request_id=this.requestId;json.use_notification=(_this$useNotification=this.useNotification)!=null?_this$useNotification:false;if(this.user){var _this$user$membership;var userJson={membership_type:(_this$user$membership=this.user.membershipType)!=null?_this$user$membership:'guest'};if(this.user.userId)userJson.user_id=this.user.userId;if(this.user.name)userJson.name=this.user.name;if(this.user.phone)userJson.phone=this.user.phone;if(this.user.email)userJson.email=this.user.email;json.user=userJson;}if(this.products&&this.products.length>0){json.products=this.products.map(function(p){return{product_id:p.productId,duration:p.duration,quantity:p.quantity};});}if(this.metadataAny&&Object.keys(this.metadataAny).length>0){json.metadata=this.metadataAny;}else if(this.metadata&&Object.keys(this.metadata).length>0){json.metadata=this.metadata;}if(this.extra){var _this$extra$separatel,_this$extra$createOrd;var extraJson={separately_confirmed:(_this$extra$separatel=this.extra.separatelyConfirmed)!=null?_this$extra$separatel:false,create_order_immediately:(_this$extra$createOrd=this.extra.createOrderImmediately)!=null?_this$extra$createOrd:true};json.extra=extraJson;}return json;}},{key:"toJSONString",value:function toJSONString(){return JSON.stringify(this.toJSON());}}]);}();
|
package/lib/UserInfo.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _reactNativeDeviceInfo=_interopRequireDefault(require("react-native-device-info"));var Keychain=_interopRequireWildcard(require("react-native-keychain"));function
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _reactNativeDeviceInfo=_interopRequireDefault(require("react-native-device-info"));var Keychain=_interopRequireWildcard(require("react-native-keychain"));function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap(),n=new WeakMap();return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f);}for(var _t in e)"default"!==_t&&{}.hasOwnProperty.call(e,_t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t))&&(i.get||i.set)?o(f,_t,i):f[_t]=e[_t]);return f;})(e,t);}var UserInfo=exports.default=function(){function UserInfo(){(0,_classCallCheck2.default)(this,UserInfo);}return(0,_createClass2.default)(UserInfo,null,[{key:"setBootpayInfo",value:function(){var _setBootpayInfo=(0,_asyncToGenerator2.default)(function*(key,val){try{yield Keychain.setGenericPassword(key,String(val),{service:key,accessible:Keychain.ACCESSIBLE.WHEN_UNLOCKED});return val;}catch(error){console.error(`Error setting Bootpay info for key ${key}:`,error);if(error instanceof Error&&error.message.includes('null is not an object')){console.warn('Keychain configuration or capability might be missing.');}throw error;}});function setBootpayInfo(_x,_x2){return _setBootpayInfo.apply(this,arguments);}return setBootpayInfo;}()},{key:"getBootpayInfo",value:function(){var _getBootpayInfo=(0,_asyncToGenerator2.default)(function*(key,defaultVal){try{var credentials=yield Keychain.getGenericPassword({service:key});if(credentials){return credentials.password;}else{return defaultVal;}}catch(error){console.error(`Error getting Bootpay info for key ${key}:`,error);return defaultVal;}});function getBootpayInfo(_x3,_x4){return _getBootpayInfo.apply(this,arguments);}return getBootpayInfo;}()},{key:"getBootpayUUID",value:function(){var _getBootpayUUID=(0,_asyncToGenerator2.default)(function*(){var uuid=_reactNativeDeviceInfo.default.getUniqueId();yield UserInfo.setBootpayInfo('uuid',uuid);return uuid;});function getBootpayUUID(){return _getBootpayUUID.apply(this,arguments);}return getBootpayUUID;}()},{key:"getBootpaySK",value:function(){var _getBootpaySK=(0,_asyncToGenerator2.default)(function*(){return yield UserInfo.getBootpayInfo('bootpay_sk','');});function getBootpaySK(){return _getBootpaySK.apply(this,arguments);}return getBootpaySK;}()},{key:"setBootpaySK",value:function(){var _setBootpaySK=(0,_asyncToGenerator2.default)(function*(val){return yield UserInfo.setBootpayInfo('bootpay_sk',val);});function setBootpaySK(_x5){return _setBootpaySK.apply(this,arguments);}return setBootpaySK;}()},{key:"newBootpaySK",value:function(){var _newBootpaySK=(0,_asyncToGenerator2.default)(function*(uuid,time){return yield UserInfo.setBootpaySK(`${uuid}_${time}`);});function newBootpaySK(_x6,_x7){return _newBootpaySK.apply(this,arguments);}return newBootpaySK;}()},{key:"getBootpayLastTime",value:function(){var _getBootpayLastTime=(0,_asyncToGenerator2.default)(function*(){var lastTime=yield UserInfo.getBootpayInfo('bootpay_last_time','0');return parseInt(lastTime,10);});function getBootpayLastTime(){return _getBootpayLastTime.apply(this,arguments);}return getBootpayLastTime;}()},{key:"setBootpayLastTime",value:function(){var _setBootpayLastTime=(0,_asyncToGenerator2.default)(function*(val){return yield UserInfo.setBootpayInfo('bootpay_last_time',String(val));});function setBootpayLastTime(_x8){return _setBootpayLastTime.apply(this,arguments);}return setBootpayLastTime;}()},{key:"getBootpayUserId",value:function(){var _getBootpayUserId=(0,_asyncToGenerator2.default)(function*(){return yield UserInfo.getBootpayInfo('bootpay_user_id','');});function getBootpayUserId(){return _getBootpayUserId.apply(this,arguments);}return getBootpayUserId;}()},{key:"setBootpayUserId",value:function(){var _setBootpayUserId=(0,_asyncToGenerator2.default)(function*(val){return yield UserInfo.setBootpayInfo('bootpay_user_id',val);});function setBootpayUserId(_x9){return _setBootpayUserId.apply(this,arguments);}return setBootpayUserId;}()},{key:"updateInfo",value:function(){var _updateInfo=(0,_asyncToGenerator2.default)(function*(){var uuid=yield UserInfo.getBootpayUUID();var bootpaySK=yield UserInfo.getBootpaySK();var lastTime=yield UserInfo.getBootpayLastTime();var current=Date.now();if(!bootpaySK)yield UserInfo.newBootpaySK(uuid,current);var isExpired=current-lastTime>30*60*1000;if(isExpired)yield UserInfo.newBootpaySK(uuid,current);yield UserInfo.setBootpayLastTime(current);});function updateInfo(){return _updateInfo.apply(this,arguments);}return updateInfo;}()}]);}();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.WidgetPayloadExtra=exports.WidgetPayload=void 0;var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var WidgetPayload=exports.WidgetPayload=(0,_createClass2.default)(function WidgetPayload(){(0,_classCallCheck2.default)(this,WidgetPayload);this.widget_sandbox=false;this.widget_use_terms=false;});var WidgetPayloadExtra=exports.WidgetPayloadExtra=(0,_createClass2.default)(function WidgetPayloadExtra(){(0,_classCallCheck2.default)(this,WidgetPayloadExtra);this.separately_confirmed=true;this.display_success_result=false;this.display_error_result=false;this.use_bootpay_inapp_sdk=true;this.redirect_url='https://api.bootpay.co.kr/v2/callback';});
|
package/lib/bootpayAnalytics.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.userTrace=exports.pageTrace=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _reactNativeBase=_interopRequireDefault(require("react-native-base64"));var _reactNativeDeviceInfo=_interopRequireDefault(require("react-native-device-info"));var _reactNative=require("react-native");var getRandomKey=function getRandomKey(length){var text='';var keys='abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';for(var i=0;i<length;i++)text+=keys.charAt(Math.floor(Math.random()*keys.length));return text;};var getSessionKey=function(){var _ref=(0,_asyncToGenerator2.default)(function*(key,iv){var keyValue=_reactNativeBase.default.encode(key);var ivValue=_reactNativeBase.default.encode(iv);return`${keyValue}##${ivValue}`;});return function getSessionKey(_x,_x2){return _ref.apply(this,arguments);};}();var stringToHex=function stringToHex(str){var hex='';for(var i=0,l=str.length;i<l;i++){hex+=str.charCodeAt(i).toString(16);}return hex;};var userTrace=exports.userTrace=function(){var _ref2=(0,_asyncToGenerator2.default)(function*(applicationId,userId,phone,email,gender,birth,area){try{var payload={id:userId,ver:_reactNativeDeviceInfo.default.getVersion(),application_id:applicationId,phone:phone,email:email,gender:gender,birth:birth,area:area};var key=getRandomKey(32);var iv=getRandomKey(16);try{var data=yield _reactNative.NativeModules.Aes.encrypt(JSON.stringify(payload),stringToHex(key),stringToHex(iv));var response=yield fetch('https://analytics.bootpay.co.kr/login',{method:'POST',headers:{'Accept':'application/json','Content-Type':'application/json'},body:JSON.stringify({data:data,session_key:yield getSessionKey(key,iv)})});var json=yield response.json();return json;}catch(e){console.log(e);throw e;}}catch(error){console.error(error);throw error;}});return function userTrace(_x3,_x4,_x5,_x6,_x7,_x8,_x9){return _ref2.apply(this,arguments);};}();var pageTrace=exports.pageTrace=function(){var _ref3=(0,_asyncToGenerator2.default)(function*(applicationId,url,pageType,items){try{var payload={application_id:applicationId,url:url,page_type:pageType,items:items,referer:''};var key=getRandomKey(32);var iv=getRandomKey(16);try{var data=yield _reactNative.NativeModules.Aes.encrypt(JSON.stringify(payload),stringToHex(key),stringToHex(iv));var response=yield fetch('https://analytics.bootpay.co.kr/call',{method:'POST',headers:{'Accept':'application/json','Content-Type':'application/json'},body:JSON.stringify({data:data,session_key:yield getSessionKey(key,iv)})});var json=yield response.json();return json;}catch(e){console.log(e);throw e;}}catch(error){console.error(error);throw error;}});return function pageTrace(_x10,_x11
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.userTrace=exports.pageTrace=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _reactNativeBase=_interopRequireDefault(require("react-native-base64"));var _reactNativeDeviceInfo=_interopRequireDefault(require("react-native-device-info"));var _reactNative=require("react-native");var getRandomKey=function getRandomKey(length){var text='';var keys='abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';for(var i=0;i<length;i++)text+=keys.charAt(Math.floor(Math.random()*keys.length));return text;};var getSessionKey=function(){var _ref=(0,_asyncToGenerator2.default)(function*(key,iv){var keyValue=_reactNativeBase.default.encode(key);var ivValue=_reactNativeBase.default.encode(iv);return`${keyValue}##${ivValue}`;});return function getSessionKey(_x,_x2){return _ref.apply(this,arguments);};}();var stringToHex=function stringToHex(str){var hex='';for(var i=0,l=str.length;i<l;i++){hex+=str.charCodeAt(i).toString(16);}return hex;};var userTrace=exports.userTrace=function(){var _ref2=(0,_asyncToGenerator2.default)(function*(applicationId,userId,phone,email,gender,birth,area){try{var payload={id:userId,ver:_reactNativeDeviceInfo.default.getVersion(),application_id:applicationId,phone:phone,email:email,gender:gender,birth:birth,area:area};var key=getRandomKey(32);var iv=getRandomKey(16);try{var data=yield _reactNative.NativeModules.Aes.encrypt(JSON.stringify(payload),stringToHex(key),stringToHex(iv));var response=yield fetch('https://analytics.bootpay.co.kr/login',{method:'POST',headers:{'Accept':'application/json','Content-Type':'application/json'},body:JSON.stringify({data:data,session_key:yield getSessionKey(key,iv)})});var json=yield response.json();return json;}catch(e){console.log(e);throw e;}}catch(error){console.error(error);throw error;}});return function userTrace(_x3,_x4,_x5,_x6,_x7,_x8,_x9){return _ref2.apply(this,arguments);};}();var pageTrace=exports.pageTrace=function(){var _ref3=(0,_asyncToGenerator2.default)(function*(applicationId,url,pageType,items){try{var payload={application_id:applicationId,url:url,page_type:pageType,items:items,referer:''};var key=getRandomKey(32);var iv=getRandomKey(16);try{var data=yield _reactNative.NativeModules.Aes.encrypt(JSON.stringify(payload),stringToHex(key),stringToHex(iv));var response=yield fetch('https://analytics.bootpay.co.kr/call',{method:'POST',headers:{'Accept':'application/json','Content-Type':'application/json'},body:JSON.stringify({data:data,session_key:yield getSessionKey(key,iv)})});var json=yield response.json();return json;}catch(e){console.log(e);throw e;}}catch(error){console.error(error);throw error;}});return function pageTrace(_x0,_x1,_x10,_x11){return _ref3.apply(this,arguments);};}();
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Bootpay",{enumerable:true,get:function get(){return _Bootpay.Bootpay;}});Object.defineProperty(exports,"Extra",{enumerable:true,get:function get(){return _BootpayTypes.Extra;}});Object.defineProperty(exports,"Item",{enumerable:true,get:function get(){return _BootpayTypes.Item;}});Object.defineProperty(exports,"Payload",{enumerable:true,get:function get(){return _BootpayTypes.Payload;}});Object.defineProperty(exports,"User",{enumerable:true,get:function get(){return _BootpayTypes.User;}});var _Bootpay=require("./Bootpay");var _BootpayTypes=require("./BootpayTypes");
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Bootpay",{enumerable:true,get:function get(){return _Bootpay.Bootpay;}});Object.defineProperty(exports,"BootpayCommerce",{enumerable:true,get:function get(){return _BootpayCommerce.BootpayCommerce;}});Object.defineProperty(exports,"BootpayCommerceProps",{enumerable:true,get:function get(){return _CommerceTypes.BootpayCommerceProps;}});Object.defineProperty(exports,"BootpayEventData",{enumerable:true,get:function get(){return _BootpayTypes.BootpayEventData;}});Object.defineProperty(exports,"BootpayTypesProps",{enumerable:true,get:function get(){return _BootpayTypes.BootpayTypesProps;}});Object.defineProperty(exports,"BootpayWidget",{enumerable:true,get:function get(){return _BootpayWidget.BootpayWidget;}});Object.defineProperty(exports,"BootpayWidgetProps",{enumerable:true,get:function get(){return _WidgetTypes.BootpayWidgetProps;}});Object.defineProperty(exports,"CommerceEventData",{enumerable:true,get:function get(){return _CommerceTypes.CommerceEventData;}});Object.defineProperty(exports,"CommerceExtra",{enumerable:true,get:function get(){return _CommerceTypes.CommerceExtra;}});Object.defineProperty(exports,"CommercePayload",{enumerable:true,get:function get(){return _CommerceTypes.CommercePayload;}});Object.defineProperty(exports,"CommerceProduct",{enumerable:true,get:function get(){return _CommerceTypes.CommerceProduct;}});Object.defineProperty(exports,"CommerceUser",{enumerable:true,get:function get(){return _CommerceTypes.CommerceUser;}});Object.defineProperty(exports,"Extra",{enumerable:true,get:function get(){return _BootpayTypes.Extra;}});Object.defineProperty(exports,"Item",{enumerable:true,get:function get(){return _BootpayTypes.Item;}});Object.defineProperty(exports,"Payload",{enumerable:true,get:function get(){return _BootpayTypes.Payload;}});Object.defineProperty(exports,"User",{enumerable:true,get:function get(){return _BootpayTypes.User;}});Object.defineProperty(exports,"WidgetChangePaymentCallback",{enumerable:true,get:function get(){return _WidgetTypes.WidgetChangePaymentCallback;}});Object.defineProperty(exports,"WidgetChangeTermsCallback",{enumerable:true,get:function get(){return _WidgetTypes.WidgetChangeTermsCallback;}});Object.defineProperty(exports,"WidgetData",{enumerable:true,get:function get(){return _WidgetTypes.WidgetData;}});Object.defineProperty(exports,"WidgetExtra",{enumerable:true,get:function get(){return _WidgetTypes.WidgetExtra;}});Object.defineProperty(exports,"WidgetPayload",{enumerable:true,get:function get(){return _WidgetTypes.WidgetPayload;}});Object.defineProperty(exports,"WidgetPayloadExtra",{enumerable:true,get:function get(){return _WidgetTypes.WidgetPayloadExtra;}});Object.defineProperty(exports,"WidgetReadyCallback",{enumerable:true,get:function get(){return _WidgetTypes.WidgetReadyCallback;}});Object.defineProperty(exports,"WidgetResizeCallback",{enumerable:true,get:function get(){return _WidgetTypes.WidgetResizeCallback;}});Object.defineProperty(exports,"WidgetTerm",{enumerable:true,get:function get(){return _WidgetTypes.WidgetTerm;}});exports.warmUp=exports.releaseWarmUp=void 0;var _reactNative=require("react-native");var _Bootpay=require("./Bootpay");var _BootpayWidget=require("./BootpayWidget");var _BootpayCommerce=require("./BootpayCommerce");var _BootpayTypes=require("./BootpayTypes");var _WidgetTypes=require("./WidgetTypes");var _CommerceTypes=require("./CommerceTypes");var BPCWebViewModule=_reactNative.NativeModules.BPCWebViewModule;var _autoWarmUpCalled=false;var _autoWarmUp=function _autoWarmUp(){if(_autoWarmUpCalled)return;_autoWarmUpCalled=true;if(_reactNative.Platform.OS!=='ios'&&_reactNative.Platform.OS!=='android')return;try{if(BPCWebViewModule!=null&&BPCWebViewModule.warmUp){BPCWebViewModule.warmUp();if(__DEV__){console.log('[Bootpay] WebView auto warm-up initiated');}}}catch(e){}};var warmUp=exports.warmUp=function warmUp(){if(BPCWebViewModule!=null&&BPCWebViewModule.warmUp){BPCWebViewModule.warmUp();}};var releaseWarmUp=exports.releaseWarmUp=function releaseWarmUp(){if(BPCWebViewModule!=null&&BPCWebViewModule.releaseWarmUp){BPCWebViewModule.releaseWarmUp();}};_autoWarmUp();
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-bootpay-api",
|
|
3
|
-
"version": "13.13.
|
|
3
|
+
"version": "13.13.46",
|
|
4
4
|
"description": "React Native를 위한 bootpay 라이브러리 입니다.",
|
|
5
|
-
"main": "index.tsx",
|
|
5
|
+
"main": "index.tsx",
|
|
6
6
|
"main-internal": "src/index.tsx",
|
|
7
7
|
"react-native": "src/index.tsx",
|
|
8
8
|
"author": "bootpay <bootpay.co.kr@gmail.com>",
|
|
@@ -29,55 +29,55 @@
|
|
|
29
29
|
"rn-docs": {
|
|
30
30
|
"title": "bootpay",
|
|
31
31
|
"type": "bootpay"
|
|
32
|
-
},
|
|
32
|
+
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": "*",
|
|
35
35
|
"react-native": "*"
|
|
36
|
-
},
|
|
36
|
+
},
|
|
37
37
|
"dependencies": {
|
|
38
|
+
"@types/react-native-base64": "^0.2.2",
|
|
38
39
|
"escape-string-regexp": "^4.0.0",
|
|
39
40
|
"invariant": "2.2.4",
|
|
40
|
-
"react-native-device-info": "^14.0.4",
|
|
41
|
-
"react-native-keychain": "^10.0.0",
|
|
42
|
-
"@types/react-native-base64": "^0.2.2",
|
|
43
41
|
"react-native-aes-crypto": "^3.2.1",
|
|
44
|
-
"react-native-
|
|
42
|
+
"react-native-device-info": "^15.0.1",
|
|
43
|
+
"react-native-gesture-handler": "^2.20.0",
|
|
44
|
+
"react-native-keychain": "^10.0.0",
|
|
45
|
+
"react-native-webview-bootpay": "13.13.49"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
|
-
"@babel/cli": "^7.
|
|
48
|
-
"@babel/core": "^7.
|
|
49
|
-
"@babel/runtime": "^7.
|
|
50
|
-
"@callstack/react-native-visionos": "0.
|
|
51
|
-
"@react-native/babel-preset": "0.
|
|
52
|
-
"@react-native/eslint-config": "0.
|
|
53
|
-
"@react-native/metro-config": "0.
|
|
54
|
-
"@react-native/typescript-config": "0.
|
|
55
|
-
"@rnx-kit/metro-config": "
|
|
56
|
-
"@semantic-release/git": "
|
|
57
|
-
"@types/invariant": "^2.2.
|
|
58
|
-
"@types/jest": "^29.5.
|
|
59
|
-
"@types/
|
|
60
|
-
"@types/
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"react
|
|
67
|
-
"react-native
|
|
68
|
-
"react-native-
|
|
69
|
-
"react-native-windows": "0.
|
|
48
|
+
"@babel/cli": "^7.26.0",
|
|
49
|
+
"@babel/core": "^7.26.0",
|
|
50
|
+
"@babel/runtime": "^7.26.0",
|
|
51
|
+
"@callstack/react-native-visionos": "0.76.2",
|
|
52
|
+
"@react-native/babel-preset": "0.76.7",
|
|
53
|
+
"@react-native/eslint-config": "0.76.7",
|
|
54
|
+
"@react-native/metro-config": "0.76.7",
|
|
55
|
+
"@react-native/typescript-config": "0.76.7",
|
|
56
|
+
"@rnx-kit/metro-config": "2.2.0",
|
|
57
|
+
"@semantic-release/git": "10.0.1",
|
|
58
|
+
"@types/invariant": "^2.2.37",
|
|
59
|
+
"@types/jest": "^29.5.14",
|
|
60
|
+
"@types/lodash": "^4.17.14",
|
|
61
|
+
"@types/react": "18.3.18",
|
|
62
|
+
"@types/selenium-webdriver": "4.1.28",
|
|
63
|
+
"appium": "2.15.0",
|
|
64
|
+
"eslint": "8.57.1",
|
|
65
|
+
"jest": "^29.7.0",
|
|
66
|
+
"prettier": "3.4.2",
|
|
67
|
+
"react": "18.3.1",
|
|
68
|
+
"react-native": "0.76.7",
|
|
69
|
+
"react-native-macos": "0.76.7",
|
|
70
|
+
"react-native-windows": "0.76.7",
|
|
70
71
|
"selenium-appium": "1.0.2",
|
|
71
|
-
"selenium-webdriver": "4.
|
|
72
|
-
"semantic-release": "
|
|
73
|
-
"typescript": "5.
|
|
74
|
-
"winappdriver": "^0.0.7"
|
|
75
|
-
|
|
76
|
-
},
|
|
72
|
+
"selenium-webdriver": "4.27.0",
|
|
73
|
+
"semantic-release": "24.2.1",
|
|
74
|
+
"typescript": "5.6.3",
|
|
75
|
+
"winappdriver": "^0.0.7"
|
|
76
|
+
},
|
|
77
77
|
"repository": {
|
|
78
78
|
"type": "git",
|
|
79
|
-
"url":
|
|
80
|
-
},
|
|
79
|
+
"url": "https://github.com/bootpay/react-native-bootpay-api.git"
|
|
80
|
+
},
|
|
81
81
|
"files": [
|
|
82
82
|
"android",
|
|
83
83
|
"apple",
|
|
@@ -96,7 +96,6 @@
|
|
|
96
96
|
"@react-native-community/cli": "10.2.4",
|
|
97
97
|
"@react-native-community/cli-platform-android": "10.2.0",
|
|
98
98
|
"@react-native-community/cli-platform-ios": "10.2.4"
|
|
99
|
-
},
|
|
99
|
+
},
|
|
100
100
|
"packageManager": "yarn@1.22.19"
|
|
101
101
|
}
|
|
102
|
-
|
package/react-native.config.js
CHANGED
|
@@ -1,66 +1,8 @@
|
|
|
1
|
-
const project = (() => {
|
|
2
|
-
const path = require('path');
|
|
3
|
-
try {
|
|
4
|
-
const { configureProjects } = require('react-native-test-app');
|
|
5
|
-
return configureProjects({
|
|
6
|
-
android: {
|
|
7
|
-
sourceDir: path.join('example', 'android'),
|
|
8
|
-
},
|
|
9
|
-
ios: {
|
|
10
|
-
sourceDir: 'example/ios',
|
|
11
|
-
},
|
|
12
|
-
});
|
|
13
|
-
} catch (e) {
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
})();
|
|
17
|
-
|
|
18
1
|
module.exports = {
|
|
19
2
|
dependencies: {
|
|
20
3
|
// Help rn-cli find and autolink this library
|
|
21
4
|
'react-native-bootpay-api': {
|
|
22
5
|
root: __dirname,
|
|
23
6
|
},
|
|
24
|
-
},
|
|
25
|
-
...(project ? { project } : undefined),
|
|
7
|
+
},
|
|
26
8
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// const project = (() => {
|
|
31
|
-
// const fs = require('fs');
|
|
32
|
-
// const path = require('path');
|
|
33
|
-
// try {
|
|
34
|
-
// const {
|
|
35
|
-
// androidManifestPath,
|
|
36
|
-
// // iosProjectPath,
|
|
37
|
-
// windowsProjectPath,
|
|
38
|
-
// } = require('react-native-test-app');
|
|
39
|
-
// return {
|
|
40
|
-
// android: {
|
|
41
|
-
// sourceDir: path.join('example', 'android'),
|
|
42
|
-
// manifestPath: androidManifestPath(
|
|
43
|
-
// path.join(__dirname, 'example', 'android'),
|
|
44
|
-
// ),
|
|
45
|
-
// },
|
|
46
|
-
// ios: {
|
|
47
|
-
// sourceDir: 'example/ios',
|
|
48
|
-
// },
|
|
49
|
-
// // ios: {
|
|
50
|
-
// // project: iosProjectPath('example/ios'),
|
|
51
|
-
// // },
|
|
52
|
-
// };
|
|
53
|
-
// } catch (_) {
|
|
54
|
-
// return undefined;
|
|
55
|
-
// }
|
|
56
|
-
// })();
|
|
57
|
-
|
|
58
|
-
// module.exports = {
|
|
59
|
-
// dependencies: {
|
|
60
|
-
// // Help rn-cli find and autolink this library
|
|
61
|
-
// 'react-native-bootpay-api': {
|
|
62
|
-
// root: __dirname,
|
|
63
|
-
// },
|
|
64
|
-
// },
|
|
65
|
-
// ...(project ? { project } : undefined),
|
|
66
|
-
// };
|
package/src/Bootpay.tsx
CHANGED
|
@@ -8,7 +8,14 @@ import {
|
|
|
8
8
|
Platform,
|
|
9
9
|
} from 'react-native';
|
|
10
10
|
import WebView, { WebViewMessageEvent } from 'react-native-webview-bootpay';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
BootpayTypesProps,
|
|
13
|
+
BootpayEventData,
|
|
14
|
+
Payload,
|
|
15
|
+
Item,
|
|
16
|
+
User,
|
|
17
|
+
Extra,
|
|
18
|
+
} from './BootpayTypes';
|
|
12
19
|
import { debounce } from 'lodash';
|
|
13
20
|
import UserInfo from './UserInfo';
|
|
14
21
|
|
|
@@ -123,9 +130,13 @@ export class Bootpay extends Component<BootpayTypesProps> {
|
|
|
123
130
|
show_success = !!this.payload.extra?.display_success_result;
|
|
124
131
|
}
|
|
125
132
|
|
|
126
|
-
const handleEvent = (
|
|
133
|
+
const handleEvent = (
|
|
134
|
+
_eventName: string,
|
|
135
|
+
callback: ((data: BootpayEventData) => void) | undefined,
|
|
136
|
+
showResult: boolean
|
|
137
|
+
) => {
|
|
127
138
|
this.showProgressBar(false);
|
|
128
|
-
if (callback) callback(data);
|
|
139
|
+
if (callback) callback(data as BootpayEventData);
|
|
129
140
|
if (!showResult) this.closeDismiss();
|
|
130
141
|
};
|
|
131
142
|
|
|
@@ -190,7 +201,7 @@ export class Bootpay extends Component<BootpayTypesProps> {
|
|
|
190
201
|
: "Bootpay.setDevice('ANDROID');";
|
|
191
202
|
};
|
|
192
203
|
|
|
193
|
-
|
|
204
|
+
componentWillUnmount() {
|
|
194
205
|
this.setState({
|
|
195
206
|
visibility: false,
|
|
196
207
|
firstLoad: false,
|
|
@@ -217,7 +228,7 @@ export class Bootpay extends Component<BootpayTypesProps> {
|
|
|
217
228
|
|
|
218
229
|
const elaspedTime = Date.now() - bootLastTime;
|
|
219
230
|
|
|
220
|
-
console.log(uuid, bootpaySK, bootLastTime);
|
|
231
|
+
if (DEBUG_MODE) console.log('analytics:', uuid, bootpaySK, bootLastTime);
|
|
221
232
|
|
|
222
233
|
return `window.Bootpay.$analytics.setAnalyticsData({uuid:'${uuid}',sk:'${bootpaySK}',time:${elaspedTime}});`;
|
|
223
234
|
};
|
|
@@ -302,10 +313,12 @@ export class Bootpay extends Component<BootpayTypesProps> {
|
|
|
302
313
|
<WebView
|
|
303
314
|
ref={this.webView}
|
|
304
315
|
originWhitelist={['*']}
|
|
305
|
-
source={{ uri: 'https://webview.bootpay.co.kr/5.
|
|
316
|
+
source={{ uri: 'https://webview.bootpay.co.kr/5.2.2' }}
|
|
306
317
|
injectedJavaScript={this.state.script}
|
|
307
318
|
javaScriptEnabled
|
|
308
319
|
javaScriptCanOpenWindowsAutomatically
|
|
320
|
+
useSharedProcessPool={true}
|
|
321
|
+
sharedCookiesEnabled={true}
|
|
309
322
|
onMessage={this.onMessage}
|
|
310
323
|
onError={(syntheticEvent) => {
|
|
311
324
|
const { nativeEvent } = syntheticEvent;
|
|
@@ -313,6 +326,7 @@ export class Bootpay extends Component<BootpayTypesProps> {
|
|
|
313
326
|
this.showProgressBar(false);
|
|
314
327
|
if (this.props.onError)
|
|
315
328
|
this.props.onError({
|
|
329
|
+
event: 'error',
|
|
316
330
|
code: nativeEvent.code,
|
|
317
331
|
message: nativeEvent.description,
|
|
318
332
|
});
|