iamport-react-native 1.6.4 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -320
  3. package/android/build.gradle +114 -24
  4. package/android/gradle.properties +4 -0
  5. package/android/src/main/AndroidManifest.xml +1 -3
  6. package/android/src/main/java/com/iamportreactnative/IamportReactNativePackage.kt +17 -0
  7. package/android/src/main/java/com/iamportreactnative/IamportReactNativeViewManager.kt +20 -0
  8. package/iamport-react-native.podspec +19 -0
  9. package/ios/IamportReactNative-Bridging-Header.h +1 -0
  10. package/ios/IamportReactNative.xcodeproj/project.pbxproj +47 -20
  11. package/ios/IamportReactNativeViewManager.m +12 -0
  12. package/ios/IamportReactNativeViewManager.swift +32 -0
  13. package/lib/commonjs/components/Certification/index.js +154 -0
  14. package/lib/commonjs/components/Certification/index.js.map +1 -0
  15. package/lib/commonjs/components/ErrorOnParams/index.js +66 -0
  16. package/lib/commonjs/components/ErrorOnParams/index.js.map +1 -0
  17. package/lib/commonjs/components/Loading/index.js +50 -0
  18. package/lib/commonjs/components/Loading/index.js.map +1 -0
  19. package/lib/commonjs/components/Payment/index.js +288 -0
  20. package/lib/commonjs/components/Payment/index.js.map +1 -0
  21. package/lib/commonjs/constants/index.js +103 -0
  22. package/lib/commonjs/constants/index.js.map +1 -0
  23. package/{android/src/main/assets → lib/commonjs}/img/iamport-logo.png +0 -0
  24. package/lib/commonjs/index.js +36 -0
  25. package/lib/commonjs/index.js.map +1 -0
  26. package/lib/commonjs/styles.js +31 -0
  27. package/lib/commonjs/styles.js.map +1 -0
  28. package/lib/commonjs/utils/IamportUrl.js +334 -0
  29. package/lib/commonjs/utils/IamportUrl.js.map +1 -0
  30. package/lib/commonjs/utils/Validation.js +72 -0
  31. package/lib/commonjs/utils/Validation.js.map +1 -0
  32. package/lib/commonjs/utils/ValidationForPayment.js +143 -0
  33. package/lib/commonjs/utils/ValidationForPayment.js.map +1 -0
  34. package/lib/module/components/Certification/index.js +132 -0
  35. package/lib/module/components/Certification/index.js.map +1 -0
  36. package/lib/module/components/ErrorOnParams/index.js +55 -0
  37. package/lib/module/components/ErrorOnParams/index.js.map +1 -0
  38. package/lib/module/components/Loading/index.js +38 -0
  39. package/lib/module/components/Loading/index.js.map +1 -0
  40. package/lib/module/components/Payment/index.js +266 -0
  41. package/lib/module/components/Payment/index.js.map +1 -0
  42. package/lib/module/constants/index.js +98 -0
  43. package/lib/module/constants/index.js.map +1 -0
  44. package/lib/module/img/iamport-logo.png +0 -0
  45. package/lib/module/index.js +10 -0
  46. package/lib/module/index.js.map +1 -0
  47. package/lib/module/styles.js +21 -0
  48. package/lib/module/styles.js.map +1 -0
  49. package/lib/module/utils/IamportUrl.js +322 -0
  50. package/lib/module/utils/IamportUrl.js.map +1 -0
  51. package/{src → lib/module}/utils/Validation.js +25 -9
  52. package/lib/module/utils/Validation.js.map +1 -0
  53. package/{src → lib/module}/utils/ValidationForPayment.js +23 -13
  54. package/lib/module/utils/ValidationForPayment.js.map +1 -0
  55. package/lib/typescript/components/Certification/index.d.ts +10 -0
  56. package/lib/typescript/components/ErrorOnParams/index.d.ts +5 -0
  57. package/lib/typescript/components/Loading/index.d.ts +2 -0
  58. package/lib/typescript/components/Payment/index.d.ts +10 -0
  59. package/lib/typescript/constants/index.d.ts +76 -0
  60. package/lib/typescript/index.d.ts +9 -0
  61. package/lib/typescript/styles.d.ts +19 -0
  62. package/lib/typescript/utils/IamportUrl.d.ts +19 -0
  63. package/lib/typescript/utils/Validation.d.ts +58 -0
  64. package/lib/typescript/utils/ValidationForPayment.d.ts +7 -0
  65. package/package.json +98 -20
  66. package/src/components/Certification/index.tsx +112 -0
  67. package/src/components/ErrorOnParams/{index.js → index.tsx} +20 -25
  68. package/src/components/Loading/{index.js → index.tsx} +9 -10
  69. package/src/components/Payment/index.tsx +243 -0
  70. package/src/constants/index.ts +150 -0
  71. package/src/{index.js → index.tsx} +4 -1
  72. package/src/{styles.js → styles.ts} +3 -1
  73. package/src/utils/IamportUrl.ts +319 -0
  74. package/src/utils/Validation.ts +101 -0
  75. package/src/utils/ValidationForPayment.ts +146 -0
  76. package/IamportReactNative.podspec +0 -19
  77. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  78. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  79. package/android/gradlew +0 -172
  80. package/android/gradlew.bat +0 -84
  81. package/android/src/main/java/com/iamport/IamportModule.java +0 -88
  82. package/android/src/main/java/com/iamport/IamportPackage.java +0 -23
  83. package/ios/IamportReactNative.h +0 -11
  84. package/ios/IamportReactNative.m +0 -23
  85. package/ios/IamportReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  86. package/ios/IamportReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  87. package/ios/IamportReactNative.xcworkspace/contents.xcworkspacedata +0 -9
  88. package/manuals/CALLBACK.md +0 -68
  89. package/manuals/EXAMPLE.md +0 -175
  90. package/manuals/EXPO.md +0 -66
  91. package/manuals/INSTALL.md +0 -72
  92. package/manuals/SETTING.md +0 -72
  93. package/manuals/SUPPORT.md +0 -30
  94. package/manuals/TRANS.md +0 -122
  95. package/manuals/VERSION.md +0 -114
  96. package/manuals/assets/webview-peer-dependency.png +0 -0
  97. package/src/components/Certification/index.js +0 -99
  98. package/src/components/Payment/PaymentWebView.js +0 -285
  99. package/src/components/Payment/index.android.js +0 -51
  100. package/src/components/Payment/index.ios.js +0 -30
  101. package/src/constants/index.js +0 -83
  102. package/src/img/after-linking-iamport.png +0 -0
  103. package/src/img/after-linking-webview.png +0 -0
  104. package/src/img/allow-arbitrary.gif +0 -0
  105. package/src/img/android-studio-avd-manager.png +0 -0
  106. package/src/img/android-studio-build.png +0 -0
  107. package/src/img/app-scheme-registry.gif +0 -0
  108. package/src/img/expo-eject.png +0 -0
  109. package/src/img/ios-emulator-certification.png +0 -0
  110. package/src/img/ios-emulator-home.png +0 -0
  111. package/src/img/ios-emulator-payment.png +0 -0
  112. package/src/img/ios-trans-create-header-file-1.png +0 -0
  113. package/src/img/ios-trans-create-header-file-2.png +0 -0
  114. package/src/img/ios-trans-create-objectivec-file-1.png +0 -0
  115. package/src/img/ios-trans-create-objectivec-file-2.png +0 -0
  116. package/src/img/ios-trans-result.png +0 -0
  117. package/src/utils/IamportUrl.js +0 -103
@@ -0,0 +1,132 @@
1
+ import React, { useRef, useState } from 'react';
2
+ import { View } from 'react-native';
3
+ import { WebView } from 'react-native-webview';
4
+ import Loading from '../Loading';
5
+ import ErrorOnParams from '../ErrorOnParams';
6
+ import { Validation } from '../../utils/Validation';
7
+ import { IMPConst } from '../../constants';
8
+ import viewStyles from '../../styles';
9
+ import IamportUrl from '../../utils/IamportUrl';
10
+
11
+ function Certification({
12
+ userCode,
13
+ tierCode,
14
+ data,
15
+ loading,
16
+ callback
17
+ }) {
18
+ const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);
19
+ const webview = useRef();
20
+ const validation = new Validation(userCode, loading);
21
+
22
+ if (validation.getIsValid()) {
23
+ const {
24
+ wrapper,
25
+ loadingContainer,
26
+ webViewContainer
27
+ } = viewStyles;
28
+ return /*#__PURE__*/React.createElement(View, {
29
+ style: wrapper
30
+ }, /*#__PURE__*/React.createElement(View, {
31
+ style: webViewContainer
32
+ }, /*#__PURE__*/React.createElement(WebView, {
33
+ ref: ref => {
34
+ if (ref !== null) {
35
+ webview.current = ref;
36
+ }
37
+ },
38
+ useWebKit: true,
39
+ source: {
40
+ html: IMPConst.WEBVIEW_SOURCE_HTML
41
+ },
42
+ onLoadEnd: () => {
43
+ if (!isWebViewLoaded) {
44
+ var _webview$current3;
45
+
46
+ // html이 load되고 최초 한번만 inject javascript
47
+ if (tierCode) {
48
+ var _webview$current;
49
+
50
+ (_webview$current = webview.current) === null || _webview$current === void 0 ? void 0 : _webview$current.injectJavaScript(`
51
+ setTimeout(function() { IMP.agency("${userCode}", "${tierCode}"); });
52
+ `);
53
+ } else {
54
+ var _webview$current2;
55
+
56
+ (_webview$current2 = webview.current) === null || _webview$current2 === void 0 ? void 0 : _webview$current2.injectJavaScript(`
57
+ setTimeout(function() { IMP.init("${userCode}"); });
58
+ `);
59
+ }
60
+
61
+ (_webview$current3 = webview.current) === null || _webview$current3 === void 0 ? void 0 : _webview$current3.injectJavaScript(`
62
+ setTimeout(function() {
63
+ IMP.certification(${JSON.stringify(data)}, function(response) {
64
+ window.ReactNativeWebView.postMessage(JSON.stringify(response));
65
+ });
66
+ });
67
+ `);
68
+ setIsWebViewLoaded(true);
69
+ }
70
+ },
71
+ onMessage: e => {
72
+ const {
73
+ data
74
+ } = e.nativeEvent;
75
+ let response = data;
76
+
77
+ while (decodeURIComponent(response) !== response) {
78
+ response = decodeURIComponent(response);
79
+ }
80
+
81
+ response = JSON.parse(response);
82
+
83
+ if (typeof callback === 'function') {
84
+ callback(response);
85
+ }
86
+ },
87
+ startInLoadingState: true,
88
+ renderLoading: () => /*#__PURE__*/React.createElement(View, {
89
+ style: loadingContainer
90
+ }, loading || /*#__PURE__*/React.createElement(Loading, null)),
91
+ originWhitelist: ['*'] // https://github.com/facebook/react-native/issues/19986
92
+ ,
93
+ onShouldStartLoadWithRequest: request => {
94
+ const {
95
+ url
96
+ } = request; // console.log('url: ' + url);
97
+
98
+ const iamportUrl = new IamportUrl(url);
99
+
100
+ if (iamportUrl.isAppUrl()) {
101
+ /* 3rd-party 앱 오픈 */
102
+ iamportUrl.launchApp().catch(e => {
103
+ const {
104
+ code,
105
+ message
106
+ } = e;
107
+ callback({
108
+ imp_success: false,
109
+ error_code: code,
110
+ error_msg: message
111
+ });
112
+ });
113
+ return false;
114
+ }
115
+
116
+ if (iamportUrl.isPaymentOver()) {
117
+ callback(iamportUrl.getQuery());
118
+ return false;
119
+ }
120
+
121
+ return true;
122
+ }
123
+ })));
124
+ }
125
+
126
+ return /*#__PURE__*/React.createElement(ErrorOnParams, {
127
+ message: validation.getMessage()
128
+ });
129
+ }
130
+
131
+ export default Certification;
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","useRef","useState","View","WebView","Loading","ErrorOnParams","Validation","IMPConst","viewStyles","IamportUrl","Certification","userCode","tierCode","data","loading","callback","isWebViewLoaded","setIsWebViewLoaded","webview","validation","getIsValid","wrapper","loadingContainer","webViewContainer","ref","current","html","WEBVIEW_SOURCE_HTML","injectJavaScript","JSON","stringify","e","nativeEvent","response","decodeURIComponent","parse","request","url","iamportUrl","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","getQuery","getMessage"],"mappings":"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","sourcesContent":["import React, { useRef, useState } from 'react';\nimport { View } from 'react-native';\nimport { WebView } from 'react-native-webview';\n\nimport Loading from '../Loading';\nimport ErrorOnParams from '../ErrorOnParams';\n\nimport { IMPData, Validation } from '../../utils/Validation';\nimport { IMPConst } from '../../constants';\n\nimport viewStyles from '../../styles';\nimport IamportUrl from '../../utils/IamportUrl';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.CertificationData;\n loading: any;\n callback: (response: any) => any;\n};\n\nfunction Certification({ userCode, tierCode, data, loading, callback }: Props) {\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const webview = useRef<WebView>();\n\n const validation = new Validation(userCode, loading);\n if (validation.getIsValid()) {\n const { wrapper, loadingContainer, webViewContainer } = viewStyles;\n return (\n <View style={wrapper}>\n <View style={webViewContainer}>\n <WebView\n ref={(ref) => {\n if (ref !== null) {\n webview.current = ref;\n }\n }}\n useWebKit\n source={{ html: IMPConst.WEBVIEW_SOURCE_HTML }}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n // html이 load되고 최초 한번만 inject javascript\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.certification(${JSON.stringify(data)}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n }}\n onMessage={(e) => {\n const { data } = e.nativeEvent;\n let response = data;\n while (decodeURIComponent(response) !== response) {\n response = decodeURIComponent(response);\n }\n response = JSON.parse(response);\n\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n startInLoadingState\n renderLoading={() => (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log('url: ' + url);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver()) {\n callback(iamportUrl.getQuery());\n return false;\n }\n\n return true;\n }}\n />\n </View>\n </View>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Certification;\n"]}
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { View, Image, Text, // TouchableOpacity,
3
+ StyleSheet } from 'react-native';
4
+
5
+ const logo = require('../../img/iamport-logo.png');
6
+
7
+ function ErrorOnParams({
8
+ message
9
+ }) {
10
+ return /*#__PURE__*/React.createElement(View, {
11
+ style: styles.container
12
+ }, /*#__PURE__*/React.createElement(View, {
13
+ style: styles.contents
14
+ }, /*#__PURE__*/React.createElement(Image, {
15
+ style: styles.contents,
16
+ source: logo
17
+ }), /*#__PURE__*/React.createElement(Text, {
18
+ style: styles.text
19
+ }, message)));
20
+ }
21
+
22
+ const styles = StyleSheet.create({
23
+ container: {
24
+ flex: 1,
25
+ alignItems: 'center',
26
+ flexDirection: 'row',
27
+ justifyContent: 'center'
28
+ },
29
+ contents: {
30
+ flex: 1,
31
+ alignItems: 'center',
32
+ justifyContent: 'center'
33
+ },
34
+ text: {
35
+ fontSize: 16,
36
+ marginTop: 20,
37
+ lineHeight: 25
38
+ },
39
+ button: {
40
+ backgroundColor: '#fff',
41
+ color: '#ff0000',
42
+ borderColor: '#333',
43
+ borderWidth: 1,
44
+ borderRadius: 3,
45
+ paddingTop: 10,
46
+ paddingBottom: 10,
47
+ paddingLeft: 20,
48
+ paddingRight: 20,
49
+ fontSize: 14,
50
+ marginTop: 20,
51
+ fontWeight: 'bold'
52
+ }
53
+ });
54
+ export default ErrorOnParams;
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","View","Image","Text","StyleSheet","logo","require","ErrorOnParams","message","styles","container","contents","text","create","flex","alignItems","flexDirection","justifyContent","fontSize","marginTop","lineHeight","button","backgroundColor","color","borderColor","borderWidth","borderRadius","paddingTop","paddingBottom","paddingLeft","paddingRight","fontWeight"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SACEC,IADF,EAEEC,KAFF,EAGEC,IAHF,EAIE;AACAC,UALF,QAMO,cANP;;AAQA,MAAMC,IAAI,GAAGC,OAAO,CAAC,4BAAD,CAApB;;AAIA,SAASC,aAAT,CAAuB;AAAEC,EAAAA;AAAF,CAAvB,EAAgD;AAC9C,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACC;AAApB,kBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAED,MAAM,CAACE;AAApB,kBACE,oBAAC,KAAD;AAAO,IAAA,KAAK,EAAEF,MAAM,CAACE,QAArB;AAA+B,IAAA,MAAM,EAAEN;AAAvC,IADF,eAEE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEI,MAAM,CAACG;AAApB,KAA2BJ,OAA3B,CAFF,CADF,CADF;AAcD;;AAED,MAAMC,MAAM,GAAGL,UAAU,CAACS,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE;AACTI,IAAAA,IAAI,EAAE,CADG;AAETC,IAAAA,UAAU,EAAE,QAFH;AAGTC,IAAAA,aAAa,EAAE,KAHN;AAITC,IAAAA,cAAc,EAAE;AAJP,GADoB;AAO/BN,EAAAA,QAAQ,EAAE;AACRG,IAAAA,IAAI,EAAE,CADE;AAERC,IAAAA,UAAU,EAAE,QAFJ;AAGRE,IAAAA,cAAc,EAAE;AAHR,GAPqB;AAY/BL,EAAAA,IAAI,EAAE;AACJM,IAAAA,QAAQ,EAAE,EADN;AAEJC,IAAAA,SAAS,EAAE,EAFP;AAGJC,IAAAA,UAAU,EAAE;AAHR,GAZyB;AAiB/BC,EAAAA,MAAM,EAAE;AACNC,IAAAA,eAAe,EAAE,MADX;AAENC,IAAAA,KAAK,EAAE,SAFD;AAGNC,IAAAA,WAAW,EAAE,MAHP;AAINC,IAAAA,WAAW,EAAE,CAJP;AAKNC,IAAAA,YAAY,EAAE,CALR;AAMNC,IAAAA,UAAU,EAAE,EANN;AAONC,IAAAA,aAAa,EAAE,EAPT;AAQNC,IAAAA,WAAW,EAAE,EARP;AASNC,IAAAA,YAAY,EAAE,EATR;AAUNZ,IAAAA,QAAQ,EAAE,EAVJ;AAWNC,IAAAA,SAAS,EAAE,EAXL;AAYNY,IAAAA,UAAU,EAAE;AAZN;AAjBuB,CAAlB,CAAf;AAiCA,eAAexB,aAAf","sourcesContent":["import React from 'react';\nimport {\n View,\n Image,\n Text,\n // TouchableOpacity,\n StyleSheet,\n} from 'react-native';\n\nconst logo = require('../../img/iamport-logo.png');\n\ntype ErrorProps = { message: string };\n\nfunction ErrorOnParams({ message }: ErrorProps) {\n return (\n <View style={styles.container}>\n <View style={styles.contents}>\n <Image style={styles.contents} source={logo} />\n <Text style={styles.text}>{message}</Text>\n {/*<TouchableOpacity\n style={button}\n onPress={}\n >\n <Text>돌아가기</Text>\n </TouchableOpacity>*/}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'center',\n },\n contents: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n text: {\n fontSize: 16,\n marginTop: 20,\n lineHeight: 25,\n },\n button: {\n backgroundColor: '#fff',\n color: '#ff0000',\n borderColor: '#333',\n borderWidth: 1,\n borderRadius: 3,\n paddingTop: 10,\n paddingBottom: 10,\n paddingLeft: 20,\n paddingRight: 20,\n fontSize: 14,\n marginTop: 20,\n fontWeight: 'bold',\n },\n});\n\nexport default ErrorOnParams;\n"]}
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { View, Image, Text, StyleSheet } from 'react-native';
3
+
4
+ const logo = require('../../img/iamport-logo.png');
5
+
6
+ function Loading() {
7
+ return /*#__PURE__*/React.createElement(View, {
8
+ style: styles.container
9
+ }, /*#__PURE__*/React.createElement(View, {
10
+ style: styles.contents
11
+ }, /*#__PURE__*/React.createElement(Image, {
12
+ style: styles.contents,
13
+ source: logo
14
+ }), /*#__PURE__*/React.createElement(Text, {
15
+ style: styles.text
16
+ }, "\uC7A0\uC2DC\uB9CC \uAE30\uB2E4\uB824\uC8FC\uC138\uC694...")));
17
+ }
18
+
19
+ const styles = StyleSheet.create({
20
+ container: { ...StyleSheet.absoluteFillObject,
21
+ flex: 1,
22
+ alignItems: 'center',
23
+ flexDirection: 'row',
24
+ justifyContent: 'center'
25
+ },
26
+ contents: {
27
+ flex: 1,
28
+ alignItems: 'center',
29
+ justifyContent: 'center'
30
+ },
31
+ text: {
32
+ fontSize: 20,
33
+ marginTop: 20,
34
+ lineHeight: 25
35
+ }
36
+ });
37
+ export default Loading;
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","View","Image","Text","StyleSheet","logo","require","Loading","styles","container","contents","text","create","absoluteFillObject","flex","alignItems","flexDirection","justifyContent","fontSize","marginTop","lineHeight"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,EAAeC,KAAf,EAAsBC,IAAtB,EAA4BC,UAA5B,QAA8C,cAA9C;;AAEA,MAAMC,IAAI,GAAGC,OAAO,CAAC,4BAAD,CAApB;;AAEA,SAASC,OAAT,GAAmB;AACjB,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACC;AAApB,kBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAED,MAAM,CAACE;AAApB,kBACE,oBAAC,KAAD;AAAO,IAAA,KAAK,EAAEF,MAAM,CAACE,QAArB;AAA+B,IAAA,MAAM,EAAEL;AAAvC,IADF,eAEE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEG,MAAM,CAACG;AAApB,kEAFF,CADF,CADF;AAQD;;AAED,MAAMH,MAAM,GAAGJ,UAAU,CAACQ,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE,EACT,GAAGL,UAAU,CAACS,kBADL;AAETC,IAAAA,IAAI,EAAE,CAFG;AAGTC,IAAAA,UAAU,EAAE,QAHH;AAITC,IAAAA,aAAa,EAAE,KAJN;AAKTC,IAAAA,cAAc,EAAE;AALP,GADoB;AAQ/BP,EAAAA,QAAQ,EAAE;AACRI,IAAAA,IAAI,EAAE,CADE;AAERC,IAAAA,UAAU,EAAE,QAFJ;AAGRE,IAAAA,cAAc,EAAE;AAHR,GARqB;AAa/BN,EAAAA,IAAI,EAAE;AACJO,IAAAA,QAAQ,EAAE,EADN;AAEJC,IAAAA,SAAS,EAAE,EAFP;AAGJC,IAAAA,UAAU,EAAE;AAHR;AAbyB,CAAlB,CAAf;AAoBA,eAAeb,OAAf","sourcesContent":["import React from 'react';\nimport { View, Image, Text, StyleSheet } from 'react-native';\n\nconst logo = require('../../img/iamport-logo.png');\n\nfunction Loading() {\n return (\n <View style={styles.container}>\n <View style={styles.contents}>\n <Image style={styles.contents} source={logo} />\n <Text style={styles.text}>잠시만 기다려주세요...</Text>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n flex: 1,\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'center',\n },\n contents: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n text: {\n fontSize: 20,\n marginTop: 20,\n lineHeight: 25,\n },\n});\n\nexport default Loading;\n"]}
@@ -0,0 +1,266 @@
1
+ import React, { createRef, useEffect, useRef, useState } from 'react';
2
+ import ValidationForPayment from '../../utils/ValidationForPayment';
3
+ import ErrorOnParams from '../ErrorOnParams';
4
+ import { Linking, Platform, View } from 'react-native';
5
+ import { IMPConst } from '../../constants';
6
+ import IamportUrl from '../../utils/IamportUrl';
7
+ import WebView from 'react-native-webview';
8
+ import viewStyles from '../../styles';
9
+ import Loading from '../Loading';
10
+
11
+ function Payment({
12
+ userCode,
13
+ tierCode,
14
+ data,
15
+ loading,
16
+ callback
17
+ }) {
18
+ const [webviewSource, setWebviewSource] = useState({
19
+ html: IMPConst.WEBVIEW_SOURCE_HTML
20
+ });
21
+ const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);
22
+ const [showLoading, setShowLoading] = useState(true);
23
+ const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);
24
+ const webview = /*#__PURE__*/createRef();
25
+ const smilepayRef = useRef(false);
26
+ useEffect(() => {
27
+ const {
28
+ pg
29
+ } = data;
30
+
31
+ if (pg.startsWith('smilepay') && Platform.OS === 'ios' && !smilepayRef.current) {
32
+ /**
33
+ * [feature/smilepay] IOS - 스마일페이 대비 코드 작성
34
+ * 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아
35
+ * WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용
36
+ */
37
+ setWebviewSource({ ...webviewSource,
38
+ baseUrl: IMPConst.SMILEPAY_BASE_URL
39
+ });
40
+ smilepayRef.current = true;
41
+ }
42
+ }, [data, webviewSource]);
43
+ useEffect(() => {
44
+ const handleOpenURL = event => {
45
+ const {
46
+ pg,
47
+ pay_method
48
+ } = data;
49
+
50
+ if (pay_method === 'trans') {
51
+ const iamportUrl = new IamportUrl(event.url);
52
+ /**
53
+ * [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비
54
+ * 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨
55
+ * 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)
56
+ * 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출
57
+ * 3. "다음" 버튼이 있는 최종 화면으로 이동
58
+ * 4. "다음" 버튼을 클릭
59
+ * 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출
60
+ * 6. 콜백 함수 호출
61
+ * 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여
62
+ * 이를 위한 isInicisTransPaid 플래그 추가
63
+ */
64
+
65
+ if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {
66
+ if (isInicisTransPaid) {
67
+ var _webview$current;
68
+
69
+ (_webview$current = webview.current) === null || _webview$current === void 0 ? void 0 : _webview$current.injectJavaScript(`
70
+ window.location.href = "${IMPConst.M_REDIRECT_URL}?${iamportUrl.getInicisTransQuery()}";
71
+ `);
72
+ } else {
73
+ setIsInicisTransPaid(true);
74
+ }
75
+ }
76
+ /* 나이스 - 실시간 계좌이체 대비 */
77
+
78
+
79
+ if (pg.startsWith('nice')) {
80
+ var _data$app_scheme, _webview$current2;
81
+
82
+ const queryParameters = iamportUrl.getQuery();
83
+ const scheme = iamportUrl.scheme;
84
+ let niceTransRedirectionUrl;
85
+
86
+ if (scheme === ((_data$app_scheme = data.app_scheme) === null || _data$app_scheme === void 0 ? void 0 : _data$app_scheme.toLowerCase())) {
87
+ if (queryParameters.callbackparam1 != null) {
88
+ niceTransRedirectionUrl = queryParameters.callbackparam1;
89
+ }
90
+ }
91
+
92
+ (_webview$current2 = webview.current) === null || _webview$current2 === void 0 ? void 0 : _webview$current2.injectJavaScript(`
93
+ window.location.href = "${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}";
94
+ `);
95
+ }
96
+ }
97
+ };
98
+
99
+ Linking.addEventListener('url', handleOpenURL);
100
+ }, [data, isInicisTransPaid, webview]);
101
+
102
+ const removeLoadingNeeded = () => {
103
+ if (showLoading && Platform.OS === 'android') {
104
+ // 로딩상태. 안드로이드 플랫폼
105
+ if (isWebViewLoaded) {
106
+ // 웹뷰 로드 끝. 리디렉션 방식
107
+ return true;
108
+ }
109
+
110
+ return isIframeWayPayment();
111
+ } // IOS
112
+
113
+
114
+ return false;
115
+ };
116
+
117
+ const isIframeWayPayment = () => {
118
+ const {
119
+ pg,
120
+ pay_method,
121
+ customer_uid
122
+ } = data;
123
+
124
+ if (pg.startsWith('html5_inicis') && customer_uid) {
125
+ // 이니시스 빌링결제
126
+ return true;
127
+ }
128
+
129
+ if (pg.startsWith('mobilians') && pay_method === 'phone') {
130
+ // 모빌리언스 휴대폰 소액결제
131
+ return true;
132
+ }
133
+
134
+ return pg.startsWith('danal') || pg.startsWith('danal_tpay') || pg.startsWith('smilepay') || pg.startsWith('payco') || pg.startsWith('bluewalnut');
135
+ };
136
+
137
+ const validation = new ValidationForPayment(userCode, loading, callback, data);
138
+
139
+ if (validation.getIsValid()) {
140
+ const {
141
+ wrapper,
142
+ loadingContainer,
143
+ webViewContainer
144
+ } = viewStyles;
145
+ return /*#__PURE__*/React.createElement(View, {
146
+ style: wrapper
147
+ }, /*#__PURE__*/React.createElement(View, {
148
+ style: webViewContainer
149
+ }, /*#__PURE__*/React.createElement(WebView, {
150
+ ref: webview,
151
+ source: webviewSource,
152
+ onLoadEnd: () => {
153
+ if (!isWebViewLoaded) {
154
+ var _webview$current5;
155
+
156
+ data.m_redirect_url = IMPConst.M_REDIRECT_URL;
157
+
158
+ if (data.pg.startsWith('eximbay')) {
159
+ data.popup = false;
160
+ }
161
+
162
+ if (tierCode) {
163
+ var _webview$current3;
164
+
165
+ (_webview$current3 = webview.current) === null || _webview$current3 === void 0 ? void 0 : _webview$current3.injectJavaScript(`
166
+ setTimeout(function() { IMP.agency("${userCode}", "${tierCode}"); });
167
+ `);
168
+ } else {
169
+ var _webview$current4;
170
+
171
+ (_webview$current4 = webview.current) === null || _webview$current4 === void 0 ? void 0 : _webview$current4.injectJavaScript(`
172
+ setTimeout(function() { IMP.init("${userCode}"); });
173
+ `);
174
+ }
175
+
176
+ (_webview$current5 = webview.current) === null || _webview$current5 === void 0 ? void 0 : _webview$current5.injectJavaScript(`
177
+ setTimeout(function() {
178
+ IMP.request_pay(${JSON.stringify(data)}, function(response) {
179
+ window.ReactNativeWebView.postMessage(JSON.stringify(response));
180
+ });
181
+ });
182
+ `);
183
+ setIsWebViewLoaded(true);
184
+ } // only for Android
185
+
186
+
187
+ if (removeLoadingNeeded()) {
188
+ setShowLoading(false);
189
+ }
190
+ }
191
+ /* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */
192
+ ,
193
+ onMessage: e => {
194
+ const {
195
+ data
196
+ } = e.nativeEvent;
197
+ /**
198
+ * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데
199
+ * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해
200
+ * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면
201
+ * 최종적으로 decodeURIComponent를 한 번 더 한다
202
+ */
203
+
204
+ let response = encodeURIComponent(data);
205
+
206
+ while (decodeURIComponent(response) !== data) {
207
+ response = decodeURIComponent(response);
208
+ }
209
+
210
+ response = decodeURIComponent(response);
211
+ response = JSON.parse(response);
212
+ callback(response);
213
+ },
214
+ originWhitelist: ['*'] // https://github.com/facebook/react-native/issues/19986
215
+ ,
216
+ sharedCookiesEnabled: true,
217
+ onShouldStartLoadWithRequest: request => {
218
+ const {
219
+ url
220
+ } = request;
221
+ const iamportUrl = new IamportUrl(url);
222
+
223
+ if (iamportUrl.isAppUrl()) {
224
+ /* 3rd-party 앱 오픈 */
225
+ iamportUrl.launchApp().catch(e => {
226
+ const {
227
+ code,
228
+ message
229
+ } = e;
230
+ callback({
231
+ imp_success: false,
232
+ error_code: code,
233
+ error_msg: message
234
+ });
235
+ });
236
+ return false;
237
+ }
238
+
239
+ if (iamportUrl.isPaymentOver()) {
240
+ callback(iamportUrl.getQuery());
241
+ return false;
242
+ }
243
+
244
+ if (isWebViewLoaded && showLoading && iamportUrl.isIframeLoaded()) {
245
+ /**
246
+ * only for IOS
247
+ * iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)
248
+ * webview의 loading 상태를 해제한다
249
+ */
250
+ setShowLoading(false);
251
+ }
252
+
253
+ return true;
254
+ }
255
+ })), showLoading && /*#__PURE__*/React.createElement(View, {
256
+ style: loadingContainer
257
+ }, loading || /*#__PURE__*/React.createElement(Loading, null)));
258
+ }
259
+
260
+ return /*#__PURE__*/React.createElement(ErrorOnParams, {
261
+ message: validation.getMessage()
262
+ });
263
+ }
264
+
265
+ export default Payment;
266
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","createRef","useEffect","useRef","useState","ValidationForPayment","ErrorOnParams","Linking","Platform","View","IMPConst","IamportUrl","WebView","viewStyles","Loading","Payment","userCode","tierCode","data","loading","callback","webviewSource","setWebviewSource","html","WEBVIEW_SOURCE_HTML","isWebViewLoaded","setIsWebViewLoaded","showLoading","setShowLoading","isInicisTransPaid","setIsInicisTransPaid","webview","smilepayRef","pg","startsWith","OS","current","baseUrl","SMILEPAY_BASE_URL","handleOpenURL","event","pay_method","iamportUrl","url","injectJavaScript","M_REDIRECT_URL","getInicisTransQuery","queryParameters","getQuery","scheme","niceTransRedirectionUrl","app_scheme","toLowerCase","callbackparam1","getStringifiedQuery","addEventListener","removeLoadingNeeded","isIframeWayPayment","customer_uid","validation","getIsValid","wrapper","loadingContainer","webViewContainer","m_redirect_url","popup","JSON","stringify","e","nativeEvent","response","encodeURIComponent","decodeURIComponent","parse","request","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","isIframeLoaded","getMessage"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,EAA2BC,SAA3B,EAAsCC,MAAtC,EAA8CC,QAA9C,QAA8D,OAA9D;AAEA,OAAOC,oBAAP,MAAiC,kCAAjC;AACA,OAAOC,aAAP,MAA0B,kBAA1B;AACA,SAASC,OAAT,EAAkBC,QAAlB,EAA4BC,IAA5B,QAAwC,cAAxC;AACA,SAASC,QAAT,QAAyB,iBAAzB;AACA,OAAOC,UAAP,MAAuB,wBAAvB;AACA,OAAOC,OAAP,MAAoB,sBAApB;AACA,OAAOC,UAAP,MAAuB,cAAvB;AACA,OAAOC,OAAP,MAAoB,YAApB;;AAWA,SAASC,OAAT,CAAiB;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,QAAZ;AAAsBC,EAAAA,IAAtB;AAA4BC,EAAAA,OAA5B;AAAqCC,EAAAA;AAArC,CAAjB,EAAyE;AACvE,QAAM,CAACC,aAAD,EAAgBC,gBAAhB,IAAoClB,QAAQ,CAAgB;AAChEmB,IAAAA,IAAI,EAAEb,QAAQ,CAACc;AADiD,GAAhB,CAAlD;AAGA,QAAM,CAACC,eAAD,EAAkBC,kBAAlB,IAAwCtB,QAAQ,CAAC,KAAD,CAAtD;AACA,QAAM,CAACuB,WAAD,EAAcC,cAAd,IAAgCxB,QAAQ,CAAC,IAAD,CAA9C;AACA,QAAM,CAACyB,iBAAD,EAAoBC,oBAApB,IAA4C1B,QAAQ,CAAC,KAAD,CAA1D;AACA,QAAM2B,OAAO,gBAAG9B,SAAS,EAAzB;AACA,QAAM+B,WAAW,GAAG7B,MAAM,CAAC,KAAD,CAA1B;AAEAD,EAAAA,SAAS,CAAC,MAAM;AACd,UAAM;AAAE+B,MAAAA;AAAF,QAASf,IAAf;;AACA,QACEe,EAAE,CAACC,UAAH,CAAc,UAAd,KACA1B,QAAQ,CAAC2B,EAAT,KAAgB,KADhB,IAEA,CAACH,WAAW,CAACI,OAHf,EAIE;AACA;AACN;AACA;AACA;AACA;AACMd,MAAAA,gBAAgB,CAAC,EACf,GAAGD,aADY;AAEfgB,QAAAA,OAAO,EAAE3B,QAAQ,CAAC4B;AAFH,OAAD,CAAhB;AAIAN,MAAAA,WAAW,CAACI,OAAZ,GAAsB,IAAtB;AACD;AACF,GAlBQ,EAkBN,CAAClB,IAAD,EAAOG,aAAP,CAlBM,CAAT;AAoBAnB,EAAAA,SAAS,CAAC,MAAM;AACd,UAAMqC,aAAa,GAAIC,KAAD,IAA4B;AAChD,YAAM;AAAEP,QAAAA,EAAF;AAAMQ,QAAAA;AAAN,UAAqBvB,IAA3B;;AACA,UAAIuB,UAAU,KAAK,OAAnB,EAA4B;AAC1B,cAAMC,UAAU,GAAG,IAAI/B,UAAJ,CAAe6B,KAAK,CAACG,GAArB,CAAnB;AACA;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACQ,YAAIV,EAAE,CAACC,UAAH,CAAc,cAAd,KAAiC1B,QAAQ,CAAC2B,EAAT,KAAgB,KAArD,EAA4D;AAC1D,cAAIN,iBAAJ,EAAuB;AAAA;;AACrB,gCAAAE,OAAO,CAACK,OAAR,sEAAiBQ,gBAAjB,CAAmC;AAC/C,wCACgBlC,QAAQ,CAACmC,cACV,IAAGH,UAAU,CAACI,mBAAX,EAAiC;AACnD,aAJY;AAKD,WAND,MAMO;AACLhB,YAAAA,oBAAoB,CAAC,IAAD,CAApB;AACD;AACF;AAED;;;AACA,YAAIG,EAAE,CAACC,UAAH,CAAc,MAAd,CAAJ,EAA2B;AAAA;;AACzB,gBAAMa,eAAe,GAAGL,UAAU,CAACM,QAAX,EAAxB;AACA,gBAAMC,MAAM,GAAGP,UAAU,CAACO,MAA1B;AACA,cAAIC,uBAAJ;;AACA,cAAID,MAAM,0BAAK/B,IAAI,CAACiC,UAAV,qDAAK,iBAAiBC,WAAjB,EAAL,CAAV,EAA+C;AAC7C,gBAAIL,eAAe,CAACM,cAAhB,IAAkC,IAAtC,EAA4C;AAC1CH,cAAAA,uBAAuB,GAAGH,eAAe,CAACM,cAA1C;AACD;AACF;;AACD,+BAAAtB,OAAO,CAACK,OAAR,wEAAiBQ,gBAAjB,CAAmC;AAC7C,sCAAsCM,uBAAwB,IAAGR,UAAU,CAACY,mBAAX,EAAiC;AAClG,WAFU;AAGD;AACF;AACF,KA3CD;;AA4CA/C,IAAAA,OAAO,CAACgD,gBAAR,CAAyB,KAAzB,EAAgChB,aAAhC;AACD,GA9CQ,EA8CN,CAACrB,IAAD,EAAOW,iBAAP,EAA0BE,OAA1B,CA9CM,CAAT;;AAgDA,QAAMyB,mBAAmB,GAAG,MAAM;AAChC,QAAI7B,WAAW,IAAInB,QAAQ,CAAC2B,EAAT,KAAgB,SAAnC,EAA8C;AAC5C;AACA,UAAIV,eAAJ,EAAqB;AACnB;AACA,eAAO,IAAP;AACD;;AACD,aAAOgC,kBAAkB,EAAzB;AACD,KAR+B,CAShC;;;AACA,WAAO,KAAP;AACD,GAXD;;AAaA,QAAMA,kBAAkB,GAAG,MAAM;AAC/B,UAAM;AAAExB,MAAAA,EAAF;AAAMQ,MAAAA,UAAN;AAAkBiB,MAAAA;AAAlB,QAAmCxC,IAAzC;;AACA,QAAIe,EAAE,CAACC,UAAH,CAAc,cAAd,KAAiCwB,YAArC,EAAmD;AACjD;AACA,aAAO,IAAP;AACD;;AACD,QAAIzB,EAAE,CAACC,UAAH,CAAc,WAAd,KAA8BO,UAAU,KAAK,OAAjD,EAA0D;AACxD;AACA,aAAO,IAAP;AACD;;AACD,WACER,EAAE,CAACC,UAAH,CAAc,OAAd,KACAD,EAAE,CAACC,UAAH,CAAc,YAAd,CADA,IAEAD,EAAE,CAACC,UAAH,CAAc,UAAd,CAFA,IAGAD,EAAE,CAACC,UAAH,CAAc,OAAd,CAHA,IAIAD,EAAE,CAACC,UAAH,CAAc,YAAd,CALF;AAOD,GAjBD;;AAmBA,QAAMyB,UAAU,GAAG,IAAItD,oBAAJ,CACjBW,QADiB,EAEjBG,OAFiB,EAGjBC,QAHiB,EAIjBF,IAJiB,CAAnB;;AAMA,MAAIyC,UAAU,CAACC,UAAX,EAAJ,EAA6B;AAC3B,UAAM;AAAEC,MAAAA,OAAF;AAAWC,MAAAA,gBAAX;AAA6BC,MAAAA;AAA7B,QAAkDlD,UAAxD;AACA,wBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAEgD;AAAb,oBACE,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAEE;AAAb,oBACE,oBAAC,OAAD;AACE,MAAA,GAAG,EAAEhC,OADP;AAEE,MAAA,MAAM,EAAEV,aAFV;AAGE,MAAA,SAAS,EAAE,MAAM;AACf,YAAI,CAACI,eAAL,EAAsB;AAAA;;AACpBP,UAAAA,IAAI,CAAC8C,cAAL,GAAsBtD,QAAQ,CAACmC,cAA/B;;AACA,cAAI3B,IAAI,CAACe,EAAL,CAAQC,UAAR,CAAmB,SAAnB,CAAJ,EAAmC;AACjChB,YAAAA,IAAI,CAAC+C,KAAL,GAAa,KAAb;AACD;;AAED,cAAIhD,QAAJ,EAAc;AAAA;;AACZ,iCAAAc,OAAO,CAACK,OAAR,wEAAiBQ,gBAAjB,CAAmC;AACrD,0DAA0D5B,QAAS,OAAMC,QAAS;AAClF,mBAFkB;AAGD,WAJD,MAIO;AAAA;;AACL,iCAAAc,OAAO,CAACK,OAAR,wEAAiBQ,gBAAjB,CAAmC;AACrD,wDAAwD5B,QAAS;AACjE,mBAFkB;AAGD;;AACD,+BAAAe,OAAO,CAACK,OAAR,wEAAiBQ,gBAAjB,CAAmC;AACnD;AACA,sCAAsCsB,IAAI,CAACC,SAAL,CAChBjD,IADgB,CAEhB;AACtB;AACA;AACA;AACA,iBARgB;AASAQ,UAAAA,kBAAkB,CAAC,IAAD,CAAlB;AACD,SA1Bc,CA4Bf;;;AACA,YAAI8B,mBAAmB,EAAvB,EAA2B;AACzB5B,UAAAA,cAAc,CAAC,KAAD,CAAd;AACD;AACF;AACD;AApCF;AAqCE,MAAA,SAAS,EAAGwC,CAAD,IAAO;AAChB,cAAM;AAAElD,UAAAA;AAAF,YAAWkD,CAAC,CAACC,WAAnB;AACA;AACd;AACA;AACA;AACA;AACA;;AACc,YAAIC,QAAQ,GAAGC,kBAAkB,CAACrD,IAAD,CAAjC;;AACA,eAAOsD,kBAAkB,CAACF,QAAD,CAAlB,KAAiCpD,IAAxC,EAA8C;AAC5CoD,UAAAA,QAAQ,GAAGE,kBAAkB,CAACF,QAAD,CAA7B;AACD;;AACDA,QAAAA,QAAQ,GAAGE,kBAAkB,CAACF,QAAD,CAA7B;AACAA,QAAAA,QAAQ,GAAGJ,IAAI,CAACO,KAAL,CAAWH,QAAX,CAAX;AACAlD,QAAAA,QAAQ,CAACkD,QAAD,CAAR;AACD,OApDH;AAqDE,MAAA,eAAe,EAAE,CAAC,GAAD,CArDnB,CAqD0B;AArD1B;AAsDE,MAAA,oBAAoB,EAAE,IAtDxB;AAuDE,MAAA,4BAA4B,EAAGI,OAAD,IAAa;AACzC,cAAM;AAAE/B,UAAAA;AAAF,YAAU+B,OAAhB;AACA,cAAMhC,UAAU,GAAG,IAAI/B,UAAJ,CAAegC,GAAf,CAAnB;;AACA,YAAID,UAAU,CAACiC,QAAX,EAAJ,EAA2B;AACzB;AACAjC,UAAAA,UAAU,CAACkC,SAAX,GAAuBC,KAAvB,CAA8BT,CAAD,IAAO;AAClC,kBAAM;AAAEU,cAAAA,IAAF;AAAQC,cAAAA;AAAR,gBAAoBX,CAA1B;AACAhD,YAAAA,QAAQ,CAAC;AACP4D,cAAAA,WAAW,EAAE,KADN;AAEPC,cAAAA,UAAU,EAAEH,IAFL;AAGPI,cAAAA,SAAS,EAAEH;AAHJ,aAAD,CAAR;AAKD,WAPD;AASA,iBAAO,KAAP;AACD;;AACD,YAAIrC,UAAU,CAACyC,aAAX,EAAJ,EAAgC;AAC9B/D,UAAAA,QAAQ,CAACsB,UAAU,CAACM,QAAX,EAAD,CAAR;AACA,iBAAO,KAAP;AACD;;AACD,YACEvB,eAAe,IACfE,WADA,IAEAe,UAAU,CAAC0C,cAAX,EAHF,EAIE;AACA;AAChB;AACA;AACA;AACA;AACgBxD,UAAAA,cAAc,CAAC,KAAD,CAAd;AACD;;AACD,eAAO,IAAP;AACD;AAxFH,MADF,CADF,EA6FGD,WAAW,iBACV,oBAAC,IAAD;AAAM,MAAA,KAAK,EAAEmC;AAAb,OAAgC3C,OAAO,iBAAI,oBAAC,OAAD,OAA3C,CA9FJ,CADF;AAmGD;;AAED,sBAAO,oBAAC,aAAD;AAAe,IAAA,OAAO,EAAEwC,UAAU,CAAC0B,UAAX;AAAxB,IAAP;AACD;;AAED,eAAetE,OAAf","sourcesContent":["import React, { createRef, useEffect, useRef, useState } from 'react';\nimport type { IMPData } from '../../utils/Validation';\nimport ValidationForPayment from '../../utils/ValidationForPayment';\nimport ErrorOnParams from '../ErrorOnParams';\nimport { Linking, Platform, View } from 'react-native';\nimport { IMPConst } from '../../constants';\nimport IamportUrl from '../../utils/IamportUrl';\nimport WebView from 'react-native-webview';\nimport viewStyles from '../../styles';\nimport Loading from '../Loading';\nimport type { WebViewSource } from 'react-native-webview/lib/WebViewTypes';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.PaymentData;\n loading: any;\n callback: (response: any) => any;\n};\n\nfunction Payment({ userCode, tierCode, data, loading, callback }: Props) {\n const [webviewSource, setWebviewSource] = useState<WebViewSource>({\n html: IMPConst.WEBVIEW_SOURCE_HTML,\n });\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const [showLoading, setShowLoading] = useState(true);\n const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);\n const webview = createRef<WebView>();\n const smilepayRef = useRef(false);\n\n useEffect(() => {\n const { pg } = data;\n if (\n pg.startsWith('smilepay') &&\n Platform.OS === 'ios' &&\n !smilepayRef.current\n ) {\n /**\n * [feature/smilepay] IOS - 스마일페이 대비 코드 작성\n * 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아\n * WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용\n */\n setWebviewSource({\n ...webviewSource,\n baseUrl: IMPConst.SMILEPAY_BASE_URL,\n });\n smilepayRef.current = true;\n }\n }, [data, webviewSource]);\n\n useEffect(() => {\n const handleOpenURL = (event: { url: string }) => {\n const { pg, pay_method } = data;\n if (pay_method === 'trans') {\n const iamportUrl = new IamportUrl(event.url);\n /**\n * [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비\n * 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨\n * 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)\n * 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출\n * 3. \"다음\" 버튼이 있는 최종 화면으로 이동\n * 4. \"다음\" 버튼을 클릭\n * 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출\n * 6. 콜백 함수 호출\n * 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여\n * 이를 위한 isInicisTransPaid 플래그 추가\n */\n if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {\n if (isInicisTransPaid) {\n webview.current?.injectJavaScript(`\n window.location.href = \"${\n IMPConst.M_REDIRECT_URL\n }?${iamportUrl.getInicisTransQuery()}\";\n `);\n } else {\n setIsInicisTransPaid(true);\n }\n }\n\n /* 나이스 - 실시간 계좌이체 대비 */\n if (pg.startsWith('nice')) {\n const queryParameters = iamportUrl.getQuery();\n const scheme = iamportUrl.scheme;\n let niceTransRedirectionUrl;\n if (scheme === data.app_scheme?.toLowerCase()) {\n if (queryParameters.callbackparam1 != null) {\n niceTransRedirectionUrl = queryParameters.callbackparam1;\n }\n }\n webview.current?.injectJavaScript(`\n window.location.href = \"${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}\";\n `);\n }\n }\n };\n Linking.addEventListener('url', handleOpenURL);\n }, [data, isInicisTransPaid, webview]);\n\n const removeLoadingNeeded = () => {\n if (showLoading && Platform.OS === 'android') {\n // 로딩상태. 안드로이드 플랫폼\n if (isWebViewLoaded) {\n // 웹뷰 로드 끝. 리디렉션 방식\n return true;\n }\n return isIframeWayPayment();\n }\n // IOS\n return false;\n };\n\n const isIframeWayPayment = () => {\n const { pg, pay_method, customer_uid } = data;\n if (pg.startsWith('html5_inicis') && customer_uid) {\n // 이니시스 빌링결제\n return true;\n }\n if (pg.startsWith('mobilians') && pay_method === 'phone') {\n // 모빌리언스 휴대폰 소액결제\n return true;\n }\n return (\n pg.startsWith('danal') ||\n pg.startsWith('danal_tpay') ||\n pg.startsWith('smilepay') ||\n pg.startsWith('payco') ||\n pg.startsWith('bluewalnut')\n );\n };\n\n const validation = new ValidationForPayment(\n userCode,\n loading,\n callback,\n data\n );\n if (validation.getIsValid()) {\n const { wrapper, loadingContainer, webViewContainer } = viewStyles;\n return (\n <View style={wrapper}>\n <View style={webViewContainer}>\n <WebView\n ref={webview}\n source={webviewSource}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n data.m_redirect_url = IMPConst.M_REDIRECT_URL;\n if (data.pg.startsWith('eximbay')) {\n data.popup = false;\n }\n\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.request_pay(${JSON.stringify(\n data\n )}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n\n // only for Android\n if (removeLoadingNeeded()) {\n setShowLoading(false);\n }\n }}\n /* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */\n onMessage={(e) => {\n const { data } = e.nativeEvent;\n /**\n * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데\n * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해\n * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면\n * 최종적으로 decodeURIComponent를 한 번 더 한다\n */\n let response = encodeURIComponent(data);\n while (decodeURIComponent(response) !== data) {\n response = decodeURIComponent(response);\n }\n response = decodeURIComponent(response);\n response = JSON.parse(response);\n callback(response);\n }}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n sharedCookiesEnabled={true}\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver()) {\n callback(iamportUrl.getQuery());\n return false;\n }\n if (\n isWebViewLoaded &&\n showLoading &&\n iamportUrl.isIframeLoaded()\n ) {\n /**\n * only for IOS\n * iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)\n * webview의 loading 상태를 해제한다\n */\n setShowLoading(false);\n }\n return true;\n }}\n />\n </View>\n {showLoading && (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n </View>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Payment;\n"]}
@@ -0,0 +1,98 @@
1
+ let IMPConst;
2
+
3
+ (function (_IMPConst) {
4
+ const PG = _IMPConst.PG = ['html5_inicis', 'inicis', 'uplus', 'kcp', 'kcp_billing', 'nice', 'jtnet', 'kakao', 'kakaopay', 'danal', 'danal_tpay', 'kicc', 'settle', 'mobilians', 'payco', 'eximbay', 'paypal', 'naverco', 'naverpay', 'smilepay', 'chai', 'payple', 'alipay', 'bluewalnut', 'tosspay', 'smartro'];
5
+ const PAY_METHOD = _IMPConst.PAY_METHOD = ['card', 'trans', 'vbank', 'phone', 'samsung', 'kpay', 'cultureland', 'smartculture', 'happymoney', 'booknlife', 'kakaopay', 'lpay', 'payco', 'ssgpay', 'tosspay', // 엑심베이 전용
6
+ 'unionpay', // 유니온페이
7
+ 'alipay', // 알리페이
8
+ 'tenpay', // 텐페이
9
+ 'wechat', // 위챗페이
10
+ 'molpay', // 몰페이
11
+ 'paysbuy' // 태국 paysbuy
12
+ ];
13
+ const CURRENCY = _IMPConst.CURRENCY = ['KRW', 'USD', 'EUR', 'JPY'];
14
+ const LANGUAGE = _IMPConst.LANGUAGE = ['ko', 'en'];
15
+ const EN_AVAILABLE_PG = _IMPConst.EN_AVAILABLE_PG = ['inicis', 'html5_inicis', 'uplus', 'nice', 'eximbay'];
16
+ const CARRIERS = _IMPConst.CARRIERS = ['SKT', 'KTF', 'LGT', 'MVNO'];
17
+ const ANDROID_MARKET_PREFIX = _IMPConst.ANDROID_MARKET_PREFIX = 'market://details?id=';
18
+ const IOS_MARKET_PREFIX = _IMPConst.IOS_MARKET_PREFIX = 'https://apps.apple.com/app/';
19
+ const M_REDIRECT_URL = _IMPConst.M_REDIRECT_URL = 'http://detectchangingwebview/iamport/rn';
20
+ const NICE_TRANS_URL = _IMPConst.NICE_TRANS_URL = 'https://web.nicepay.co.kr/smart/bank/payTrans.jsp';
21
+ const IMP_SDK_URL = _IMPConst.IMP_SDK_URL = 'https://service.iamport.kr';
22
+ const SMILEPAY_BASE_URL = _IMPConst.SMILEPAY_BASE_URL = 'https://www.mysmilepay.com';
23
+ const WEBVIEW_SOURCE_HTML = _IMPConst.WEBVIEW_SOURCE_HTML = `
24
+ <html>
25
+ <head>
26
+ <meta http-equiv='content-type' content='text/html; charset=utf-8'>
27
+ <meta name='viewport' content='width=device-width, initial-scale=1.0'>
28
+
29
+ <script type='text/javascript' src='https://code.jquery.com/jquery-latest.min.js' ></script>
30
+ <script type='text/javascript' src='https://cdn.iamport.kr/js/iamport.payment-1.1.8.js'></script>
31
+ </head>
32
+ <body></body>
33
+ </html>
34
+ `;
35
+ const ANDROID_APPSCHEME = _IMPConst.ANDROID_APPSCHEME = {
36
+ ISP: 'ispmobile',
37
+ BANKPAY: 'kftc-bankpay',
38
+ KB_BANKPAY: 'kb-bankpay',
39
+ NH_BANKPAY: 'nhb-bankpay',
40
+ MG_BANKPAY: 'mg-bankpay',
41
+ KN_BANKPAY: 'kn-bankpay',
42
+ KAKAOPAY: 'kakaotalk',
43
+ SMILEPAY: 'smilepayapp',
44
+ CHAIPAY: 'chaipayment',
45
+ PAYCO: 'payco',
46
+ HYUNDAICARD: 'hdcardappcardansimclick',
47
+ TOSS: 'supertoss',
48
+ SHINHANCARD: 'shinhan-sr-ansimclick',
49
+ HANACARD: 'cloudpay',
50
+ SAMSUNGCARD: 'mpocket.online.ansimclick',
51
+ KBCARD: 'kb-acp',
52
+ NHCARD: 'nhallonepayansimclick',
53
+ CITICARD: 'citimobileapp',
54
+ LOTTECARD: 'lotteappcard',
55
+ LPAY: 'lpayapp',
56
+ SSGPAY: 'shinsegaeeasypayment',
57
+ KPAY: 'kpay',
58
+ PAYNOW: 'lguthepay-xpay',
59
+ WOORIWONCARD: 'com.wooricard.smartapp',
60
+ LPOINT: 'lmslpay',
61
+ KTFAUTH: 'ktauthexternalcall',
62
+ LGTAUTH: 'upluscorporation',
63
+ SKTAUTH: 'tauthlink'
64
+ };
65
+ const ANDROID_PACKAGE = _IMPConst.ANDROID_PACKAGE = {
66
+ PACKAGE_ISP: 'kvp.jjy.MispAndroid320',
67
+ PACKAGE_BANKPAY: 'com.kftc.bankpay.android',
68
+ PACKAGE_KB_BANKPAY: 'com.kbstar.liivbank',
69
+ PACKAGE_NH_BANKPAY: 'com.nh.cashcardapp',
70
+ PACKAGE_MG_BANKPAY: 'kr.co.kfcc.mobilebank',
71
+ PACKAGE_KN_BANKPAY: 'com.knb.psb',
72
+ PACKAGE_KAKAOPAY: 'com.kakao.talk',
73
+ PACKAGE_SMILEPAY: 'com.mysmilepay.app',
74
+ PACKAGE_CHAIPAY: 'finance.chai.app',
75
+ PACKAGE_PAYCO: 'com.nhnent.payapp',
76
+ PACKAGE_HYUNDAICARD: 'com.hyundaicard.appcard',
77
+ PACKAGE_TOSS: 'viva.republica.toss',
78
+ PACKAGE_SHINHANCARD: 'com.shcard.smartpay',
79
+ PACKAGE_HANACARD: 'com.hanaskard.paycla',
80
+ PACKAGE_SAMSUNGCARD: 'kr.co.samsungcard.mpocket',
81
+ PACKAGE_KBCARD: 'com.kbcard.cxh.appcard',
82
+ PACKAGE_NHCARD: 'nh.smart.nhallonepay',
83
+ PACKAGE_CITICARD: 'kr.co.citibank.citimobile',
84
+ PACKAGE_LOTTECARD: 'com.lcacApp',
85
+ PACKAGE_LPAY: 'com.lotte.lpay',
86
+ PACKAGE_SSGPAY: 'com.ssg.serviceapp.android.egiftcertificate',
87
+ PACKAGE_KPAY: 'com.inicis.kpay',
88
+ PACKAGE_PAYNOW: 'com.lguplus.paynow',
89
+ PACKAGE_WOORIWONCARD: 'com.wooricard.smartapp',
90
+ PACKAGE_LPOINT: 'com.lottemembers.android',
91
+ PACKAGE_KTFAUTH: 'com.kt.ktauth',
92
+ PACKAGE_LGTAUTH: 'com.lguplus.smartotp',
93
+ PACKAGE_SKTAUTH: 'com.sktelecom.tauth'
94
+ };
95
+ })(IMPConst || (IMPConst = {}));
96
+
97
+ export { IMPConst };
98
+ //# sourceMappingURL=index.js.map