@deuna/react-native-sdk 1.0.2 → 1.0.4

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 (115) hide show
  1. package/README.md +21 -0
  2. package/lib/module/DeunaSDK.js +96 -75
  3. package/lib/module/DeunaSDK.js.map +1 -1
  4. package/lib/module/components/DeunaWidget.js +54 -26
  5. package/lib/module/components/DeunaWidget.js.map +1 -1
  6. package/lib/module/components/ExternalUrlWebView.js +56 -0
  7. package/lib/module/components/ExternalUrlWebView.js.map +1 -0
  8. package/lib/module/controllers/BaseWebViewController.js +21 -20
  9. package/lib/module/controllers/BaseWebViewController.js.map +1 -1
  10. package/lib/module/controllers/ElementsWidgetController.js +5 -5
  11. package/lib/module/controllers/ElementsWidgetController.js.map +1 -1
  12. package/lib/module/controllers/{OpenInNewTabController.js → ExternalUrlController.js} +4 -4
  13. package/lib/module/controllers/ExternalUrlController.js.map +1 -0
  14. package/lib/module/controllers/PaymentWidgetController.js +5 -4
  15. package/lib/module/controllers/PaymentWidgetController.js.map +1 -1
  16. package/lib/module/helpers/Completer.js +2 -2
  17. package/lib/module/helpers/Completer.js.map +1 -1
  18. package/lib/module/helpers/CrossPlatformBrowser.js +51 -0
  19. package/lib/module/helpers/CrossPlatformBrowser.js.map +1 -0
  20. package/lib/module/helpers/ExternalUrlHelper.js +96 -0
  21. package/lib/module/helpers/ExternalUrlHelper.js.map +1 -0
  22. package/lib/module/helpers/SubmitStrategy.js +44 -0
  23. package/lib/module/helpers/SubmitStrategy.js.map +1 -0
  24. package/lib/module/helpers/ViewManager.js +32 -0
  25. package/lib/module/helpers/ViewManager.js.map +1 -0
  26. package/lib/module/helpers/{getController.js → buildDeunaWidgetController.js} +12 -4
  27. package/lib/module/helpers/buildDeunaWidgetController.js.map +1 -0
  28. package/lib/module/helpers/getSubmitStrategy.js +32 -0
  29. package/lib/module/helpers/getSubmitStrategy.js.map +1 -0
  30. package/lib/module/interfaces/constants.js +2 -0
  31. package/lib/module/interfaces/constants.js.map +1 -1
  32. package/lib/module/interfaces/types.js.map +1 -1
  33. package/lib/module/types/helpers/buildElementsLink.js +3 -1
  34. package/lib/module/types/helpers/buildElementsLink.js.map +1 -1
  35. package/lib/module/types/helpers/buildPaymentLink.js +3 -1
  36. package/lib/module/types/helpers/buildPaymentLink.js.map +1 -1
  37. package/lib/module/types/helpers/buildVoucherLink.js +3 -1
  38. package/lib/module/types/helpers/buildVoucherLink.js.map +1 -1
  39. package/lib/module/types/helpers/constants.js +4 -0
  40. package/lib/module/types/helpers/constants.js.map +1 -0
  41. package/lib/module/types/helpers/urlConfig.js +1 -1
  42. package/lib/module/types/helpers/urlConfig.js.map +1 -1
  43. package/lib/typescript/deuna-sdk-react-native/src/DeunaSDK.d.ts +14 -13
  44. package/lib/typescript/deuna-sdk-react-native/src/DeunaSDK.d.ts.map +1 -1
  45. package/lib/typescript/deuna-sdk-react-native/src/components/DeunaWidget.d.ts.map +1 -1
  46. package/lib/typescript/deuna-sdk-react-native/src/components/ExternalUrlWebView.d.ts +7 -0
  47. package/lib/typescript/deuna-sdk-react-native/src/components/ExternalUrlWebView.d.ts.map +1 -0
  48. package/lib/typescript/deuna-sdk-react-native/src/controllers/BaseWebViewController.d.ts +7 -6
  49. package/lib/typescript/deuna-sdk-react-native/src/controllers/BaseWebViewController.d.ts.map +1 -1
  50. package/lib/typescript/deuna-sdk-react-native/src/controllers/ElementsWidgetController.d.ts +3 -1
  51. package/lib/typescript/deuna-sdk-react-native/src/controllers/ElementsWidgetController.d.ts.map +1 -1
  52. package/lib/typescript/deuna-sdk-react-native/src/controllers/{OpenInNewTabController.d.ts → ExternalUrlController.d.ts} +2 -2
  53. package/lib/typescript/deuna-sdk-react-native/src/controllers/ExternalUrlController.d.ts.map +1 -0
  54. package/lib/typescript/deuna-sdk-react-native/src/controllers/PaymentWidgetController.d.ts +3 -2
  55. package/lib/typescript/deuna-sdk-react-native/src/controllers/PaymentWidgetController.d.ts.map +1 -1
  56. package/lib/typescript/deuna-sdk-react-native/src/helpers/CrossPlatformBrowser.d.ts +25 -0
  57. package/lib/typescript/deuna-sdk-react-native/src/helpers/CrossPlatformBrowser.d.ts.map +1 -0
  58. package/lib/typescript/deuna-sdk-react-native/src/helpers/ExternalUrlHelper.d.ts +48 -0
  59. package/lib/typescript/deuna-sdk-react-native/src/helpers/ExternalUrlHelper.d.ts.map +1 -0
  60. package/lib/typescript/deuna-sdk-react-native/src/helpers/SubmitStrategy.d.ts +23 -0
  61. package/lib/typescript/deuna-sdk-react-native/src/helpers/SubmitStrategy.d.ts.map +1 -0
  62. package/lib/typescript/deuna-sdk-react-native/src/helpers/ViewManager.d.ts +19 -0
  63. package/lib/typescript/deuna-sdk-react-native/src/helpers/ViewManager.d.ts.map +1 -0
  64. package/lib/typescript/deuna-sdk-react-native/src/helpers/{getController.d.ts → buildDeunaWidgetController.d.ts} +2 -2
  65. package/lib/typescript/deuna-sdk-react-native/src/helpers/buildDeunaWidgetController.d.ts.map +1 -0
  66. package/lib/typescript/deuna-sdk-react-native/src/helpers/getSubmitStrategy.d.ts +4 -0
  67. package/lib/typescript/deuna-sdk-react-native/src/helpers/getSubmitStrategy.d.ts.map +1 -0
  68. package/lib/typescript/deuna-sdk-react-native/src/interfaces/constants.d.ts +2 -0
  69. package/lib/typescript/deuna-sdk-react-native/src/interfaces/constants.d.ts.map +1 -1
  70. package/lib/typescript/deuna-sdk-react-native/src/interfaces/types.d.ts +6 -0
  71. package/lib/typescript/deuna-sdk-react-native/src/interfaces/types.d.ts.map +1 -1
  72. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/buildElementsLink.d.ts.map +1 -1
  73. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/buildPaymentLink.d.ts.map +1 -1
  74. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/buildVoucherLink.d.ts.map +1 -1
  75. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/constants.d.ts +2 -0
  76. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/constants.d.ts.map +1 -0
  77. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/urlConfig.d.ts +1 -0
  78. package/lib/typescript/deuna-sdk-react-native/src/types/helpers/urlConfig.d.ts.map +1 -1
  79. package/lib/typescript/deuna-sdk-react-native/src/types/interfaces/callbacks.d.ts +8 -0
  80. package/lib/typescript/deuna-sdk-react-native/src/types/interfaces/callbacks.d.ts.map +1 -1
  81. package/lib/typescript/deuna-sdk-react-native/src/types/interfaces/initWidgetBase.d.ts +1 -0
  82. package/lib/typescript/deuna-sdk-react-native/src/types/interfaces/initWidgetBase.d.ts.map +1 -1
  83. package/package.json +7 -5
  84. package/src/DeunaSDK.ts +115 -83
  85. package/src/components/DeunaWidget.tsx +75 -35
  86. package/src/components/ExternalUrlWebView.tsx +65 -0
  87. package/src/controllers/BaseWebViewController.ts +28 -27
  88. package/src/controllers/ElementsWidgetController.ts +8 -6
  89. package/src/controllers/{OpenInNewTabController.ts → ExternalUrlController.ts} +3 -3
  90. package/src/controllers/PaymentWidgetController.ts +12 -5
  91. package/src/helpers/Completer.ts +2 -2
  92. package/src/helpers/CrossPlatformBrowser.ts +49 -0
  93. package/src/helpers/ExternalUrlHelper.ts +118 -0
  94. package/src/helpers/SubmitStrategy.ts +67 -0
  95. package/src/helpers/ViewManager.ts +45 -0
  96. package/src/helpers/{getController.ts → buildDeunaWidgetController.ts} +11 -4
  97. package/src/helpers/getSubmitStrategy.ts +42 -0
  98. package/src/interfaces/constants.ts +5 -1
  99. package/src/interfaces/types.ts +8 -0
  100. package/src/types/helpers/buildElementsLink.ts +4 -1
  101. package/src/types/helpers/buildPaymentLink.ts +2 -0
  102. package/src/types/helpers/buildVoucherLink.ts +2 -0
  103. package/src/types/helpers/constants.ts +1 -0
  104. package/src/types/helpers/urlConfig.ts +3 -1
  105. package/src/types/interfaces/callbacks.ts +10 -1
  106. package/src/types/interfaces/initWidgetBase.ts +1 -0
  107. package/lib/module/components/NewTabWebView.js +0 -56
  108. package/lib/module/components/NewTabWebView.js.map +0 -1
  109. package/lib/module/controllers/OpenInNewTabController.js.map +0 -1
  110. package/lib/module/helpers/getController.js.map +0 -1
  111. package/lib/typescript/deuna-sdk-react-native/src/components/NewTabWebView.d.ts +0 -7
  112. package/lib/typescript/deuna-sdk-react-native/src/components/NewTabWebView.d.ts.map +0 -1
  113. package/lib/typescript/deuna-sdk-react-native/src/controllers/OpenInNewTabController.d.ts.map +0 -1
  114. package/lib/typescript/deuna-sdk-react-native/src/helpers/getController.d.ts.map +0 -1
  115. package/src/components/NewTabWebView.tsx +0 -64
@@ -15,11 +15,16 @@ interface OnInstallmentSelectedPayload {
15
15
  cardBin: string;
16
16
  installmentPlanOptionId: string;
17
17
  }
18
+ interface Dimensions {
19
+ height: number;
20
+ width: number;
21
+ }
18
22
  interface BaseCallbacks {
19
23
  onSuccess?: (data: Json) => void;
20
24
  onError?: (data: OnError) => void;
21
25
  onClosed?: (action: ClosedAction) => void;
22
26
  onEventDispatch?: (event: string, payload: Json) => void;
27
+ onResize?: (dimensions: Dimensions) => void;
23
28
  }
24
29
  export interface PaymentWidgetCallbacks extends BaseCallbacks {
25
30
  onCardBinDetected?: (data: OnCardBinDetected) => void;
@@ -33,6 +38,9 @@ export interface ElementsWidgetCallbacks extends BaseCallbacks {
33
38
  export interface NextActionWidgetCallbacks extends BaseCallbacks {
34
39
  }
35
40
  export interface VoucherWidgetCallbacks extends BaseCallbacks {
41
+ onCardBinDetected?: (data: OnCardBinDetected) => void;
42
+ onInstallmentSelected?: (data: OnInstallmentSelectedPayload) => void;
43
+ onPaymentProcessing?: () => void;
36
44
  }
37
45
  export {};
38
46
  //# sourceMappingURL=callbacks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"callbacks.d.ts","sourceRoot":"","sources":["../../../../../../src/types/interfaces/callbacks.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,cAAc,CAAC;AAEzD,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,4BAA4B;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,IAAI,CAAC;IACrE,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACtE;AAED,MAAM,WAAW,yBAA0B,SAAQ,aAAa;CAAG;AAEnE,MAAM,WAAW,sBAAuB,SAAQ,aAAa;CAAG"}
1
+ {"version":3,"file":"callbacks.d.ts","sourceRoot":"","sources":["../../../../../../src/types/interfaces/callbacks.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,cAAc,CAAC;AAEzD,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEvC,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,4BAA4B;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AACD,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,IAAI,CAAC;IACrE,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACtE;AAED,MAAM,WAAW,yBAA0B,SAAQ,aAAa;CAAG;AAEnE,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,IAAI,CAAC;IACrE,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC"}
@@ -67,6 +67,7 @@ export interface InitWidgetBase {
67
67
  userInfo?: Partial<UserInfo>;
68
68
  behavior?: BehaviorWidget;
69
69
  domain?: string;
70
+ platform?: string;
70
71
  hidePayButton?: boolean;
71
72
  callbacks?: PaymentWidgetCallbacks & ElementsWidgetCallbacks & NextActionWidgetCallbacks & VoucherWidgetCallbacks;
72
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"initWidgetBase.d.ts","sourceRoot":"","sources":["../../../../../../src/types/interfaces/initWidgetBase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,KAAK,WAAW,CAAC,CAAC,IAAI;KACnB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,UAAU,QAAQ;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,cAAc,EAAE;QACd,kBAAkB,EAAE,OAAO,CAAC;QAC5B,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,KAAK,EAAE;QACL,iBAAiB,EAAE,OAAO,CAAC;KAC5B,CAAC;IACF,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,gBAAgB,EAAE,OAAO,CAAC;QAC1B,cAAc,EAAE,OAAO,CAAC;QAExB,MAAM,EAAE,GAAG,EAAE,CAAC;KACf,CAAC;CACH;AACD,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE;QACf,UAAU,CAAC,EAAE,kBAAkB,CAAC;QAChC,MAAM,CAAC,EAAE,cAAc,CAAC;QACxB,YAAY,CAAC,EAAE,oBAAoB,CAAC;QACpC,QAAQ,CAAC,EAAE,8BAA8B,CAAC;KAC3C,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,sBAAsB,GAChC,uBAAuB,GACvB,yBAAyB,GACzB,sBAAsB,CAAC;CAC1B;AAGD,KAAK,kCAAkC,GAAG,SAAS,GAAG,YAAY,CAAC;AACnE,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,kCAAkC,CAAC;CAC1C"}
1
+ {"version":3,"file":"initWidgetBase.d.ts","sourceRoot":"","sources":["../../../../../../src/types/interfaces/initWidgetBase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@deuna/react-native-sdk",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "React Native SDK",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/module/index.js",
7
7
  "types": "./lib/typescript/deuna-sdk-react-native/src/index.d.ts",
8
8
  "peerDependencies": {
9
+ "expo-web-browser": "*",
9
10
  "react": "*",
10
11
  "react-native": "*",
11
12
  "react-native-webview": "*"
@@ -56,14 +57,14 @@
56
57
  ],
57
58
  "repository": {
58
59
  "type": "git",
59
- "url": "git+https://github.com/darwinmorocho-deuna/deuna-sdk-react-native.git"
60
+ "url": "git+https://github.com/deuna-developers/deuna-sdk-react-native.git"
60
61
  },
61
- "author": "DEUNA <dmorocho@deuna.com> (https://github.com/darwinmorocho-deuna)",
62
+ "author": "DEUNA (https://github.com/deuna-developers)",
62
63
  "license": "MIT",
63
64
  "bugs": {
64
- "url": "https://github.com/darwinmorocho-deuna/deuna-sdk-react-native/issues"
65
+ "url": "https://github.com/deuna-developers/deuna-sdk-react-native/issues"
65
66
  },
66
- "homepage": "https://github.com/darwinmorocho-deuna/deuna-sdk-react-native#readme",
67
+ "homepage": "https://github.com/deuna-developers/deuna-sdk-react-native#readme",
67
68
  "publishConfig": {
68
69
  "registry": "https://registry.npmjs.org/"
69
70
  },
@@ -82,6 +83,7 @@
82
83
  "eslint": "^9.22.0",
83
84
  "eslint-config-prettier": "^10.1.1",
84
85
  "eslint-plugin-prettier": "^5.2.3",
86
+ "expo-web-browser": "14.1.6",
85
87
  "jest": "^29.7.0",
86
88
  "prettier": "^3.0.3",
87
89
  "react": "18.3.1",
package/src/DeunaSDK.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  BaseDeuna,
3
+ ClosedAction,
3
4
  CustomStyles,
4
5
  GetStateFn,
5
6
  InitElementsWidgetParams,
@@ -18,27 +19,34 @@ import {
18
19
  VoucherWidgetCallbacks,
19
20
  } from './types';
20
21
  import {
21
- BaseWebViewController,
22
22
  DeunaWebViewController,
23
23
  WebViewDelegate,
24
24
  } from './controllers/BaseWebViewController';
25
25
  import { PaymentWidgetController } from './controllers/PaymentWidgetController';
26
- import { OpenInNewTabController } from './controllers/OpenInNewTabController';
27
- import { getWidgetController } from './helpers/getController';
28
- import { Completer } from './helpers/Completer';
26
+ import { buildDeunaWidgetController } from './helpers/buildDeunaWidgetController';
29
27
  import { ElementsWidgetController } from './controllers/ElementsWidgetController';
30
28
  import { DownloadType, Mode, OnDownloadFile } from './interfaces/types';
31
- import { Platform } from 'react-native';
32
29
  import { DeviceFingerprintController } from './controllers/DeviceFingerprintController';
33
- import { DEVICE_FINGERPRINT_URL } from './interfaces/constants';
30
+ import {
31
+ DEVICE_FINGERPRINT_URL,
32
+ DOMAINS_MUST_BE_USE_CROSS_PLATFORM_BROWSER,
33
+ } from './interfaces/constants';
34
+ import { SubmitStrategy } from './helpers/SubmitStrategy';
35
+ import { getSubmitStrategy } from './helpers/getSubmitStrategy';
36
+ import { WebViewManager } from './helpers/ViewManager';
37
+ import {
38
+ ExternalUrlBrowser,
39
+ ExternalUrlHelper,
40
+ } from './helpers/ExternalUrlHelper';
34
41
 
35
42
  export class DeunaSDK extends BaseDeuna {
36
- constructor(private readonly config: InitializeParams) {
43
+ constructor(
44
+ readonly config: InitializeParams,
45
+ readonly onDestroyed?: () => void
46
+ ) {
37
47
  super();
38
48
  }
39
49
 
40
- mode: Mode | null = null;
41
-
42
50
  setCustomStyleFn?: SetCustomStyle | undefined;
43
51
  refetchOrderFn?: RefetchOrder | undefined;
44
52
  getStateFn?: GetStateFn | undefined;
@@ -47,22 +55,12 @@ export class DeunaSDK extends BaseDeuna {
47
55
  closeFn?: (() => void) | undefined;
48
56
 
49
57
  private listeners: Set<() => void> = new Set();
50
- webViewController: DeunaWebViewController | null = null;
51
- newTabWebViewController: BaseWebViewController | null = null;
52
- deviceFingerprintController: DeviceFingerprintController | null = null;
53
58
 
54
- modalDismissPromise: Completer<void> | null = null;
55
- newTabModalDismissPromise: Completer<void> | null = null;
59
+ deunaWidgetManager = new WebViewManager<DeunaWebViewController>();
60
+ externalUrlHelper = new ExternalUrlHelper();
56
61
 
57
- private get safeWebViewController(): DeunaWebViewController {
58
- if (!this.webViewController) {
59
- const errorMessage =
60
- 'A variant of the init method must be called first. Please call initPaymentWidget, initVoucherWidget, or another init method before using this functionality.';
61
- console.error(errorMessage);
62
- throw new Error(errorMessage);
63
- }
64
- return this.webViewController;
65
- }
62
+ deviceFingerprintController: DeviceFingerprintController | null = null;
63
+ submitStrategy: SubmitStrategy | null = null;
66
64
 
67
65
  /**
68
66
  * Generates a device fingerprint, creates a invisible webview to get the device fingerprint
@@ -102,12 +100,11 @@ export class DeunaSDK extends BaseDeuna {
102
100
  mode?: Mode;
103
101
  }): void => {
104
102
  const { controller, mode } = params;
105
- this.mode = mode ?? Mode.MODAL;
106
- if (this.mode === Mode.MODAL && Platform.OS === 'ios') {
107
- this.modalDismissPromise = new Completer<void>();
108
- }
109
- this.webViewController = controller;
110
- this.webViewController.delegate = this.buildDelegate();
103
+ this.deunaWidgetManager.initialize({
104
+ controller,
105
+ mode: mode ?? Mode.MODAL,
106
+ delegate: this.buildDelegate(),
107
+ });
111
108
  this.notifyListeners();
112
109
  };
113
110
 
@@ -123,7 +120,7 @@ export class DeunaSDK extends BaseDeuna {
123
120
  }
124
121
  ) {
125
122
  this.setWidgetController({
126
- controller: getWidgetController(this.config, {
123
+ controller: buildDeunaWidgetController(this.config, {
127
124
  widget: 'payment',
128
125
  ...props,
129
126
  }),
@@ -140,7 +137,7 @@ export class DeunaSDK extends BaseDeuna {
140
137
  props: InitElementsWidgetParams & { mode?: Mode; sessionId?: string }
141
138
  ) {
142
139
  this.setWidgetController({
143
- controller: getWidgetController(this.config, {
140
+ controller: buildDeunaWidgetController(this.config, {
144
141
  widget: 'elements',
145
142
  ...props,
146
143
  }),
@@ -155,7 +152,7 @@ export class DeunaSDK extends BaseDeuna {
155
152
  */
156
153
  async initNextAction(props: InitNextActionWidgetParams & { mode: Mode }) {
157
154
  this.setWidgetController({
158
- controller: getWidgetController(this.config, {
155
+ controller: buildDeunaWidgetController(this.config, {
159
156
  widget: 'nextAction',
160
157
  ...props,
161
158
  }),
@@ -175,7 +172,7 @@ export class DeunaSDK extends BaseDeuna {
175
172
  }
176
173
  ) {
177
174
  this.setWidgetController({
178
- controller: getWidgetController(this.config, {
175
+ controller: buildDeunaWidgetController(this.config, {
179
176
  widget: 'voucher',
180
177
  ...props,
181
178
  }),
@@ -184,60 +181,80 @@ export class DeunaSDK extends BaseDeuna {
184
181
  }
185
182
 
186
183
  isValid = async (): Promise<boolean> => {
187
- return this.safeWebViewController.isValid();
184
+ return this.deunaWidgetManager.controller.isValid();
188
185
  };
189
186
 
190
187
  submit = async (): Promise<SubmitResult> => {
191
- return this.safeWebViewController.submit();
188
+ this.getStateFn = () => this.getWidgetState();
189
+ const submitStrategy = await getSubmitStrategy(this);
190
+
191
+ if (!submitStrategy) {
192
+ return this.deunaWidgetManager.controller.submit();
193
+ }
194
+
195
+ this.submitStrategy = submitStrategy;
196
+ this.notifyListeners();
197
+ return this.submitStrategy.submit();
192
198
  };
193
199
 
194
200
  setCustomStyle = async (style: Partial<CustomStyles>): Promise<void> => {
195
- return this.safeWebViewController.setCustomStyle(style);
201
+ return this.deunaWidgetManager.controller.setCustomStyle(style);
196
202
  };
197
203
 
198
204
  refetchOrder = async (): Promise<Json | null> => {
199
- return this.safeWebViewController.refetchOrder();
205
+ return this.deunaWidgetManager.controller.refetchOrder();
200
206
  };
201
207
 
202
208
  getWidgetState = async (): Promise<State> => {
203
- return this.safeWebViewController.getWidgetState();
209
+ return this.deunaWidgetManager.controller.getWidgetState();
204
210
  };
205
211
 
206
212
  /**
207
213
  * Closes the DEUNA widget and releases the resources
208
214
  */
209
215
  close = async (): Promise<void> => {
210
- if (this.webViewController instanceof PaymentWidgetController) {
211
- this.webViewController.callbacks.onClosed?.(
212
- this.webViewController.closedAction
213
- );
214
- } else if (this.webViewController instanceof ElementsWidgetController) {
215
- this.webViewController.callbacks.onClosed?.(
216
- this.webViewController.closedAction
217
- );
216
+ if (!this.deunaWidgetManager.isInitialized) {
217
+ return;
218
218
  }
219
- this.onCloseNewTab();
220
- await this.newTabModalDismissPromise?.wait;
221
- this.newTabWebViewController?.dispose();
222
-
223
- this.webViewController?.dispose();
224
- // reset all prop
225
- this.newTabWebViewController = null;
226
- this.webViewController = null;
227
- this.mode = null;
228
- this.notifyListeners();
229
219
 
230
- // if the widget was shown in modal mode, wait for the modal to be dismissed
231
- await this.modalDismissPromise?.wait;
232
- this.modalDismissPromise = null;
233
- };
220
+ try {
221
+ let onClosedCallback: ((action: ClosedAction) => void) | undefined;
222
+ const closedAction = this.deunaWidgetManager.controller.closedAction;
234
223
 
235
- onModalDismissed = () => {
236
- this.modalDismissPromise?.complete();
237
- };
224
+ if (
225
+ this.deunaWidgetManager.controller instanceof PaymentWidgetController
226
+ ) {
227
+ onClosedCallback =
228
+ this.deunaWidgetManager.controller.callbacks.onClosed;
229
+ } else if (
230
+ this.deunaWidgetManager.controller instanceof ElementsWidgetController
231
+ ) {
232
+ onClosedCallback =
233
+ this.deunaWidgetManager.controller.callbacks.onClosed;
234
+ }
235
+
236
+ // If the external url was opened in a Safari View Controller or a Custom Chrome Tab
237
+ // we need to wait until the browser is dismissed
238
+ await this.externalUrlHelper.waitForClose();
239
+
240
+ // Destroy the main webview and dismiss the modal
241
+ this.deunaWidgetManager.destroy();
242
+
243
+ // Close the submit strategy if it exists
244
+ await this.submitStrategy?.deunaSDK.close();
245
+ this.submitStrategy = null;
238
246
 
239
- onNewTabDismissed = () => {
240
- this.newTabModalDismissPromise?.complete();
247
+ // Notify listeners that the widget has been closed
248
+ this.notifyListeners();
249
+
250
+ // Notify the user that the widget has been closed
251
+ this.onDestroyed?.();
252
+
253
+ // Notify the widget that the user has closed the widget
254
+ onClosedCallback?.(closedAction);
255
+ } catch (error) {
256
+ console.error('Error closing the widget', error);
257
+ }
241
258
  };
242
259
 
243
260
  addListener = (listener: () => void) => {
@@ -253,21 +270,22 @@ export class DeunaSDK extends BaseDeuna {
253
270
  };
254
271
 
255
272
  private notifyDownloadFile = (url: string) => {
256
- if (this.safeWebViewController instanceof PaymentWidgetController) {
257
- this.safeWebViewController.callbacks.onDownloadFile?.({
273
+ if (this.deunaWidgetManager.controller instanceof PaymentWidgetController) {
274
+ this.deunaWidgetManager.controller.callbacks.onDownloadFile?.({
258
275
  type: DownloadType.URL,
259
276
  data: url,
260
277
  });
261
278
  }
262
279
  };
263
280
 
264
- onCloseNewTab = () => {
265
- if (this.webViewController) {
266
- this.webViewController.redirectUrl = null;
281
+ /**
282
+ * Closes the external URL Webview
283
+ */
284
+ onCloseExternalUrl = async () => {
285
+ if (this.externalUrlHelper.externalUrlWebViewController) {
286
+ await this.externalUrlHelper.closeWebView();
287
+ this.notifyListeners();
267
288
  }
268
- this.newTabWebViewController?.dispose();
269
- this.newTabWebViewController = null;
270
- this.notifyListeners();
271
289
  };
272
290
 
273
291
  /**
@@ -278,19 +296,33 @@ export class DeunaSDK extends BaseDeuna {
278
296
  */
279
297
  buildDelegate = (): WebViewDelegate => {
280
298
  return {
281
- onOpenInNewTab: (url) => {
282
- this.newTabWebViewController = new OpenInNewTabController(url);
283
- if (Platform.OS === 'ios') {
284
- this.newTabModalDismissPromise = new Completer<void>();
299
+ onOpenExternalUrl: (url) => {
300
+ try {
301
+ const host = new URL(url).host;
302
+ let browser = ExternalUrlBrowser.WEB_VIEW;
303
+ // Check if the URL is from a domain that must be opened in a cross platform browser (SafariView or Chrome Custom Tab)
304
+ for (const domain of DOMAINS_MUST_BE_USE_CROSS_PLATFORM_BROWSER) {
305
+ if (host.includes(domain)) {
306
+ browser = ExternalUrlBrowser.CROSS_PLATFORM_BROWSER;
307
+ break;
308
+ }
309
+ }
310
+
311
+ this.externalUrlHelper.openUrl({
312
+ url,
313
+ browser,
314
+ delegate: {
315
+ onCloseExternalUrl: this.onCloseExternalUrl,
316
+ onFileDownload: this.notifyDownloadFile,
317
+ },
318
+ });
319
+ this.notifyListeners();
320
+ } catch (error) {
321
+ console.error('Error opening external URL', error);
285
322
  }
286
- this.newTabWebViewController.delegate = {
287
- onFileDownload: this.notifyDownloadFile,
288
- onNewTabWindowClose: this.onCloseNewTab,
289
- };
290
- this.notifyListeners();
291
323
  },
324
+ onCloseExternalUrl: this.onCloseExternalUrl,
292
325
  onCloseButtonPressed: this.close, // Close the payment widget when the user presses the close button
293
- onCloseSubWebView: this.onCloseNewTab, // Close the new tab web view when the DEUNA widget emits an error event or when the purchase is successful
294
326
  onFileDownload: this.notifyDownloadFile, // Notify the user when a request to download a file is made
295
327
  };
296
328
  };
@@ -3,10 +3,9 @@ import { useEffect, useRef, useState } from 'react';
3
3
 
4
4
  import { DeunaSDK } from '../DeunaSDK';
5
5
  import { DeunaWebView } from './DeunaWebView';
6
- import { NewTabWebView } from './NewTabWebView';
7
- import { DeunaWebViewController } from '../controllers/BaseWebViewController';
8
6
  import { Mode } from '../interfaces/types';
9
7
  import { DeviceFingerprintWebView } from './DeviceFingerprintWebView';
8
+ import { ExternalUrlWebView } from './ExternalUrlWebView';
10
9
 
11
10
  interface DeunaWidgetProps {
12
11
  instance: DeunaSDK;
@@ -15,7 +14,46 @@ interface DeunaWidgetProps {
15
14
  export const DeunaWidget = (props: DeunaWidgetProps) => {
16
15
  const { instance } = props;
17
16
  const instanceRef = useRef(instance);
18
- const [mode, setMode] = useState<Mode | null>(instance.mode);
17
+ const [showPaymentStrategy, setShowPaymentStrategy] = useState(false);
18
+
19
+ useEffect(() => {
20
+ instanceRef.current = instance;
21
+ }, [instance]);
22
+
23
+ useEffect(() => {
24
+ const listener = () => {
25
+ setShowPaymentStrategy(instanceRef.current.submitStrategy !== null);
26
+ };
27
+
28
+ instanceRef.current.addListener(listener);
29
+
30
+ return () => {
31
+ instanceRef.current.removeListener(listener);
32
+ };
33
+ }, []);
34
+
35
+ return (
36
+ <>
37
+ <DeunaWidgetContainer
38
+ key="MainDeunaWidget"
39
+ instance={instanceRef.current}
40
+ />
41
+ {showPaymentStrategy && (
42
+ <DeunaWidgetContainer
43
+ key="PaymentStrategy"
44
+ instance={instanceRef.current.submitStrategy!.deunaSDK}
45
+ />
46
+ )}
47
+ </>
48
+ );
49
+ };
50
+
51
+ const DeunaWidgetContainer = (props: DeunaWidgetProps) => {
52
+ const { instance } = props;
53
+ const instanceRef = useRef(instance);
54
+ const [isVisible, setIsVisible] = useState(
55
+ instanceRef.current.deunaWidgetManager.isInitialized
56
+ );
19
57
 
20
58
  useEffect(() => {
21
59
  instanceRef.current = instance;
@@ -25,74 +63,76 @@ export const DeunaWidget = (props: DeunaWidgetProps) => {
25
63
  // has changed
26
64
  useEffect(() => {
27
65
  const listener = () => {
28
- setMode(instanceRef.current.mode);
66
+ setIsVisible(instanceRef.current.deunaWidgetManager.isInitialized);
29
67
  };
30
68
 
31
69
  instanceRef.current.addListener(listener);
32
70
 
33
71
  return () => {
34
72
  instanceRef.current.removeListener(listener);
35
- instanceRef.current.webViewController?.dispose();
73
+ if (instanceRef.current.deunaWidgetManager.isInitialized) {
74
+ instanceRef.current.deunaWidgetManager.controller?.dispose();
75
+ }
36
76
  };
37
77
  }, []);
38
78
 
39
- const isModal = mode === Mode.MODAL;
40
- const isEmbedded = mode === Mode.EMBEDDED;
41
-
42
79
  /**
43
80
  * This function is used to close the widget
44
81
  */
45
82
  const onClose = () => {
46
- const controller = instanceRef.current
47
- .webViewController as DeunaWebViewController;
83
+ const controller = instanceRef.current.deunaWidgetManager.controller;
48
84
  controller.closedAction = 'userAction';
49
85
  instanceRef.current.close();
50
86
  };
51
87
 
52
88
  // render the widget if mode is not null
89
+ const viewManager = instanceRef.current.deunaWidgetManager;
90
+ const controller = viewManager.isInitialized ? viewManager.controller : null;
91
+
92
+ const isModal = isVisible && viewManager.mode === Mode.MODAL;
93
+ const isEmbedded = isVisible && viewManager.mode === Mode.EMBEDDED;
94
+
53
95
  return (
54
96
  <>
55
- <Modal
56
- presentationStyle="pageSheet"
57
- animationType="slide"
58
- onRequestClose={onClose}
59
- onDismiss={instanceRef.current.onModalDismissed}
60
- visible={isModal}
61
- >
62
- {isModal && (
97
+ {isModal && (
98
+ <Modal
99
+ presentationStyle="pageSheet"
100
+ animationType="slide"
101
+ onRequestClose={onClose}
102
+ >
63
103
  <SafeAreaView style={styles.container}>
64
104
  <View style={styles.container}>
65
105
  <DeunaWebView
66
- url={instanceRef.current.webViewController?.url ?? ''}
67
- onWebView={instanceRef.current.webViewController?.setWebView}
68
- onMessage={instanceRef.current.webViewController?.onMessage}
69
- onLoad={instanceRef.current.webViewController?.onLoad}
70
- onError={instanceRef.current.webViewController?.onError}
106
+ url={controller?.url ?? ''}
107
+ onWebView={controller?.setWebView}
108
+ onMessage={controller?.onMessage}
109
+ onLoad={controller?.onLoad}
110
+ onError={controller?.onError}
71
111
  onShouldStartLoadWithRequest={
72
- instanceRef.current.webViewController
73
- ?.onShouldStartLoadWithRequest
112
+ controller?.onShouldStartLoadWithRequest
74
113
  }
75
114
  />
76
- <NewTabWebView instance={instanceRef.current} />
115
+ <ExternalUrlWebView instance={instanceRef.current} />
77
116
  </View>
78
117
  </SafeAreaView>
79
- )}
80
- </Modal>
118
+ </Modal>
119
+ )}
81
120
 
82
- {isEmbedded && <NewTabWebView instance={instanceRef.current} />}
121
+ {isEmbedded && <ExternalUrlWebView instance={instanceRef.current} />}
83
122
 
84
123
  {isEmbedded && (
85
124
  <DeunaWebView
86
- url={instanceRef.current.webViewController?.url ?? ''}
87
- onWebView={instanceRef.current.webViewController?.setWebView}
88
- onMessage={instanceRef.current.webViewController?.onMessage}
89
- onLoad={instanceRef.current.webViewController?.onLoad}
90
- onError={instanceRef.current.webViewController?.onError}
125
+ url={controller?.url ?? ''}
126
+ onWebView={controller?.setWebView}
127
+ onMessage={controller?.onMessage}
128
+ onLoad={controller?.onLoad}
129
+ onError={controller?.onError}
91
130
  onShouldStartLoadWithRequest={
92
- instanceRef.current.webViewController?.onShouldStartLoadWithRequest
131
+ controller?.onShouldStartLoadWithRequest
93
132
  }
94
133
  />
95
134
  )}
135
+
96
136
  <DeviceFingerprintWebView instance={instanceRef.current} />
97
137
  </>
98
138
  );
@@ -0,0 +1,65 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import { DeunaSDK } from '../DeunaSDK';
3
+ import { Modal, SafeAreaView, StyleSheet } from 'react-native';
4
+ import { DeunaWebView } from './DeunaWebView';
5
+
6
+ interface ExternalUrlWebViewProps {
7
+ instance: DeunaSDK;
8
+ }
9
+
10
+ export const ExternalUrlWebView = (props: ExternalUrlWebViewProps) => {
11
+ const { instance } = props;
12
+ const instanceRef = useRef<DeunaSDK>(instance);
13
+ const [visible, setVisible] = useState(false);
14
+
15
+ useEffect(() => {
16
+ instanceRef.current = instance;
17
+ }, [instance]);
18
+
19
+ // Listen when the DeunaSDK instance configuration
20
+ // has changed
21
+ useEffect(() => {
22
+ const ref = instanceRef.current;
23
+ const listener = () => {
24
+ const isVisible = !!ref.externalUrlHelper.externalUrlWebViewController;
25
+ setVisible(isVisible);
26
+ };
27
+
28
+ instanceRef.current.addListener(listener);
29
+
30
+ return () => {
31
+ ref.removeListener(listener);
32
+ ref.externalUrlHelper.externalUrlWebViewController?.dispose();
33
+ };
34
+ }, []);
35
+
36
+ const externalUrlWebViewController =
37
+ instanceRef.current.externalUrlHelper.externalUrlWebViewController;
38
+
39
+ return (
40
+ <>
41
+ {visible && (
42
+ <Modal
43
+ presentationStyle="pageSheet"
44
+ animationType="slide"
45
+ onRequestClose={instanceRef.current.onCloseExternalUrl}
46
+ >
47
+ <SafeAreaView style={styles.container}>
48
+ <DeunaWebView
49
+ url={externalUrlWebViewController?.url ?? ''}
50
+ onWebView={externalUrlWebViewController?.setWebView}
51
+ onMessage={externalUrlWebViewController?.onMessage}
52
+ onLoad={externalUrlWebViewController?.onLoad}
53
+ onError={externalUrlWebViewController?.onError}
54
+ onShouldStartLoadWithRequest={
55
+ externalUrlWebViewController?.onShouldStartLoadWithRequest
56
+ }
57
+ />
58
+ </SafeAreaView>
59
+ </Modal>
60
+ )}
61
+ </>
62
+ );
63
+ };
64
+
65
+ const styles = StyleSheet.create({ container: { flex: 1 } });