expo-openpay 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/.eslintrc.js +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +87 -0
  4. package/android/build.gradle +76 -0
  5. package/android/gradle.properties +2 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/java/expo/modules/openpay/ExpoOpenpayModule.kt +127 -0
  8. package/android/src/main/java/expo/modules/openpay/ExpoOpenpayView.kt +30 -0
  9. package/android/src/main/java/mx/openpay/android/BuildConfig.java +8 -0
  10. package/android/src/main/java/mx/openpay/android/DeviceCollectorDefaultImpl.java +70 -0
  11. package/android/src/main/java/mx/openpay/android/JavaScriptInterface.java +19 -0
  12. package/android/src/main/java/mx/openpay/android/OpCountry.java +24 -0
  13. package/android/src/main/java/mx/openpay/android/OpenPayResult.java +35 -0
  14. package/android/src/main/java/mx/openpay/android/Openpay.java +98 -0
  15. package/android/src/main/java/mx/openpay/android/OpenpayUrls.java +11 -0
  16. package/android/src/main/java/mx/openpay/android/OperationCallBack.java +13 -0
  17. package/android/src/main/java/mx/openpay/android/OperationResult.java +14 -0
  18. package/android/src/main/java/mx/openpay/android/exceptions/OpenpayServiceException.java +93 -0
  19. package/android/src/main/java/mx/openpay/android/exceptions/ServiceUnavailableException.java +23 -0
  20. package/android/src/main/java/mx/openpay/android/model/Address.java +123 -0
  21. package/android/src/main/java/mx/openpay/android/model/Card.java +219 -0
  22. package/android/src/main/java/mx/openpay/android/model/Token.java +43 -0
  23. package/android/src/main/java/mx/openpay/android/services/BaseService.java +93 -0
  24. package/android/src/main/java/mx/openpay/android/services/ServicesFactory.java +47 -0
  25. package/android/src/main/java/mx/openpay/android/services/TokenService.java +19 -0
  26. package/android/src/main/java/mx/openpay/android/validation/CardType.java +9 -0
  27. package/android/src/main/java/mx/openpay/android/validation/CardValidator.java +105 -0
  28. package/android/src/main/java/mx/openpay/android/validation/LuhnValidator.java +34 -0
  29. package/build/ExpoOpenpay.types.d.ts +42 -0
  30. package/build/ExpoOpenpay.types.d.ts.map +1 -0
  31. package/build/ExpoOpenpay.types.js +2 -0
  32. package/build/ExpoOpenpay.types.js.map +1 -0
  33. package/build/ExpoOpenpayModule.d.ts +10 -0
  34. package/build/ExpoOpenpayModule.d.ts.map +1 -0
  35. package/build/ExpoOpenpayModule.js +6 -0
  36. package/build/ExpoOpenpayModule.js.map +1 -0
  37. package/build/ExpoOpenpayModule.web.d.ts +10 -0
  38. package/build/ExpoOpenpayModule.web.d.ts.map +1 -0
  39. package/build/ExpoOpenpayModule.web.js +12 -0
  40. package/build/ExpoOpenpayModule.web.js.map +1 -0
  41. package/build/ExpoOpenpayView.d.ts +4 -0
  42. package/build/ExpoOpenpayView.d.ts.map +1 -0
  43. package/build/ExpoOpenpayView.js +7 -0
  44. package/build/ExpoOpenpayView.js.map +1 -0
  45. package/build/ExpoOpenpayView.web.d.ts +3 -0
  46. package/build/ExpoOpenpayView.web.d.ts.map +1 -0
  47. package/build/ExpoOpenpayView.web.js +5 -0
  48. package/build/ExpoOpenpayView.web.js.map +1 -0
  49. package/build/assets/AmexLogo.d.ts +4 -0
  50. package/build/assets/AmexLogo.d.ts.map +1 -0
  51. package/build/assets/AmexLogo.js +9 -0
  52. package/build/assets/AmexLogo.js.map +1 -0
  53. package/build/assets/MCLogo.d.ts +4 -0
  54. package/build/assets/MCLogo.d.ts.map +1 -0
  55. package/build/assets/MCLogo.js +9 -0
  56. package/build/assets/MCLogo.js.map +1 -0
  57. package/build/assets/VisaLogo.d.ts +4 -0
  58. package/build/assets/VisaLogo.d.ts.map +1 -0
  59. package/build/assets/VisaLogo.js +6 -0
  60. package/build/assets/VisaLogo.js.map +1 -0
  61. package/build/assets/index.d.ts +4 -0
  62. package/build/assets/index.d.ts.map +1 -0
  63. package/build/assets/index.js +4 -0
  64. package/build/assets/index.js.map +1 -0
  65. package/build/components/OPCardForm.d.ts +33 -0
  66. package/build/components/OPCardForm.d.ts.map +1 -0
  67. package/build/components/OPCardForm.js +120 -0
  68. package/build/components/OPCardForm.js.map +1 -0
  69. package/build/components/OPCardNumberInput.d.ts +17 -0
  70. package/build/components/OPCardNumberInput.d.ts.map +1 -0
  71. package/build/components/OPCardNumberInput.js +60 -0
  72. package/build/components/OPCardNumberInput.js.map +1 -0
  73. package/build/components/OPCvv2Input.d.ts +17 -0
  74. package/build/components/OPCvv2Input.d.ts.map +1 -0
  75. package/build/components/OPCvv2Input.js +13 -0
  76. package/build/components/OPCvv2Input.js.map +1 -0
  77. package/build/components/OPExpInput.d.ts +17 -0
  78. package/build/components/OPExpInput.d.ts.map +1 -0
  79. package/build/components/OPExpInput.js +22 -0
  80. package/build/components/OPExpInput.js.map +1 -0
  81. package/build/components/OPExpMonthInput.d.ts +17 -0
  82. package/build/components/OPExpMonthInput.d.ts.map +1 -0
  83. package/build/components/OPExpMonthInput.js +6 -0
  84. package/build/components/OPExpMonthInput.js.map +1 -0
  85. package/build/components/OPExpYearInput.d.ts +17 -0
  86. package/build/components/OPExpYearInput.d.ts.map +1 -0
  87. package/build/components/OPExpYearInput.js +6 -0
  88. package/build/components/OPExpYearInput.js.map +1 -0
  89. package/build/components/OPHolderNameInput.d.ts +17 -0
  90. package/build/components/OPHolderNameInput.d.ts.map +1 -0
  91. package/build/components/OPHolderNameInput.js +6 -0
  92. package/build/components/OPHolderNameInput.js.map +1 -0
  93. package/build/components/forms/ErrorMessage.d.ts +7 -0
  94. package/build/components/forms/ErrorMessage.d.ts.map +1 -0
  95. package/build/components/forms/ErrorMessage.js +12 -0
  96. package/build/components/forms/ErrorMessage.js.map +1 -0
  97. package/build/components/forms/FormField.d.ts +34 -0
  98. package/build/components/forms/FormField.d.ts.map +1 -0
  99. package/build/components/forms/FormField.js +33 -0
  100. package/build/components/forms/FormField.js.map +1 -0
  101. package/build/components/forms/SubmitButton.d.ts +11 -0
  102. package/build/components/forms/SubmitButton.d.ts.map +1 -0
  103. package/build/components/forms/SubmitButton.js +45 -0
  104. package/build/components/forms/SubmitButton.js.map +1 -0
  105. package/build/components/forms/Text.d.ts +7 -0
  106. package/build/components/forms/Text.d.ts.map +1 -0
  107. package/build/components/forms/Text.js +12 -0
  108. package/build/components/forms/Text.js.map +1 -0
  109. package/build/components/forms/TextInput.d.ts +30 -0
  110. package/build/components/forms/TextInput.d.ts.map +1 -0
  111. package/build/components/forms/TextInput.js +195 -0
  112. package/build/components/forms/TextInput.js.map +1 -0
  113. package/build/components/forms/index.d.ts +4 -0
  114. package/build/components/forms/index.d.ts.map +1 -0
  115. package/build/components/forms/index.js +5 -0
  116. package/build/components/forms/index.js.map +1 -0
  117. package/build/components/index.d.ts +8 -0
  118. package/build/components/index.d.ts.map +1 -0
  119. package/build/components/index.js +8 -0
  120. package/build/components/index.js.map +1 -0
  121. package/build/constants/Colors.d.ts +27 -0
  122. package/build/constants/Colors.d.ts.map +1 -0
  123. package/build/constants/Colors.js +27 -0
  124. package/build/constants/Colors.js.map +1 -0
  125. package/build/constants/Styles.d.ts +9 -0
  126. package/build/constants/Styles.d.ts.map +1 -0
  127. package/build/constants/Styles.js +9 -0
  128. package/build/constants/Styles.js.map +1 -0
  129. package/build/context/FormContext.d.ts +22 -0
  130. package/build/context/FormContext.d.ts.map +1 -0
  131. package/build/context/FormContext.js +63 -0
  132. package/build/context/FormContext.js.map +1 -0
  133. package/build/context/FormThemeContext.d.ts +20 -0
  134. package/build/context/FormThemeContext.d.ts.map +1 -0
  135. package/build/context/FormThemeContext.js +21 -0
  136. package/build/context/FormThemeContext.js.map +1 -0
  137. package/build/context/index.d.ts +4 -0
  138. package/build/context/index.d.ts.map +1 -0
  139. package/build/context/index.js +3 -0
  140. package/build/context/index.js.map +1 -0
  141. package/build/index.d.ts +6 -0
  142. package/build/index.d.ts.map +1 -0
  143. package/build/index.js +18 -0
  144. package/build/index.js.map +1 -0
  145. package/build/utility/cardBranding.d.ts +2 -0
  146. package/build/utility/cardBranding.d.ts.map +1 -0
  147. package/build/utility/cardBranding.js +2 -0
  148. package/build/utility/cardBranding.js.map +1 -0
  149. package/build/utility/formatting.d.ts +4 -0
  150. package/build/utility/formatting.d.ts.map +1 -0
  151. package/build/utility/formatting.js +20 -0
  152. package/build/utility/formatting.js.map +1 -0
  153. package/expo-module.config.json +9 -0
  154. package/ios/ExpoOpenpay.podspec +30 -0
  155. package/ios/Frameworks/OpenpayKit.xcframework/Info.plist +40 -0
  156. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Headers/OpenpayKit-Swift.h +274 -0
  157. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Info.plist +0 -0
  158. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios.abi.json +5179 -0
  159. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios.private.swiftinterface +127 -0
  160. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  161. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios.swiftinterface +127 -0
  162. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/Modules/module.modulemap +4 -0
  163. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/OpenpayKit +0 -0
  164. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/_CodeSignature/CodeResources +287 -0
  165. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/en.lproj/CardView.nib +0 -0
  166. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/en.lproj/Localizable.strings +0 -0
  167. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/es-MX.lproj/CardView.nib +0 -0
  168. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/es-MX.lproj/Localizable.strings +0 -0
  169. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/es.lproj/CardView.nib +0 -0
  170. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64/OpenpayKit.framework/es.lproj/Localizable.strings +0 -0
  171. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Headers/OpenpayKit-Swift.h +544 -0
  172. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Info.plist +0 -0
  173. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios-simulator.abi.json +5179 -0
  174. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +127 -0
  175. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  176. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/arm64-apple-ios-simulator.swiftinterface +127 -0
  177. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/x86_64-apple-ios-simulator.abi.json +5179 -0
  178. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +127 -0
  179. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  180. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/OpenpayKit.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +127 -0
  181. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/Modules/module.modulemap +4 -0
  182. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/OpenpayKit +0 -0
  183. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/_CodeSignature/CodeResources +342 -0
  184. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/en.lproj/CardView.nib +0 -0
  185. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/en.lproj/Localizable.strings +0 -0
  186. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/es-MX.lproj/CardView.nib +0 -0
  187. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/es-MX.lproj/Localizable.strings +0 -0
  188. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/es.lproj/CardView.nib +0 -0
  189. package/ios/Frameworks/OpenpayKit.xcframework/ios-arm64_x86_64-simulator/OpenpayKit.framework/es.lproj/Localizable.strings +0 -0
  190. package/ios/src/ExpoOpenpayModule.swift +105 -0
  191. package/ios/src/ExpoOpenpayView.swift +38 -0
  192. package/package.json +46 -0
  193. package/src/ExpoOpenpay.types.ts +47 -0
  194. package/src/ExpoOpenpayModule.ts +29 -0
  195. package/src/ExpoOpenpayModule.web.ts +15 -0
  196. package/src/ExpoOpenpayView.tsx +11 -0
  197. package/src/ExpoOpenpayView.web.tsx +5 -0
  198. package/src/assets/AmexLogo.tsx +24 -0
  199. package/src/assets/MCLogo.tsx +19 -0
  200. package/src/assets/VisaLogo.tsx +11 -0
  201. package/src/assets/index.ts +3 -0
  202. package/src/assets/photos/discover_logo.png +0 -0
  203. package/src/components/OPCardForm.tsx +303 -0
  204. package/src/components/OPCardNumberInput.tsx +126 -0
  205. package/src/components/OPCvv2Input.tsx +62 -0
  206. package/src/components/OPExpInput.tsx +74 -0
  207. package/src/components/OPExpMonthInput.tsx +55 -0
  208. package/src/components/OPExpYearInput.tsx +55 -0
  209. package/src/components/OPHolderNameInput.tsx +53 -0
  210. package/src/components/forms/ErrorMessage.tsx +19 -0
  211. package/src/components/forms/FormField.tsx +96 -0
  212. package/src/components/forms/SubmitButton.tsx +81 -0
  213. package/src/components/forms/Text.tsx +20 -0
  214. package/src/components/forms/TextInput.tsx +329 -0
  215. package/src/components/forms/index.ts +4 -0
  216. package/src/components/index.ts +7 -0
  217. package/src/constants/Colors.ts +26 -0
  218. package/src/constants/Styles.ts +9 -0
  219. package/src/context/FormContext.tsx +109 -0
  220. package/src/context/FormThemeContext.tsx +55 -0
  221. package/src/context/index.ts +3 -0
  222. package/src/index.ts +19 -0
  223. package/src/utility/cardBranding.ts +0 -0
  224. package/src/utility/formatting.ts +23 -0
  225. package/tsconfig.json +9 -0
@@ -0,0 +1,195 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { Animated, Image, StyleSheet, TextInput, View, } from "react-native";
3
+ import { FontAwesome6, MaterialCommunityIcons } from "@expo/vector-icons";
4
+ import Styles from "../../constants/Styles";
5
+ import { useFormThemeContext } from "../../context/FormThemeContext";
6
+ import { AmexLogo, MCLogo, VisaLogo } from "../../assets";
7
+ const cardIcons = {
8
+ amex: AmexLogo,
9
+ discover: require("../../assets/photos/discover_logo.png"),
10
+ mc: MCLogo,
11
+ visa: VisaLogo,
12
+ };
13
+ export default function AppTextInput({ defaultStyling, fieldName, icon, onBlur, onChangeText, placeholder, hasError = false, errorText = "", styling: { formFieldStyle = {}, inputStyle = {}, textInputStyle = {} } = {}, value, withAnimatedText, withIcon, withPlaceholder, ...otherProps }) {
14
+ const { formFieldBackground, formFieldErrorBorder, iconColor, iconError, placeholderColor, placeholderError, textInput, textInputCarot, } = useFormThemeContext();
15
+ const [isFocused, setIsFocused] = useState(false);
16
+ const [renderedIcon, setRenderedIcon] = useState(icon);
17
+ const activeAnim = useRef(null);
18
+ const animatedIsFlipped = useRef(new Animated.Value(icon?.type === "png" ? 1 : 0)).current;
19
+ const animatedIsFocused = useRef(new Animated.Value(value ? 1 : 0)).current;
20
+ useEffect(() => {
21
+ Animated.timing(animatedIsFocused, {
22
+ toValue: isFocused || !!value ? 1 : 0,
23
+ duration: 200,
24
+ useNativeDriver: false,
25
+ }).start();
26
+ }, [isFocused, value, animatedIsFocused]);
27
+ const placeholderStyle = {
28
+ position: "absolute",
29
+ left: animatedIsFocused.interpolate({
30
+ inputRange: [0, 1],
31
+ outputRange: [withIcon ? 40 : 15, withIcon ? 40 : 15],
32
+ }),
33
+ top: animatedIsFocused.interpolate({
34
+ inputRange: [0, 1],
35
+ outputRange: [30, 5],
36
+ }),
37
+ fontSize: animatedIsFocused.interpolate({
38
+ inputRange: [0, 1],
39
+ outputRange: [18, 12],
40
+ }),
41
+ color: animatedIsFocused.interpolate({
42
+ inputRange: [0, 1],
43
+ outputRange: [placeholderColor, placeholderColor],
44
+ }),
45
+ };
46
+ useEffect(() => {
47
+ if (icon === renderedIcon)
48
+ return;
49
+ const hasBrandIcon = icon?.type === "png";
50
+ if (activeAnim.current) {
51
+ try {
52
+ activeAnim.current.stop();
53
+ }
54
+ catch (e) {
55
+ // ignore
56
+ }
57
+ activeAnim.current = null;
58
+ }
59
+ const anim = Animated.timing(animatedIsFlipped, {
60
+ toValue: hasBrandIcon ? 1 : 0,
61
+ duration: 500,
62
+ useNativeDriver: true,
63
+ });
64
+ activeAnim.current = anim;
65
+ anim.start(({ finished }) => {
66
+ activeAnim.current = null;
67
+ if (finished) {
68
+ setRenderedIcon(icon);
69
+ }
70
+ else {
71
+ setRenderedIcon(icon);
72
+ }
73
+ });
74
+ }, [icon]);
75
+ const rotateY = animatedIsFlipped.interpolate({
76
+ inputRange: [0, 1],
77
+ outputRange: ["0deg", "180deg"],
78
+ });
79
+ const rotateYBack = animatedIsFlipped.interpolate({
80
+ inputRange: [0, 1],
81
+ outputRange: ["180deg", "360deg"],
82
+ });
83
+ const backImageSource = icon?.type === "png"
84
+ ? cardIcons[icon.name]
85
+ : renderedIcon?.type === "png"
86
+ ? cardIcons[renderedIcon.name]
87
+ : null;
88
+ const Icon = backImageSource;
89
+ console.log(Icon);
90
+ return (<View style={defaultStyling && [
91
+ styles.formFieldContainer,
92
+ { backgroundColor: formFieldBackground },
93
+ formFieldStyle,
94
+ hasError && { borderColor: formFieldErrorBorder },
95
+ ]}>
96
+ {defaultStyling && withIcon && (<View style={styles.iconContainer}>
97
+ <View style={styles.flipContainer}>
98
+ {/* Front side: generic card icon or previously rendered icon.
99
+ We use renderedIcon so the old front stays visible until animation completes */}
100
+ <Animated.View style={[
101
+ styles.face,
102
+ styles.front,
103
+ {
104
+ transform: [{ rotateY }],
105
+ },
106
+ ]}>
107
+ {/* If previously renderedIcon was a material/fa6 show it; otherwise show generic credit-card */}
108
+ {renderedIcon?.type === "material" && renderedIcon?.name ? (<MaterialCommunityIcons name={renderedIcon.name} size={25} color={hasError ? iconError : iconColor}/>) : renderedIcon?.type === "fa6" && renderedIcon?.name ? (<FontAwesome6 name={renderedIcon.name} size={21} color={hasError ? iconError : iconColor}/>) : (<MaterialCommunityIcons name="credit-card" size={25} color={hasError ? iconError : iconColor}/>)}
109
+ </Animated.View>
110
+ <Animated.View style={[
111
+ styles.face,
112
+ {
113
+ transform: [
114
+ {
115
+ rotateY: rotateYBack,
116
+ },
117
+ ],
118
+ },
119
+ ]}>
120
+ {Icon ? (typeof Icon === "function" ? (<Icon width="100%" height="100%"/>) : (<Image source={Icon} style={[
121
+ styles.logo,
122
+ (icon?.name === "visa" ||
123
+ icon?.name === "discover" ||
124
+ renderedIcon?.name === "visa" ||
125
+ renderedIcon?.name === "discover") && {
126
+ width: "70%",
127
+ height: "70%",
128
+ },
129
+ ]}/>)) : (<View style={styles.logo}/>)}
130
+ </Animated.View>
131
+ </View>
132
+ </View>)}
133
+ {withPlaceholder && withAnimatedText && (<Animated.Text pointerEvents="none" style={defaultStyling && [
134
+ placeholderStyle,
135
+ hasError && { color: placeholderError },
136
+ ]}>
137
+ {hasError ? errorText : placeholder}
138
+ </Animated.Text>)}
139
+ <TextInput onBlur={(e) => {
140
+ setIsFocused(false);
141
+ onBlur?.(e);
142
+ }} onChangeText={onChangeText} onFocus={() => setIsFocused(true)} placeholder={withPlaceholder && !withAnimatedText ? placeholder : undefined} placeholderTextColor={!withAnimatedText ? placeholderColor : undefined} selectionColor={textInputCarot} style={defaultStyling
143
+ ? [
144
+ styles.textInput,
145
+ { color: textInput },
146
+ !withIcon && { marginLeft: 15 },
147
+ textInputStyle,
148
+ ]
149
+ : textInputStyle} value={value} {...otherProps}/>
150
+ </View>);
151
+ }
152
+ const styles = StyleSheet.create({
153
+ formFieldContainer: {
154
+ borderColor: "#3c3c3c",
155
+ borderRadius: 25,
156
+ borderWidth: 1,
157
+ flexDirection: "row",
158
+ paddingVertical: 20,
159
+ marginTop: 12,
160
+ },
161
+ iconContainer: {
162
+ marginTop: 8,
163
+ width: 40,
164
+ height: 25,
165
+ justifyContent: "center",
166
+ alignItems: "center",
167
+ padding: 1,
168
+ },
169
+ textInput: { height: 40, ...Styles.text },
170
+ // Flip animation styles
171
+ flipContainer: {
172
+ width: "100%",
173
+ height: "100%",
174
+ ...{ transform: [{ perspective: 1000 }] },
175
+ },
176
+ flipCard: {
177
+ width: "100%",
178
+ height: "100%",
179
+ },
180
+ face: {
181
+ position: "absolute",
182
+ width: "100%",
183
+ height: "100%",
184
+ justifyContent: "center",
185
+ alignItems: "center",
186
+ backfaceVisibility: "hidden",
187
+ },
188
+ front: { zIndex: 2 },
189
+ logo: {
190
+ width: "100%",
191
+ height: "100%",
192
+ resizeMode: "contain",
193
+ },
194
+ });
195
+ //# sourceMappingURL=TextInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../src/components/forms/TextInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n Animated,\n Image,\n StyleProp,\n StyleSheet,\n TextInput,\n TextInputProps,\n TextStyle,\n View,\n ViewStyle,\n} from \"react-native\";\nimport { FontAwesome6, MaterialCommunityIcons } from \"@expo/vector-icons\";\n\nimport Styles from \"../../constants/Styles\";\nimport { useFormThemeContext } from \"../../context/FormThemeContext\";\nimport { AmexLogo, MCLogo, VisaLogo } from \"../../assets\";\n\ntype StylingProps = {\n formFieldStyle?: StyleProp<ViewStyle>;\n inputStyle?: StyleProp<ViewStyle>;\n textInputStyle?: StyleProp<TextStyle>;\n};\n\ntype AppTextInputProps = TextInputProps & {\n defaultStyling?: boolean;\n fieldName?: string;\n icon?:\n | { type: \"material\"; name: keyof typeof MaterialCommunityIcons.glyphMap }\n | { type: \"fa6\"; name: keyof typeof FontAwesome6.glyphMap }\n | { type: \"png\"; name: \"amex\" | \"discover\" | \"mc\" | \"visa\" };\n hasError?: boolean;\n errorText?: string;\n styling?: StylingProps;\n withAnimatedText?: boolean;\n withIcon?: boolean;\n withPlaceholder?: boolean;\n};\n\nconst cardIcons: Record<string, any> = {\n amex: AmexLogo,\n discover: require(\"../../assets/photos/discover_logo.png\"),\n mc: MCLogo,\n visa: VisaLogo,\n};\n\nexport default function AppTextInput({\n defaultStyling,\n fieldName,\n icon,\n onBlur,\n onChangeText,\n placeholder,\n hasError = false,\n errorText = \"\",\n styling: { formFieldStyle = {}, inputStyle = {}, textInputStyle = {} } = {},\n value,\n withAnimatedText,\n withIcon,\n withPlaceholder,\n ...otherProps\n}: AppTextInputProps) {\n const {\n formFieldBackground,\n formFieldErrorBorder,\n iconColor,\n iconError,\n placeholderColor,\n placeholderError,\n textInput,\n textInputCarot,\n } = useFormThemeContext();\n\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const [renderedIcon, setRenderedIcon] = useState(icon);\n\n const activeAnim = useRef<Animated.CompositeAnimation | null>(null);\n const animatedIsFlipped = useRef(\n new Animated.Value(icon?.type === \"png\" ? 1 : 0)\n ).current;\n const animatedIsFocused = useRef(new Animated.Value(value ? 1 : 0)).current;\n\n useEffect(() => {\n Animated.timing(animatedIsFocused, {\n toValue: isFocused || !!value ? 1 : 0,\n duration: 200,\n useNativeDriver: false,\n }).start();\n }, [isFocused, value, animatedIsFocused]);\n\n const placeholderStyle: Animated.WithAnimatedObject<StyleProp<TextStyle>> = {\n position: \"absolute\",\n left: animatedIsFocused.interpolate({\n inputRange: [0, 1],\n outputRange: [withIcon ? 40 : 15, withIcon ? 40 : 15],\n }),\n top: animatedIsFocused.interpolate({\n inputRange: [0, 1],\n outputRange: [30, 5],\n }),\n fontSize: animatedIsFocused.interpolate({\n inputRange: [0, 1],\n outputRange: [18, 12],\n }),\n color: animatedIsFocused.interpolate({\n inputRange: [0, 1],\n outputRange: [placeholderColor, placeholderColor],\n }),\n };\n\n useEffect(() => {\n if (icon === renderedIcon) return;\n\n const hasBrandIcon = icon?.type === \"png\";\n\n if (activeAnim.current) {\n try {\n activeAnim.current.stop();\n } catch (e) {\n // ignore\n }\n activeAnim.current = null;\n }\n\n const anim = Animated.timing(animatedIsFlipped, {\n toValue: hasBrandIcon ? 1 : 0,\n duration: 500,\n useNativeDriver: true,\n });\n\n activeAnim.current = anim;\n anim.start(({ finished }) => {\n activeAnim.current = null;\n if (finished) {\n setRenderedIcon(icon);\n } else {\n setRenderedIcon(icon);\n }\n });\n }, [icon]);\n\n const rotateY = animatedIsFlipped.interpolate({\n inputRange: [0, 1],\n outputRange: [\"0deg\", \"180deg\"],\n });\n\n const rotateYBack = animatedIsFlipped.interpolate({\n inputRange: [0, 1],\n outputRange: [\"180deg\", \"360deg\"],\n });\n\n const backImageSource =\n icon?.type === \"png\"\n ? cardIcons[icon.name]\n : renderedIcon?.type === \"png\"\n ? cardIcons[renderedIcon.name]\n : null;\n\n const Icon = backImageSource;\n console.log(Icon);\n return (\n <View\n style={\n defaultStyling && [\n styles.formFieldContainer,\n { backgroundColor: formFieldBackground },\n formFieldStyle,\n hasError && { borderColor: formFieldErrorBorder },\n ]\n }\n >\n {defaultStyling && withIcon && (\n <View style={styles.iconContainer}>\n <View style={styles.flipContainer}>\n {/* Front side: generic card icon or previously rendered icon.\n We use renderedIcon so the old front stays visible until animation completes */}\n <Animated.View\n style={[\n styles.face,\n styles.front,\n {\n transform: [{ rotateY }],\n },\n ]}\n >\n {/* If previously renderedIcon was a material/fa6 show it; otherwise show generic credit-card */}\n {renderedIcon?.type === \"material\" && renderedIcon?.name ? (\n <MaterialCommunityIcons\n name={renderedIcon.name}\n size={25}\n color={hasError ? iconError : iconColor}\n />\n ) : renderedIcon?.type === \"fa6\" && renderedIcon?.name ? (\n <FontAwesome6\n name={renderedIcon.name}\n size={21}\n color={hasError ? iconError : iconColor}\n />\n ) : (\n <MaterialCommunityIcons\n name=\"credit-card\"\n size={25}\n color={hasError ? iconError : iconColor}\n />\n )}\n </Animated.View>\n <Animated.View\n style={[\n styles.face,\n {\n transform: [\n {\n rotateY: rotateYBack,\n },\n ],\n },\n ]}\n >\n {Icon ? (\n typeof Icon === \"function\" ? (\n <Icon width=\"100%\" height=\"100%\" />\n ) : (\n <Image\n source={Icon}\n style={[\n styles.logo,\n (icon?.name === \"visa\" ||\n icon?.name === \"discover\" ||\n renderedIcon?.name === \"visa\" ||\n renderedIcon?.name === \"discover\") && {\n width: \"70%\",\n height: \"70%\",\n },\n ]}\n />\n )\n ) : (\n <View style={styles.logo} />\n )}\n </Animated.View>\n </View>\n </View>\n )}\n {withPlaceholder && withAnimatedText && (\n <Animated.Text\n pointerEvents=\"none\"\n style={\n defaultStyling && [\n placeholderStyle,\n hasError && { color: placeholderError },\n ]\n }\n >\n {hasError ? errorText : placeholder}\n </Animated.Text>\n )}\n <TextInput\n onBlur={(e) => {\n setIsFocused(false);\n onBlur?.(e);\n }}\n onChangeText={onChangeText}\n onFocus={() => setIsFocused(true)}\n placeholder={\n withPlaceholder && !withAnimatedText ? placeholder : undefined\n }\n placeholderTextColor={!withAnimatedText ? placeholderColor : undefined}\n selectionColor={textInputCarot}\n style={\n defaultStyling\n ? [\n styles.textInput,\n { color: textInput },\n !withIcon && { marginLeft: 15 },\n textInputStyle,\n ]\n : textInputStyle\n }\n value={value}\n {...otherProps}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n formFieldContainer: {\n borderColor: \"#3c3c3c\",\n borderRadius: 25,\n borderWidth: 1,\n flexDirection: \"row\",\n paddingVertical: 20,\n marginTop: 12,\n },\n iconContainer: {\n marginTop: 8,\n width: 40,\n height: 25,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 1,\n },\n textInput: { height: 40, ...Styles.text },\n\n // Flip animation styles\n flipContainer: {\n width: \"100%\",\n height: \"100%\",\n ...({ transform: [{ perspective: 1000 }] } as any),\n },\n flipCard: {\n width: \"100%\",\n height: \"100%\",\n },\n face: {\n position: \"absolute\",\n width: \"100%\",\n height: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n backfaceVisibility: \"hidden\",\n },\n front: { zIndex: 2 },\n logo: {\n width: \"100%\",\n height: \"100%\",\n resizeMode: \"contain\",\n },\n});\n"]}
@@ -0,0 +1,4 @@
1
+ export { default as FormField } from "./FormField";
2
+ export { default as SubmitButton } from "./SubmitButton";
3
+ export { default as TextInput } from "./TextInput";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ // export { default as ErrorMessage } from "./ErrorMessage";
2
+ export { default as FormField } from "./FormField";
3
+ export { default as SubmitButton } from "./SubmitButton";
4
+ export { default as TextInput } from "./TextInput";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/forms/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC","sourcesContent":["// export { default as ErrorMessage } from \"./ErrorMessage\";\nexport { default as FormField } from \"./FormField\";\nexport { default as SubmitButton } from \"./SubmitButton\";\nexport { default as TextInput } from \"./TextInput\";\n"]}
@@ -0,0 +1,8 @@
1
+ export { default as OPCardForm } from "./OPCardForm";
2
+ export { default as OPCardNumberInput } from "./OPCardNumberInput";
3
+ export { default as OPCvv2Input } from "./OPCvv2Input";
4
+ export { default as OPExpInput } from "./OPExpInput";
5
+ export { default as OPExpMonthInput } from "./OPExpMonthInput";
6
+ export { default as OPExpYearInput } from "./OPExpYearInput";
7
+ export { default as OPHolderNameInput } from "./OPHolderNameInput";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { default as OPCardForm } from "./OPCardForm";
2
+ export { default as OPCardNumberInput } from "./OPCardNumberInput";
3
+ export { default as OPCvv2Input } from "./OPCvv2Input";
4
+ export { default as OPExpInput } from "./OPExpInput";
5
+ export { default as OPExpMonthInput } from "./OPExpMonthInput";
6
+ export { default as OPExpYearInput } from "./OPExpYearInput";
7
+ export { default as OPHolderNameInput } from "./OPHolderNameInput";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["export { default as OPCardForm } from \"./OPCardForm\";\nexport { default as OPCardNumberInput } from \"./OPCardNumberInput\";\nexport { default as OPCvv2Input } from \"./OPCvv2Input\";\nexport { default as OPExpInput } from \"./OPExpInput\";\nexport { default as OPExpMonthInput } from \"./OPExpMonthInput\";\nexport { default as OPExpYearInput } from \"./OPExpYearInput\";\nexport { default as OPHolderNameInput } from \"./OPHolderNameInput\";\n"]}
@@ -0,0 +1,27 @@
1
+ export declare const Colors: {
2
+ light: {
3
+ button: string;
4
+ buttonText: string;
5
+ formFieldBackground: string;
6
+ formFieldErrorBorder: string;
7
+ iconColor: string;
8
+ iconError: string;
9
+ placeholderColor: string;
10
+ placeholderError: string;
11
+ textInput: string;
12
+ textInputCarot: string;
13
+ };
14
+ dark: {
15
+ button: string;
16
+ buttonText: string;
17
+ formFieldBackground: string;
18
+ formFieldErrorBorder: string;
19
+ iconColor: string;
20
+ iconError: string;
21
+ placeholderColor: string;
22
+ placeholderError: string;
23
+ textInput: string;
24
+ textInputCarot: string;
25
+ };
26
+ };
27
+ //# sourceMappingURL=Colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Colors.d.ts","sourceRoot":"","sources":["../../src/constants/Colors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAC"}
@@ -0,0 +1,27 @@
1
+ export const Colors = {
2
+ light: {
3
+ button: "#16c8bf",
4
+ buttonText: "#014481",
5
+ formFieldBackground: "#f8f4f4",
6
+ formFieldErrorBorder: "#fc5c65",
7
+ iconColor: "#6e6969",
8
+ iconError: "#fc5c65",
9
+ placeholderColor: "#6e6969",
10
+ placeholderError: "#fc5c65",
11
+ textInput: "#6e6969",
12
+ textInputCarot: "#014481",
13
+ },
14
+ dark: {
15
+ button: "#16c8bf",
16
+ buttonText: "#014481",
17
+ formFieldBackground: "#242526",
18
+ formFieldErrorBorder: "#fc5c65",
19
+ iconColor: "#e5e5e5",
20
+ iconError: "#fc5c65",
21
+ placeholderColor: "#6e6969",
22
+ placeholderError: "#fc5c65",
23
+ textInput: "#e5e5e5",
24
+ textInputCarot: "#014481",
25
+ },
26
+ };
27
+ //# sourceMappingURL=Colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Colors.js","sourceRoot":"","sources":["../../src/constants/Colors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE;QACL,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,mBAAmB,EAAE,SAAS;QAC9B,oBAAoB,EAAE,SAAS;QAC/B,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB,EAAE,SAAS;QAC3B,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,SAAS;KAC1B;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,mBAAmB,EAAE,SAAS;QAC9B,oBAAoB,EAAE,SAAS;QAC/B,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB,EAAE,SAAS;QAC3B,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,SAAS;KAC1B;CACF,CAAC","sourcesContent":["export const Colors = {\n light: {\n button: \"#16c8bf\",\n buttonText: \"#014481\",\n formFieldBackground: \"#f8f4f4\",\n formFieldErrorBorder: \"#fc5c65\",\n iconColor: \"#6e6969\",\n iconError: \"#fc5c65\",\n placeholderColor: \"#6e6969\",\n placeholderError: \"#fc5c65\",\n textInput: \"#6e6969\",\n textInputCarot: \"#014481\",\n },\n dark: {\n button: \"#16c8bf\",\n buttonText: \"#014481\",\n formFieldBackground: \"#242526\",\n formFieldErrorBorder: \"#fc5c65\",\n iconColor: \"#e5e5e5\",\n iconError: \"#fc5c65\",\n placeholderColor: \"#6e6969\",\n placeholderError: \"#fc5c65\",\n textInput: \"#e5e5e5\",\n textInputCarot: \"#014481\",\n },\n};\n"]}
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ text: {
3
+ flex: number;
4
+ fontSize: number;
5
+ fontFamily: string;
6
+ };
7
+ };
8
+ export default _default;
9
+ //# sourceMappingURL=Styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Styles.d.ts","sourceRoot":"","sources":["../../src/constants/Styles.ts"],"names":[],"mappings":";;;;;;;AAEA,wBAME"}
@@ -0,0 +1,9 @@
1
+ import { Platform } from "react-native";
2
+ export default {
3
+ text: {
4
+ flex: 1,
5
+ fontSize: 18,
6
+ fontFamily: Platform.OS === "android" ? "Roboto" : "Avenir",
7
+ },
8
+ };
9
+ //# sourceMappingURL=Styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Styles.js","sourceRoot":"","sources":["../../src/constants/Styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,eAAe;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,QAAQ,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;KAC5D;CACF,CAAC","sourcesContent":["import { Platform } from \"react-native\";\n\nexport default {\n text: {\n flex: 1,\n fontSize: 18,\n fontFamily: Platform.OS === \"android\" ? \"Roboto\" : \"Avenir\",\n },\n};\n"]}
@@ -0,0 +1,22 @@
1
+ type FormValues = Record<string, any>;
2
+ type FormErrors = Record<string, string | undefined>;
3
+ type FormTouched = Record<string, boolean>;
4
+ interface FormContextType {
5
+ errors: FormErrors;
6
+ isSubmitting: boolean;
7
+ touched: FormTouched;
8
+ values: FormValues;
9
+ handleSubmit: () => Promise<any>;
10
+ resetForm: () => void;
11
+ setFieldValue: (field: string, value: any) => void;
12
+ setFieldTouched: (field: string, touched?: boolean) => void;
13
+ setFieldError: (field: string, error: string | undefined) => void;
14
+ }
15
+ export declare const useFormContext: () => FormContextType;
16
+ export default function FormProvider({ children, initialValues, onSubmit, }: {
17
+ children: React.ReactNode;
18
+ initialValues?: FormValues;
19
+ onSubmit?: () => any;
20
+ }): import("react").JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=FormContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormContext.d.ts","sourceRoot":"","sources":["../../src/context/FormContext.tsx"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACtC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AACrD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACnD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACnE;AAID,eAAO,MAAM,cAAc,uBAM1B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,aAAkB,EAClB,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;CACtB,+BAqEA"}
@@ -0,0 +1,63 @@
1
+ import { createContext, useContext, useState } from "react";
2
+ import { tokenizeCard } from "../ExpoOpenpayModule";
3
+ import { unformat } from "../utility/formatting";
4
+ const FormContext = createContext(undefined);
5
+ export const useFormContext = () => {
6
+ const context = useContext(FormContext);
7
+ if (!context) {
8
+ throw new Error("useFormContext must be used within a FormProvider");
9
+ }
10
+ return context;
11
+ };
12
+ export default function FormProvider({ children, initialValues = {}, onSubmit, }) {
13
+ const [values, setValues] = useState(initialValues);
14
+ const [errors, setErrors] = useState({});
15
+ const [touched, setTouched] = useState({});
16
+ const [isSubmitting, setIsSubmitting] = useState(false);
17
+ const handleSubmit = async () => {
18
+ try {
19
+ setIsSubmitting(true);
20
+ if (onSubmit)
21
+ onSubmit();
22
+ if (values["exp"]) {
23
+ values["expMonth"] = values["exp"].slice(0, 2);
24
+ values["expYear"] = values["exp"].slice(3);
25
+ }
26
+ await tokenizeCard(unformat(values["cardNumber"]), values["cardHolderName"], values["expYear"], values["expMonth"], values["cvc"]);
27
+ resetForm();
28
+ }
29
+ catch (e) {
30
+ if (e instanceof Error) {
31
+ console.error("Error during submission:", e.message);
32
+ }
33
+ else {
34
+ console.error("Unknown error during submission", e);
35
+ }
36
+ }
37
+ finally {
38
+ setIsSubmitting(false);
39
+ }
40
+ };
41
+ const resetForm = () => {
42
+ setValues({});
43
+ setErrors({});
44
+ setTouched({});
45
+ };
46
+ const setFieldValue = (field, value) => setValues((prev) => ({ ...prev, [field]: value }));
47
+ const setFieldTouched = (field, isTouched = true) => setTouched((prev) => ({ ...prev, [field]: isTouched }));
48
+ const setFieldError = (field, error) => setErrors((prev) => ({ ...prev, [field]: error }));
49
+ return (<FormContext.Provider value={{
50
+ errors,
51
+ isSubmitting,
52
+ touched,
53
+ values,
54
+ handleSubmit,
55
+ resetForm,
56
+ setFieldValue,
57
+ setFieldTouched,
58
+ setFieldError,
59
+ }}>
60
+ {children}
61
+ </FormContext.Provider>);
62
+ }
63
+ //# sourceMappingURL=FormContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormContext.js","sourceRoot":"","sources":["../../src/context/FormContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkBjD,MAAM,WAAW,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAQ,EACR,aAAa,GAAG,EAAE,EAClB,QAAQ,GAKT;IACC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAa,aAAa,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,KAAK,IAAkB,EAAE;QAC5C,IAAI,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,CAAC;YAEtB,IAAI,QAAQ;gBAAE,QAAQ,EAAE,CAAC;YAEzB,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/C,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,YAAY,CAChB,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAC9B,MAAM,CAAC,gBAAgB,CAAC,EACxB,MAAM,CAAC,SAAS,CAAC,EACjB,MAAM,CAAC,UAAU,CAAC,EAClB,MAAM,CAAC,KAAK,CAAC,CACd,CAAC;YAEF,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,UAAU,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,KAAU,EAAE,EAAE,CAClD,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAErD,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,YAAqB,IAAI,EAAE,EAAE,CACnE,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAE1D,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,KAAyB,EAAE,EAAE,CACjE,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAErD,OAAO,CACL,CAAC,WAAW,CAAC,QAAQ,CACnB,KAAK,CAAC,CAAC;YACL,MAAM;YACN,YAAY;YACZ,OAAO;YACP,MAAM;YACN,YAAY;YACZ,SAAS;YACT,aAAa;YACb,eAAe;YACf,aAAa;SACd,CAAC,CAEF;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,WAAW,CAAC,QAAQ,CAAC,CACxB,CAAC;AACJ,CAAC","sourcesContent":["import { createContext, useContext, useState } from \"react\";\n\nimport { tokenizeCard } from \"../ExpoOpenpayModule\";\nimport { unformat } from \"../utility/formatting\";\n\ntype FormValues = Record<string, any>;\ntype FormErrors = Record<string, string | undefined>;\ntype FormTouched = Record<string, boolean>;\n\ninterface FormContextType {\n errors: FormErrors;\n isSubmitting: boolean;\n touched: FormTouched;\n values: FormValues;\n handleSubmit: () => Promise<any>;\n resetForm: () => void;\n setFieldValue: (field: string, value: any) => void;\n setFieldTouched: (field: string, touched?: boolean) => void;\n setFieldError: (field: string, error: string | undefined) => void;\n}\n\nconst FormContext = createContext<FormContextType | undefined>(undefined);\n\nexport const useFormContext = () => {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error(\"useFormContext must be used within a FormProvider\");\n }\n return context;\n};\n\nexport default function FormProvider({\n children,\n initialValues = {},\n onSubmit,\n}: {\n children: React.ReactNode;\n initialValues?: FormValues;\n onSubmit?: () => any;\n}) {\n const [values, setValues] = useState<FormValues>(initialValues);\n const [errors, setErrors] = useState<FormErrors>({});\n const [touched, setTouched] = useState<FormTouched>({});\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n\n const handleSubmit = async (): Promise<any> => {\n try {\n setIsSubmitting(true);\n\n if (onSubmit) onSubmit();\n\n if (values[\"exp\"]) {\n values[\"expMonth\"] = values[\"exp\"].slice(0, 2);\n values[\"expYear\"] = values[\"exp\"].slice(3);\n }\n\n await tokenizeCard(\n unformat(values[\"cardNumber\"]),\n values[\"cardHolderName\"],\n values[\"expYear\"],\n values[\"expMonth\"],\n values[\"cvc\"]\n );\n\n resetForm();\n } catch (e) {\n if (e instanceof Error) {\n console.error(\"Error during submission:\", e.message);\n } else {\n console.error(\"Unknown error during submission\", e);\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const resetForm = () => {\n setValues({});\n setErrors({});\n setTouched({});\n };\n\n const setFieldValue = (field: string, value: any) =>\n setValues((prev) => ({ ...prev, [field]: value }));\n\n const setFieldTouched = (field: string, isTouched: boolean = true) =>\n setTouched((prev) => ({ ...prev, [field]: isTouched }));\n\n const setFieldError = (field: string, error: string | undefined) =>\n setErrors((prev) => ({ ...prev, [field]: error }));\n\n return (\n <FormContext.Provider\n value={{\n errors,\n isSubmitting,\n touched,\n values,\n handleSubmit,\n resetForm,\n setFieldValue,\n setFieldTouched,\n setFieldError,\n }}\n >\n {children}\n </FormContext.Provider>\n );\n}\n"]}
@@ -0,0 +1,20 @@
1
+ export interface FormThemeColors {
2
+ button: string;
3
+ buttonText: string;
4
+ formFieldBackground: string;
5
+ formFieldErrorBorder: string;
6
+ iconColor: string;
7
+ iconError: string;
8
+ placeholderColor: string;
9
+ placeholderError: string;
10
+ textInput: string;
11
+ textInputCarot: string;
12
+ }
13
+ export declare const useFormThemeContext: () => FormThemeColors;
14
+ export default function FormThemeProvider({ children, dark, light, }: {
15
+ children: React.ReactNode;
16
+ colorScheme: "light" | "dark";
17
+ dark?: FormThemeColors;
18
+ light?: FormThemeColors;
19
+ }): import("react").JSX.Element;
20
+ //# sourceMappingURL=FormThemeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormThemeContext.d.ts","sourceRoot":"","sources":["../../src/context/FormThemeContext.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,eAAO,MAAM,mBAAmB,uBAQ/B,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,QAAQ,EACR,IAAI,EACJ,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB,+BAeA"}
@@ -0,0 +1,21 @@
1
+ import { createContext, useContext, useMemo } from "react";
2
+ import { useColorScheme } from "react-native";
3
+ import { Colors } from "../constants/Colors";
4
+ const FormThemeContext = createContext(undefined);
5
+ export const useFormThemeContext = () => {
6
+ const context = useContext(FormThemeContext);
7
+ if (!context) {
8
+ throw new Error("useFormThemeContext must be used within a FormThemeProvider");
9
+ }
10
+ return context;
11
+ };
12
+ export default function FormThemeProvider({ children, dark, light, }) {
13
+ const mergedDark = useMemo(() => ({ ...Colors.dark, ...dark }), [dark]);
14
+ const mergedLight = useMemo(() => ({ ...Colors.light, ...light }), [light]);
15
+ const colorScheme = useColorScheme();
16
+ const colorTheme = useMemo(() => (colorScheme === "dark" ? mergedDark : mergedLight), [colorScheme, mergedDark, mergedLight]);
17
+ return (<FormThemeContext.Provider value={colorTheme}>
18
+ {children}
19
+ </FormThemeContext.Provider>);
20
+ }
21
+ //# sourceMappingURL=FormThemeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormThemeContext.js","sourceRoot":"","sources":["../../src/context/FormThemeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAe7C,MAAM,gBAAgB,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,QAAQ,EACR,IAAI,EACJ,KAAK,GAMN;IACC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,EACzD,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CACvC,CAAC;IAEF,OAAO,CACL,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAC3C;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;AACJ,CAAC","sourcesContent":["import { createContext, useContext, useMemo } from \"react\";\nimport { useColorScheme } from \"react-native\";\n\nimport { Colors } from \"../constants/Colors\";\n\nexport interface FormThemeColors {\n button: string;\n buttonText: string;\n formFieldBackground: string;\n formFieldErrorBorder: string;\n iconColor: string;\n iconError: string;\n placeholderColor: string;\n placeholderError: string;\n textInput: string;\n textInputCarot: string;\n}\n\nconst FormThemeContext = createContext<FormThemeColors | undefined>(undefined);\n\nexport const useFormThemeContext = () => {\n const context = useContext(FormThemeContext);\n if (!context) {\n throw new Error(\n \"useFormThemeContext must be used within a FormThemeProvider\"\n );\n }\n return context;\n};\n\nexport default function FormThemeProvider({\n children,\n dark,\n light,\n}: {\n children: React.ReactNode;\n colorScheme: \"light\" | \"dark\";\n dark?: FormThemeColors;\n light?: FormThemeColors;\n}) {\n const mergedDark = useMemo(() => ({ ...Colors.dark, ...dark }), [dark]);\n const mergedLight = useMemo(() => ({ ...Colors.light, ...light }), [light]);\n\n const colorScheme = useColorScheme();\n const colorTheme = useMemo(\n () => (colorScheme === \"dark\" ? mergedDark : mergedLight),\n [colorScheme, mergedDark, mergedLight]\n );\n\n return (\n <FormThemeContext.Provider value={colorTheme}>\n {children}\n </FormThemeContext.Provider>\n );\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { default as FormProvider } from "./FormContext";
2
+ export { default as FormThemeProvider } from "./FormThemeContext";
3
+ export { FormThemeColors } from "./FormThemeContext";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as FormProvider } from "./FormContext";
2
+ export { default as FormThemeProvider } from "./FormThemeContext";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["export { default as FormProvider } from \"./FormContext\";\nexport { default as FormThemeProvider } from \"./FormThemeContext\";\nexport { FormThemeColors } from \"./FormThemeContext\";\n"]}
@@ -0,0 +1,6 @@
1
+ export { default } from "./ExpoOpenpayModule";
2
+ export { default as ExpoOpenpayView } from "./ExpoOpenpayView";
3
+ export * from "./ExpoOpenpayModule";
4
+ export * from "./components";
5
+ export * from "./ExpoOpenpay.types";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
package/build/index.js ADDED
@@ -0,0 +1,18 @@
1
+ // Runtime check for react-native-svg
2
+ try {
3
+ require("react-native-svg");
4
+ }
5
+ catch (e) {
6
+ throw new Error("expo-openpay requires react-native-svg. Please install it:\n" +
7
+ " yarn add react-native-svg\n" +
8
+ "or\n" +
9
+ " npm install react-native-svg");
10
+ }
11
+ // Reexport the native module. On web, it will be resolved to ExpoOpenpayModule.web.ts
12
+ // and on native platforms to ExpoOpenpayModule.ts
13
+ export { default } from "./ExpoOpenpayModule";
14
+ export { default as ExpoOpenpayView } from "./ExpoOpenpayView";
15
+ export * from "./ExpoOpenpayModule";
16
+ export * from "./components";
17
+ export * from "./ExpoOpenpay.types";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,IAAI,CAAC;IACH,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9B,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,MAAM,IAAI,KAAK,CACb,8DAA8D;QAC5D,+BAA+B;QAC/B,MAAM;QACN,gCAAgC,CACnC,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,kDAAkD;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC","sourcesContent":["// Runtime check for react-native-svg\ntry {\n require(\"react-native-svg\");\n} catch (e) {\n throw new Error(\n \"expo-openpay requires react-native-svg. Please install it:\\n\" +\n \" yarn add react-native-svg\\n\" +\n \"or\\n\" +\n \" npm install react-native-svg\"\n );\n}\n\n// Reexport the native module. On web, it will be resolved to ExpoOpenpayModule.web.ts\n// and on native platforms to ExpoOpenpayModule.ts\nexport { default } from \"./ExpoOpenpayModule\";\nexport { default as ExpoOpenpayView } from \"./ExpoOpenpayView\";\nexport * from \"./ExpoOpenpayModule\";\nexport * from \"./components\";\nexport * from \"./ExpoOpenpay.types\";\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cardBranding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardBranding.d.ts","sourceRoot":"","sources":["../../src/utility/cardBranding.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cardBranding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardBranding.js","sourceRoot":"","sources":["../../src/utility/cardBranding.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -0,0 +1,4 @@
1
+ export declare const formatCreditCardNumber: (value: string) => string;
2
+ export declare const formatExp: (value: string) => string;
3
+ export declare const unformat: (formattedText: string) => string;
4
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utility/formatting.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,MAQtD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAQzC,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,eAAe,MAAM,KAAG,MAEhD,CAAC"}