react-native-fpay 0.1.1

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 (167) hide show
  1. package/Fpay.podspec +20 -0
  2. package/LICENSE +20 -0
  3. package/README.md +37 -0
  4. package/android/build.gradle +67 -0
  5. package/android/src/main/AndroidManifest.xml +2 -0
  6. package/android/src/main/java/com/fpay/FpayModule.kt +15 -0
  7. package/android/src/main/java/com/fpay/FpayPackage.kt +31 -0
  8. package/ios/Fpay.h +5 -0
  9. package/ios/Fpay.mm +21 -0
  10. package/lib/module/FountainPayProvider.js +18 -0
  11. package/lib/module/FountainPayProvider.js.map +1 -0
  12. package/lib/module/core/api/client.js +47 -0
  13. package/lib/module/core/api/client.js.map +1 -0
  14. package/lib/module/core/api/index.js +35 -0
  15. package/lib/module/core/api/index.js.map +1 -0
  16. package/lib/module/core/types/index.js +4 -0
  17. package/lib/module/core/types/index.js.map +1 -0
  18. package/lib/module/engine/BLEReceiverService.js +190 -0
  19. package/lib/module/engine/BLEReceiverService.js.map +1 -0
  20. package/lib/module/engine/BLESenderService.js +259 -0
  21. package/lib/module/engine/BLESenderService.js.map +1 -0
  22. package/lib/module/engine/FPEngine.js +340 -0
  23. package/lib/module/engine/FPEngine.js.map +1 -0
  24. package/lib/module/engine/NearbyUsersService.js +87 -0
  25. package/lib/module/engine/NearbyUsersService.js.map +1 -0
  26. package/lib/module/index.js +16 -0
  27. package/lib/module/index.js.map +1 -0
  28. package/lib/module/package.json +1 -0
  29. package/lib/module/ui/components/FPButton.js +71 -0
  30. package/lib/module/ui/components/FPButton.js.map +1 -0
  31. package/lib/module/ui/components/LoadingAnimation/InLoading.js +74 -0
  32. package/lib/module/ui/components/LoadingAnimation/InLoading.js.map +1 -0
  33. package/lib/module/ui/components/LoadingAnimation/index.js +82 -0
  34. package/lib/module/ui/components/LoadingAnimation/index.js.map +1 -0
  35. package/lib/module/ui/components/OtpInput/OTPInputView.js +290 -0
  36. package/lib/module/ui/components/OtpInput/OTPInputView.js.map +1 -0
  37. package/lib/module/ui/components/OtpInput/Styles.js +20 -0
  38. package/lib/module/ui/components/OtpInput/Styles.js.map +1 -0
  39. package/lib/module/ui/components/OtpInput/helpers/codeToArray.js +7 -0
  40. package/lib/module/ui/components/OtpInput/helpers/codeToArray.js.map +1 -0
  41. package/lib/module/ui/components/OtpInput/helpers/device.js +9 -0
  42. package/lib/module/ui/components/OtpInput/helpers/device.js.map +1 -0
  43. package/lib/module/ui/components/OtpInput/helpers/styles.js +17 -0
  44. package/lib/module/ui/components/OtpInput/helpers/styles.js.map +1 -0
  45. package/lib/module/ui/components/OtpInput/helpers/types.js +4 -0
  46. package/lib/module/ui/components/OtpInput/helpers/types.js.map +1 -0
  47. package/lib/module/ui/components/OtpInput/index.js +45 -0
  48. package/lib/module/ui/components/OtpInput/index.js.map +1 -0
  49. package/lib/module/ui/components/PulseAnimation.js +61 -0
  50. package/lib/module/ui/components/PulseAnimation.js.map +1 -0
  51. package/lib/module/ui/modals/FPPaymentRequestModal.js +253 -0
  52. package/lib/module/ui/modals/FPPaymentRequestModal.js.map +1 -0
  53. package/lib/module/ui/modals/FPShell.js +180 -0
  54. package/lib/module/ui/modals/FPShell.js.map +1 -0
  55. package/lib/module/ui/screens/ReceiveScreen.js +291 -0
  56. package/lib/module/ui/screens/ReceiveScreen.js.map +1 -0
  57. package/lib/module/ui/screens/SendScreen.js +216 -0
  58. package/lib/module/ui/screens/SendScreen.js.map +1 -0
  59. package/lib/module/ui/screens/sub/BluetoothSubScreen.js +403 -0
  60. package/lib/module/ui/screens/sub/BluetoothSubScreen.js.map +1 -0
  61. package/lib/module/ui/screens/sub/NFCSubScreen.js +169 -0
  62. package/lib/module/ui/screens/sub/NFCSubScreen.js.map +1 -0
  63. package/lib/module/ui/screens/sub/NQRSubScreen.js +136 -0
  64. package/lib/module/ui/screens/sub/NQRSubScreen.js.map +1 -0
  65. package/lib/module/ui/screens/sub/ProximitySubScreen.js +501 -0
  66. package/lib/module/ui/screens/sub/ProximitySubScreen.js.map +1 -0
  67. package/lib/module/ui/screens/sub/TransferSubScreen.js +361 -0
  68. package/lib/module/ui/screens/sub/TransferSubScreen.js.map +1 -0
  69. package/lib/module/ui/theme/index.js +64 -0
  70. package/lib/module/ui/theme/index.js.map +1 -0
  71. package/lib/module/useFountainPay.js +82 -0
  72. package/lib/module/useFountainPay.js.map +1 -0
  73. package/lib/typescript/package.json +1 -0
  74. package/lib/typescript/src/FountainPayProvider.d.ts +7 -0
  75. package/lib/typescript/src/FountainPayProvider.d.ts.map +1 -0
  76. package/lib/typescript/src/core/api/client.d.ts +7 -0
  77. package/lib/typescript/src/core/api/client.d.ts.map +1 -0
  78. package/lib/typescript/src/core/api/index.d.ts +67 -0
  79. package/lib/typescript/src/core/api/index.d.ts.map +1 -0
  80. package/lib/typescript/src/core/types/index.d.ts +130 -0
  81. package/lib/typescript/src/core/types/index.d.ts.map +1 -0
  82. package/lib/typescript/src/engine/BLEReceiverService.d.ts +43 -0
  83. package/lib/typescript/src/engine/BLEReceiverService.d.ts.map +1 -0
  84. package/lib/typescript/src/engine/BLESenderService.d.ts +39 -0
  85. package/lib/typescript/src/engine/BLESenderService.d.ts.map +1 -0
  86. package/lib/typescript/src/engine/FPEngine.d.ts +24 -0
  87. package/lib/typescript/src/engine/FPEngine.d.ts.map +1 -0
  88. package/lib/typescript/src/engine/NearbyUsersService.d.ts +19 -0
  89. package/lib/typescript/src/engine/NearbyUsersService.d.ts.map +1 -0
  90. package/lib/typescript/src/index.d.ts +4 -0
  91. package/lib/typescript/src/index.d.ts.map +1 -0
  92. package/lib/typescript/src/ui/components/FPButton.d.ts +12 -0
  93. package/lib/typescript/src/ui/components/FPButton.d.ts.map +1 -0
  94. package/lib/typescript/src/ui/components/LoadingAnimation/InLoading.d.ts +7 -0
  95. package/lib/typescript/src/ui/components/LoadingAnimation/InLoading.d.ts.map +1 -0
  96. package/lib/typescript/src/ui/components/LoadingAnimation/index.d.ts +6 -0
  97. package/lib/typescript/src/ui/components/LoadingAnimation/index.d.ts.map +1 -0
  98. package/lib/typescript/src/ui/components/OtpInput/OTPInputView.d.ts +29 -0
  99. package/lib/typescript/src/ui/components/OtpInput/OTPInputView.d.ts.map +1 -0
  100. package/lib/typescript/src/ui/components/OtpInput/Styles.d.ts +330 -0
  101. package/lib/typescript/src/ui/components/OtpInput/Styles.d.ts.map +1 -0
  102. package/lib/typescript/src/ui/components/OtpInput/helpers/codeToArray.d.ts +6 -0
  103. package/lib/typescript/src/ui/components/OtpInput/helpers/codeToArray.d.ts.map +1 -0
  104. package/lib/typescript/src/ui/components/OtpInput/helpers/device.d.ts +6 -0
  105. package/lib/typescript/src/ui/components/OtpInput/helpers/device.d.ts.map +1 -0
  106. package/lib/typescript/src/ui/components/OtpInput/helpers/styles.d.ts +6 -0
  107. package/lib/typescript/src/ui/components/OtpInput/helpers/styles.d.ts.map +1 -0
  108. package/lib/typescript/src/ui/components/OtpInput/helpers/types.d.ts +84 -0
  109. package/lib/typescript/src/ui/components/OtpInput/helpers/types.d.ts.map +1 -0
  110. package/lib/typescript/src/ui/components/OtpInput/index.d.ts +9 -0
  111. package/lib/typescript/src/ui/components/OtpInput/index.d.ts.map +1 -0
  112. package/lib/typescript/src/ui/components/PulseAnimation.d.ts +2 -0
  113. package/lib/typescript/src/ui/components/PulseAnimation.d.ts.map +1 -0
  114. package/lib/typescript/src/ui/modals/FPPaymentRequestModal.d.ts +2 -0
  115. package/lib/typescript/src/ui/modals/FPPaymentRequestModal.d.ts.map +1 -0
  116. package/lib/typescript/src/ui/modals/FPShell.d.ts +2 -0
  117. package/lib/typescript/src/ui/modals/FPShell.d.ts.map +1 -0
  118. package/lib/typescript/src/ui/screens/ReceiveScreen.d.ts +10 -0
  119. package/lib/typescript/src/ui/screens/ReceiveScreen.d.ts.map +1 -0
  120. package/lib/typescript/src/ui/screens/SendScreen.d.ts +9 -0
  121. package/lib/typescript/src/ui/screens/SendScreen.d.ts.map +1 -0
  122. package/lib/typescript/src/ui/screens/sub/BluetoothSubScreen.d.ts +552 -0
  123. package/lib/typescript/src/ui/screens/sub/BluetoothSubScreen.d.ts.map +1 -0
  124. package/lib/typescript/src/ui/screens/sub/NFCSubScreen.d.ts +19 -0
  125. package/lib/typescript/src/ui/screens/sub/NFCSubScreen.d.ts.map +1 -0
  126. package/lib/typescript/src/ui/screens/sub/NQRSubScreen.d.ts +13 -0
  127. package/lib/typescript/src/ui/screens/sub/NQRSubScreen.d.ts.map +1 -0
  128. package/lib/typescript/src/ui/screens/sub/ProximitySubScreen.d.ts +552 -0
  129. package/lib/typescript/src/ui/screens/sub/ProximitySubScreen.d.ts.map +1 -0
  130. package/lib/typescript/src/ui/screens/sub/TransferSubScreen.d.ts +12 -0
  131. package/lib/typescript/src/ui/screens/sub/TransferSubScreen.d.ts.map +1 -0
  132. package/lib/typescript/src/ui/theme/index.d.ts +62 -0
  133. package/lib/typescript/src/ui/theme/index.d.ts.map +1 -0
  134. package/lib/typescript/src/useFountainPay.d.ts +3 -0
  135. package/lib/typescript/src/useFountainPay.d.ts.map +1 -0
  136. package/package.json +217 -0
  137. package/src/FountainPayProvider.tsx +21 -0
  138. package/src/core/api/client.ts +47 -0
  139. package/src/core/api/index.ts +61 -0
  140. package/src/core/types/index.ts +144 -0
  141. package/src/engine/BLEReceiverService.ts +244 -0
  142. package/src/engine/BLESenderService.ts +314 -0
  143. package/src/engine/FPEngine.ts +370 -0
  144. package/src/engine/NearbyUsersService.ts +106 -0
  145. package/src/index.ts +30 -0
  146. package/src/ui/components/FPButton.tsx +42 -0
  147. package/src/ui/components/LoadingAnimation/InLoading.tsx +88 -0
  148. package/src/ui/components/LoadingAnimation/index.tsx +93 -0
  149. package/src/ui/components/OtpInput/OTPInputView.tsx +243 -0
  150. package/src/ui/components/OtpInput/Styles.ts +19 -0
  151. package/src/ui/components/OtpInput/helpers/codeToArray.ts +3 -0
  152. package/src/ui/components/OtpInput/helpers/device.ts +6 -0
  153. package/src/ui/components/OtpInput/helpers/styles.ts +17 -0
  154. package/src/ui/components/OtpInput/helpers/types.ts +88 -0
  155. package/src/ui/components/OtpInput/index.tsx +51 -0
  156. package/src/ui/components/PulseAnimation.tsx +78 -0
  157. package/src/ui/modals/FPPaymentRequestModal.tsx +158 -0
  158. package/src/ui/modals/FPShell.tsx +107 -0
  159. package/src/ui/screens/ReceiveScreen.tsx +119 -0
  160. package/src/ui/screens/SendScreen.tsx +86 -0
  161. package/src/ui/screens/sub/BluetoothSubScreen.tsx +433 -0
  162. package/src/ui/screens/sub/NFCSubScreen.tsx +83 -0
  163. package/src/ui/screens/sub/NQRSubScreen.tsx +61 -0
  164. package/src/ui/screens/sub/ProximitySubScreen.tsx +390 -0
  165. package/src/ui/screens/sub/TransferSubScreen.tsx +146 -0
  166. package/src/ui/theme/index.ts +24 -0
  167. package/src/useFountainPay.ts +95 -0
@@ -0,0 +1,403 @@
1
+ "use strict";
2
+
3
+ // FPay SDK — BluetoothSubScreen (Send side)
4
+ //
5
+ // Payment flow:
6
+ // 1. Scan via FPEngine.scanForBluetoothDevices (BLESenderService reads USER_INFO char)
7
+ // 2. User picks a device, taps "Send Payment Request"
8
+ // 3. FPEngine.sendBluetoothPaymentRequest writes JSON to receiver's REQUEST char
9
+ // 4. Receiver's FPPaymentRequestModal pops up — they tap Accept or Decline
10
+ // 5. Accept → receiver writes { accepted, accountDetails, requestTimestamp } to RESPONSE char
11
+ // Decline → receiver writes { accepted: false, timestamp }
12
+ // 6. Sender polls RESPONSE char every 1s (BLESenderService.sendPaymentRequest)
13
+ // and matches by requestTimestamp === request.timestamp
14
+ // 7. On accept: sender calls transferAPI.send() with the returned accountDetails
15
+
16
+ import React, { useState } from 'react';
17
+ import { View, Text, TouchableOpacity, Alert } from 'react-native';
18
+ import styled from 'styled-components/native';
19
+ import Svg, { Path } from 'react-native-svg';
20
+ import Ionicons from 'react-native-vector-icons/Ionicons';
21
+ import { transferAPI } from "../../../core/api/index.js";
22
+ import { FPEngine } from "../../../engine/FPEngine.js";
23
+ import { PulseAnimation } from "../../components/PulseAnimation.js";
24
+ import InLoading from "../../components/LoadingAnimation/InLoading.js";
25
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
26
+ const Container = styled(View)`
27
+ flex: 1;
28
+ background-color: #000000;
29
+ `;
30
+ const Header = styled(View)`
31
+ flex-direction: row;
32
+ align-items: center;
33
+ justify-content: space-between;
34
+ padding: 12px 16px;
35
+ position: absolute;
36
+ top: 40px;
37
+ left: 0;
38
+ right: 0;
39
+ z-index: 9999999999;
40
+ elevation: 4;
41
+ shadow-color: #000;
42
+ shadow-offset: 0px 2px;
43
+ shadow-opacity: 0.1;
44
+ shadow-radius: 4px;
45
+ `;
46
+ const HeaderButton = styled(TouchableOpacity)`
47
+ padding: 8px;
48
+ background-color: #fff;
49
+ width: 40px;
50
+ height: 40px;
51
+ border-radius: 50px;
52
+ justify-content: center;
53
+ align-items: center;
54
+ `;
55
+ const HeaderCenter = styled(View)`
56
+ flex-direction: row;
57
+ align-items: center;
58
+ gap: 8px;
59
+ `;
60
+ const HeaderRight = styled(View)`
61
+ flex-direction: row;
62
+ align-items: center;
63
+ gap: 8px;
64
+ `;
65
+ const QuickLinksContainer = styled(View)`
66
+ align-items: center;
67
+ margin-top: 250px;
68
+ `;
69
+ const QuickLinksContainerWithDevices = styled(View)`
70
+ align-items: flex-start;
71
+ margin-top: 30%;
72
+ margin-bottom: 20px;
73
+ `;
74
+ const QuickLinksIcon = styled(TouchableOpacity)`
75
+ width: 96px;
76
+ height: 96px;
77
+ border-radius: 48px;
78
+ background-color: #18181b;
79
+ justify-content: center;
80
+ align-items: center;
81
+ margin-bottom: 16px;
82
+ `;
83
+ const QuickLinksText = styled(Text)`
84
+ color: #9ca3af;
85
+ font-size: 18px;
86
+ `;
87
+ export const DeviceCard = styled(View)`
88
+ background-color: white;
89
+ border-radius: 12px;
90
+ padding: 16px;
91
+ margin-bottom: 12px;
92
+ flex-direction: row;
93
+ justify-content: space-between;
94
+ align-items: center;
95
+ shadow-color: #000;
96
+ shadow-offset: 0px 2px;
97
+ shadow-opacity: 0.1;
98
+ shadow-radius: 8px;
99
+ elevation: 3;
100
+ `;
101
+ export const DeviceInfo = styled(View)`
102
+ flex: 1;
103
+ `;
104
+ export const DeviceName = styled(Text)`
105
+ font-size: 16px;
106
+ font-weight: 600;
107
+ color: #111827;
108
+ margin-bottom: 4px;
109
+ `;
110
+ export const DeviceSignal = styled(Text)`
111
+ font-size: 14px;
112
+ color: #6b7280;
113
+ `;
114
+ export const PayButton = styled(TouchableOpacity)`
115
+ background-color: #2563eb;
116
+ padding: 10px 20px;
117
+ border-radius: 8px;
118
+ `;
119
+ export const PayButtonText = styled(Text)`
120
+ color: white;
121
+ font-size: 14px;
122
+ font-weight: 600;
123
+ `;
124
+ const ScrollContainer = styled.ScrollView`
125
+ flex: 1;
126
+ `;
127
+ const ContentContainer = styled(View)`
128
+ padding: 14px;
129
+ margin-bottom: 80%;
130
+ `;
131
+ const BluetoothIconContainer = styled(View)`
132
+ align-items: center;
133
+ margin-top: 15%;
134
+ `;
135
+
136
+ // ── SVG Icons — your originals, unchanged ────────────────────────────────────
137
+
138
+ const BluetoothIcon = ({
139
+ color = '#111',
140
+ size = 22
141
+ }) => /*#__PURE__*/_jsxs(Svg, {
142
+ width: size,
143
+ height: size,
144
+ strokeWidth: "0.9",
145
+ viewBox: "0 0 24 24",
146
+ fill: "none",
147
+ children: [/*#__PURE__*/_jsx(Path, {
148
+ d: "M6 19.0007C3.57111 17.1763 2 14.2716 2 11C2 5.47715 6.47715 1 12 1C17.5228 1 22 5.47715 22 11C22 14.2716 20.4289 17.1763 18 19.0007",
149
+ stroke: "#fff",
150
+ strokeWidth: "0.9",
151
+ strokeLinecap: "round",
152
+ strokeLinejoin: "round"
153
+ }), /*#__PURE__*/_jsx(Path, {
154
+ d: "M6 19.0007C3.57111 17.1763 2 14.2716 2 11C2 5.47715 6.47715 1 12 1C17.5228 1 22 5.47715 22 11C22 14.2716 20.4289 17.1763 18 19.0007",
155
+ stroke: "#fff",
156
+ strokeWidth: "0.9",
157
+ strokeLinecap: "round",
158
+ strokeLinejoin: "round"
159
+ }), /*#__PURE__*/_jsx(Path, {
160
+ d: "M7.52779 15C6.57771 13.9385 6 12.5367 6 11C6 7.68629 8.68629 5 12 5C15.3137 5 18 7.68629 18 11C18 12.5367 17.4223 13.9385 16.4722 15",
161
+ stroke: "#fff",
162
+ strokeWidth: "0.9",
163
+ strokeLinecap: "round",
164
+ strokeLinejoin: "round"
165
+ }), /*#__PURE__*/_jsx(Path, {
166
+ fillRule: "evenodd",
167
+ clipRule: "evenodd",
168
+ d: "M9.25 11C9.25 9.48122 10.4812 8.25 12 8.25C13.5188 8.25 14.75 9.48122 14.75 11C14.75 12.5188 13.5188 13.75 12 13.75C10.4812 13.75 9.25 12.5188 9.25 11Z",
169
+ fill: "#fff"
170
+ }), /*#__PURE__*/_jsx(Path, {
171
+ d: "M15.0776 21.4865C14.8566 22.8126 13.7093 23.7844 12.365 23.7844H11.7536C10.4093 23.7844 9.262 22.8126 9.041 21.4865L8.53213 18.4333C8.29232 16.9946 9.43086 15.8854 10.5339 15.15C11.9123 14.231 12.3864 14.3406 13.5847 15.1396C14.6421 15.8445 15.8263 16.9946 15.5865 18.4333L15.0776 21.4865Z",
172
+ fill: "#fff"
173
+ })]
174
+ });
175
+ const BluetoothScanningIcon = ({
176
+ color = '#111',
177
+ size = 22
178
+ }) => /*#__PURE__*/_jsx(Svg, {
179
+ width: size,
180
+ height: size,
181
+ strokeWidth: "0.9",
182
+ viewBox: "0 0 24 24",
183
+ fill: "none",
184
+ children: /*#__PURE__*/_jsx(Path, {
185
+ d: "M6.75 8L17.25 16.5L11.75 22V2L17.25 7.5L6.75 16",
186
+ stroke: color,
187
+ strokeWidth: "0.9",
188
+ strokeLinecap: "round",
189
+ strokeLinejoin: "round"
190
+ })
191
+ });
192
+ const PHASE_LABEL = {
193
+ idle: 'Ready',
194
+ scanning: 'Scanning for nearby FPay devices...',
195
+ selected: 'Device selected — ready to send',
196
+ requesting: 'Waiting for receiver to respond...',
197
+ transferring: 'Processing transfer...',
198
+ done: 'Payment sent!',
199
+ declined: 'Request was declined',
200
+ error: 'Something went wrong'
201
+ };
202
+ export function BluetoothSubScreen({
203
+ mode,
204
+ amount,
205
+ currency,
206
+ onBack,
207
+ onDone,
208
+ onSuccess,
209
+ onError
210
+ }) {
211
+ const [devices, setDevices] = useState([]);
212
+ const [scanning, setScanning] = useState(false);
213
+ const [status, setStatus] = useState('Ready to scan');
214
+ const [currentDevice, setCurrentDevice] = useState(null);
215
+
216
+ // ── 1. Scan ───────────────────────────────────────────────
217
+
218
+ const handleScan = async () => {
219
+ setDevices([]);
220
+ setScanning(true);
221
+ setStatus('Scanning for nearby users...');
222
+ try {
223
+ await FPEngine.scanForBluetoothDevices(device => {
224
+ setDevices(prevDevices => {
225
+ // Avoid duplicates
226
+ const exists = prevDevices.find(d => d.id === device.id);
227
+ if (exists) return prevDevices;
228
+ return [...prevDevices, device];
229
+ });
230
+ }, 5000 // Scan for 5 seconds
231
+ );
232
+ setScanning(false);
233
+ setStatus(`Found ${devices.length} user(s) nearby`);
234
+ } catch (error) {
235
+ console.error('Scan error:', error);
236
+ setScanning(false);
237
+ setStatus('Scan failed');
238
+ Alert.alert('Error', 'Failed to scan for devices');
239
+ } finally {
240
+ setScanning(false);
241
+ }
242
+ };
243
+ const handlePayment = async device => {
244
+ // Show payment amount input dialog (implement your own)
245
+ Alert.alert('Send Payment', `Send payment to ${device.userName || device.name}?`, [{
246
+ text: 'Cancel',
247
+ style: 'cancel'
248
+ }, {
249
+ text: `Continue`,
250
+ onPress: () => initiatePayment(device, 50)
251
+ }]);
252
+ };
253
+ const initiatePayment = async (device, amount) => {
254
+ try {
255
+ setCurrentDevice(device);
256
+ // Connect to the device
257
+ const user = FPEngine.getUser();
258
+ await FPEngine.deviceConnection(device.id);
259
+
260
+ // Create payment request
261
+ const request = {
262
+ amount,
263
+ currency,
264
+ senderId: user?.userId ?? user?.accountNumber ?? 'unknown',
265
+ senderName: user?.accountName ?? 'FountainPay User',
266
+ timestamp: Date.now()
267
+ };
268
+ setStatus(`Sending payment request...`);
269
+
270
+ // Send the payment request
271
+ console.log("Payment Request: ", request);
272
+ const response = await await FPEngine.sendBluetoothPaymentRequest(device.id, request);
273
+ console.log("Component response: ", response);
274
+ if (!response.accepted) {
275
+ Alert.alert('Payment Declined', `${device.userName} declined the payment`, [{
276
+ text: 'OK'
277
+ }]);
278
+ return;
279
+ }
280
+ if (!response.accountDetails) {
281
+ throw {
282
+ code: 'BT_MISSING_ACCOUNT',
283
+ message: 'Receiver accepted but sent no account details'
284
+ };
285
+ }
286
+ const result = await transferAPI.send({
287
+ accountNumber: response.accountDetails.accountNumber,
288
+ bankCode: response.accountDetails.bankCode,
289
+ amount: amount * 100,
290
+ narration: `Bluetooth payment to ${response.accountDetails.accountName}`,
291
+ reference: response.transactionId
292
+ });
293
+ const tx = {
294
+ id: result.reference,
295
+ reference: result.reference,
296
+ type: 'debit',
297
+ channel: 'bluetooth',
298
+ amount: result.amount,
299
+ currency: result.currency,
300
+ status: result.status,
301
+ recipient: {
302
+ accountName: response.accountDetails.accountName
303
+ },
304
+ createdAt: result.createdAt
305
+ };
306
+ onSuccess?.(tx);
307
+ setCurrentDevice(null);
308
+ setStatus('Waiting for response...');
309
+ } catch (error) {
310
+ const fp = error;
311
+ setCurrentDevice(null);
312
+ if (error.message.includes('timeout')) {
313
+ Alert.alert('Request Timeout', 'The receiver did not respond in time. They may not have seen the request.', [{
314
+ text: 'OK'
315
+ }]);
316
+ } else {
317
+ Alert.alert('Error', 'Failed to send payment request');
318
+ }
319
+ onError?.(fp);
320
+ }
321
+ };
322
+ return /*#__PURE__*/_jsxs(Container, {
323
+ children: [/*#__PURE__*/_jsxs(Header, {
324
+ children: [/*#__PURE__*/_jsxs(HeaderCenter, {
325
+ children: [/*#__PURE__*/_jsx(Text, {
326
+ style: {
327
+ fontWeight: 'bold',
328
+ fontSize: 16,
329
+ color: '#FFF'
330
+ },
331
+ children: "Bluetooth"
332
+ }), /*#__PURE__*/_jsx(Text, {
333
+ style: {
334
+ fontSize: 10,
335
+ color: '#FFF'
336
+ },
337
+ children: "Transfer"
338
+ })]
339
+ }), /*#__PURE__*/_jsx(HeaderRight, {
340
+ children: /*#__PURE__*/_jsx(HeaderButton, {
341
+ children: /*#__PURE__*/_jsx(Ionicons, {
342
+ name: "ellipsis-vertical",
343
+ size: 22
344
+ })
345
+ })
346
+ })]
347
+ }), !scanning && !devices.length && /*#__PURE__*/_jsxs(QuickLinksContainer, {
348
+ children: [/*#__PURE__*/_jsx(QuickLinksIcon, {
349
+ onPress: handleScan,
350
+ children: /*#__PURE__*/_jsx(BluetoothIcon, {
351
+ size: 40,
352
+ color: "#FFF"
353
+ })
354
+ }), /*#__PURE__*/_jsx(QuickLinksText, {
355
+ children: "Tap to Pay"
356
+ }), /*#__PURE__*/_jsx(Text, {
357
+ style: {
358
+ fontSize: 16,
359
+ color: '#999'
360
+ },
361
+ children: "No nearby users found"
362
+ })]
363
+ }), scanning && /*#__PURE__*/_jsx(_Fragment, {
364
+ children: /*#__PURE__*/_jsxs(QuickLinksContainer, {
365
+ children: [/*#__PURE__*/_jsx(PulseAnimation, {}), /*#__PURE__*/_jsxs(BluetoothIconContainer, {
366
+ children: [/*#__PURE__*/_jsx(BluetoothScanningIcon, {
367
+ size: 40,
368
+ color: "#FFF"
369
+ }), /*#__PURE__*/_jsx(QuickLinksText, {
370
+ children: "Scanning..."
371
+ })]
372
+ })]
373
+ })
374
+ }), !scanning && devices.length > 0 && /*#__PURE__*/_jsx(ScrollContainer, {
375
+ showsVerticalScrollIndicator: false,
376
+ children: /*#__PURE__*/_jsxs(ContentContainer, {
377
+ children: [/*#__PURE__*/_jsx(QuickLinksContainerWithDevices, {
378
+ children: /*#__PURE__*/_jsxs(QuickLinksText, {
379
+ children: ["Found ", devices.length, " user(s)"]
380
+ })
381
+ }), devices.map(device => /*#__PURE__*/_jsxs(DeviceCard, {
382
+ children: [/*#__PURE__*/_jsxs(DeviceInfo, {
383
+ children: [/*#__PURE__*/_jsxs(DeviceName, {
384
+ children: [device.appName, ": ", device.userName || device.name]
385
+ }), /*#__PURE__*/_jsxs(DeviceSignal, {
386
+ children: ["Signal: ", device.rssi, " dBm"]
387
+ })]
388
+ }), currentDevice?.id === device.id ? /*#__PURE__*/_jsx(InLoading, {
389
+ size: 40,
390
+ text: ""
391
+ }) : /*#__PURE__*/_jsx(PayButton, {
392
+ onPress: () => handlePayment(device),
393
+ activeOpacity: 0.8,
394
+ children: /*#__PURE__*/_jsx(PayButtonText, {
395
+ children: "Pay"
396
+ })
397
+ })]
398
+ }, device.id))]
399
+ })
400
+ })]
401
+ });
402
+ }
403
+ //# sourceMappingURL=BluetoothSubScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useState","View","Text","TouchableOpacity","Alert","styled","Svg","Path","Ionicons","transferAPI","FPEngine","PulseAnimation","InLoading","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","Container","Header","HeaderButton","HeaderCenter","HeaderRight","QuickLinksContainer","QuickLinksContainerWithDevices","QuickLinksIcon","QuickLinksText","DeviceCard","DeviceInfo","DeviceName","DeviceSignal","PayButton","PayButtonText","ScrollContainer","ScrollView","ContentContainer","BluetoothIconContainer","BluetoothIcon","color","size","width","height","strokeWidth","viewBox","fill","children","d","stroke","strokeLinecap","strokeLinejoin","fillRule","clipRule","BluetoothScanningIcon","PHASE_LABEL","idle","scanning","selected","requesting","transferring","done","declined","error","BluetoothSubScreen","mode","amount","currency","onBack","onDone","onSuccess","onError","devices","setDevices","setScanning","status","setStatus","currentDevice","setCurrentDevice","handleScan","scanForBluetoothDevices","device","prevDevices","exists","find","id","length","console","alert","handlePayment","userName","name","text","style","onPress","initiatePayment","user","getUser","deviceConnection","request","senderId","userId","accountNumber","senderName","accountName","timestamp","Date","now","log","response","sendBluetoothPaymentRequest","accepted","accountDetails","code","message","result","send","bankCode","narration","reference","transactionId","tx","type","channel","recipient","createdAt","fp","includes","fontWeight","fontSize","showsVerticalScrollIndicator","map","appName","rssi","activeOpacity"],"sourceRoot":"../../../../../src","sources":["ui/screens/sub/BluetoothSubScreen.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ import React, { useState } from 'react';
4
+ import { View, Text, StyleSheet } from 'react-native';
5
+ import NfcManager, { NfcTech, Ndef } from 'react-native-nfc-manager';
6
+ import { transferAPI } from "../../../core/api/index.js";
7
+ import { FPButton } from "../../components/FPButton.js";
8
+ import { C, R, S, F } from "../../theme/index.js";
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ export function NFCSubScreen({
11
+ mode,
12
+ amount,
13
+ currency = 'NGN',
14
+ myWallet,
15
+ onBack,
16
+ onDone,
17
+ onSuccess,
18
+ onError
19
+ }) {
20
+ const [phase, setPhase] = useState('idle');
21
+ const [msg, setMsg] = useState('');
22
+ const tapToReceive = async () => {
23
+ if (!myWallet) return;
24
+ setPhase('active');
25
+ try {
26
+ await NfcManager.start();
27
+ await NfcManager.requestTechnology(NfcTech.Ndef);
28
+ const bytes = Ndef.encodeMessage([Ndef.textRecord(JSON.stringify(myWallet))]);
29
+ if (bytes) await NfcManager.ndefHandler.writeNdefMessage(bytes);
30
+ setPhase('success');
31
+ setMsg('Your payment details are now on the NFC tag.');
32
+ } catch (e) {
33
+ setPhase('error');
34
+ setMsg(e.message);
35
+ onError?.({
36
+ code: 'NFC_ERROR',
37
+ message: e.message
38
+ });
39
+ } finally {
40
+ NfcManager.cancelTechnologyRequest();
41
+ }
42
+ };
43
+ const tapToSend = async () => {
44
+ setPhase('active');
45
+ try {
46
+ await NfcManager.start();
47
+ await NfcManager.requestTechnology(NfcTech.Ndef);
48
+ const tag = await NfcManager.getTag();
49
+ if (!tag?.ndefMessage?.[0]?.payload) throw new Error('No wallet data on tag');
50
+ const payload = new Uint8Array(tag.ndefMessage[0].payload);
51
+ const text = Ndef.text.decodePayload(payload);
52
+ const wallet = JSON.parse(text);
53
+ const result = await transferAPI.send({
54
+ accountNumber: wallet.accountNumber,
55
+ bankCode: wallet.bankCode,
56
+ amount: (amount ?? 0) * 100,
57
+ narration: 'NFC payment'
58
+ });
59
+ onSuccess?.({
60
+ id: result.reference,
61
+ reference: result.reference,
62
+ type: 'debit',
63
+ channel: 'nfc',
64
+ amount: result.amount,
65
+ currency: result.currency,
66
+ status: result.status,
67
+ recipient: {
68
+ accountName: wallet.accountName
69
+ },
70
+ createdAt: result.createdAt
71
+ });
72
+ setPhase('success');
73
+ setMsg('Payment sent!');
74
+ } catch (e) {
75
+ setPhase('error');
76
+ setMsg(e.message);
77
+ onError?.({
78
+ code: 'NFC_ERROR',
79
+ message: e.message
80
+ });
81
+ } finally {
82
+ NfcManager.cancelTechnologyRequest();
83
+ }
84
+ };
85
+ return /*#__PURE__*/_jsxs(View, {
86
+ style: st.wrap,
87
+ children: [/*#__PURE__*/_jsx(Text, {
88
+ onPress: onBack,
89
+ style: st.back,
90
+ children: "Back"
91
+ }), /*#__PURE__*/_jsxs(Text, {
92
+ style: st.title,
93
+ children: ["NFC ", mode === 'send' ? 'Payment' : 'Receive']
94
+ }), /*#__PURE__*/_jsxs(View, {
95
+ style: [st.tapZone, phase === 'active' && st.tapActive, phase === 'success' && st.tapSuccess, phase === 'error' && st.tapError],
96
+ children: [/*#__PURE__*/_jsx(Text, {
97
+ style: st.tapEmoji,
98
+ children: phase === 'success' ? 'OK' : phase === 'error' ? 'ERR' : 'NFC'
99
+ }), /*#__PURE__*/_jsx(Text, {
100
+ style: st.tapLabel,
101
+ children: phase === 'idle' ? mode === 'send' ? 'Tap to pay' : 'Tap to receive' : phase === 'active' ? 'Scanning...' : phase === 'success' ? 'Success!' : msg
102
+ })]
103
+ }), phase === 'idle' && /*#__PURE__*/_jsx(FPButton, {
104
+ label: mode === 'send' ? 'Start NFC Scan' : 'Write to NFC Tag',
105
+ onPress: mode === 'send' ? tapToSend : tapToReceive,
106
+ style: {
107
+ marginTop: S.md
108
+ }
109
+ }), phase === 'success' && /*#__PURE__*/_jsx(FPButton, {
110
+ label: "Done",
111
+ onPress: onDone,
112
+ style: {
113
+ marginTop: S.md
114
+ }
115
+ }), phase === 'error' && /*#__PURE__*/_jsx(FPButton, {
116
+ label: "Try Again",
117
+ onPress: () => setPhase('idle'),
118
+ style: {
119
+ marginTop: S.md
120
+ }
121
+ })]
122
+ });
123
+ }
124
+ const st = StyleSheet.create({
125
+ wrap: {
126
+ flex: 1,
127
+ padding: S.lg
128
+ },
129
+ back: {
130
+ color: C.brand,
131
+ fontSize: F.md,
132
+ fontWeight: '600',
133
+ marginBottom: S.md
134
+ },
135
+ title: {
136
+ fontSize: F.xl,
137
+ fontWeight: '800',
138
+ color: C.ink,
139
+ marginBottom: S.lg
140
+ },
141
+ tapZone: {
142
+ height: 180,
143
+ backgroundColor: C.ink,
144
+ borderRadius: R.xl,
145
+ justifyContent: 'center',
146
+ alignItems: 'center'
147
+ },
148
+ tapActive: {
149
+ backgroundColor: C.brand
150
+ },
151
+ tapSuccess: {
152
+ backgroundColor: C.green
153
+ },
154
+ tapError: {
155
+ backgroundColor: C.red
156
+ },
157
+ tapEmoji: {
158
+ fontSize: 40,
159
+ color: C.white,
160
+ fontWeight: '800',
161
+ marginBottom: S.sm
162
+ },
163
+ tapLabel: {
164
+ color: C.white,
165
+ fontSize: F.lg,
166
+ fontWeight: '700'
167
+ }
168
+ });
169
+ //# sourceMappingURL=NFCSubScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useState","View","Text","StyleSheet","NfcManager","NfcTech","Ndef","transferAPI","FPButton","C","R","S","F","jsx","_jsx","jsxs","_jsxs","NFCSubScreen","mode","amount","currency","myWallet","onBack","onDone","onSuccess","onError","phase","setPhase","msg","setMsg","tapToReceive","start","requestTechnology","bytes","encodeMessage","textRecord","JSON","stringify","ndefHandler","writeNdefMessage","e","message","code","cancelTechnologyRequest","tapToSend","tag","getTag","ndefMessage","payload","Error","Uint8Array","text","decodePayload","wallet","parse","result","send","accountNumber","bankCode","narration","id","reference","type","channel","status","recipient","accountName","createdAt","style","st","wrap","children","onPress","back","title","tapZone","tapActive","tapSuccess","tapError","tapEmoji","tapLabel","label","marginTop","md","create","flex","padding","lg","color","brand","fontSize","fontWeight","marginBottom","xl","ink","height","backgroundColor","borderRadius","justifyContent","alignItems","green","red","white","sm"],"sourceRoot":"../../../../../src","sources":["ui/screens/sub/NFCSubScreen.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAASC,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAA0B,cAAc;AACvE,OAAOC,UAAU,IAAIC,OAAO,EAAEC,IAAI,QAAQ,0BAA0B;AACpE,SAASC,WAAW,QAAQ,4BAAmB;AAC/C,SAASC,QAAQ,QAAQ,8BAA2B;AACpD,SAASC,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAEC,CAAC,QAAQ,sBAAa;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAazC,OAAO,SAASC,YAAYA,CAAC;EAAEC,IAAI;EAAEC,MAAM;EAAEC,QAAQ,GAAG,KAAK;EAAEC,QAAQ;EAAEC,MAAM;EAAEC,MAAM;EAAEC,SAAS;EAAEC;AAAe,CAAC,EAAE;EACpH,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG3B,QAAQ,CAAQ,MAAM,CAAC;EACjD,MAAM,CAAC4B,GAAG,EAAEC,MAAM,CAAC,GAAG7B,QAAQ,CAAC,EAAE,CAAC;EAElC,MAAM8B,YAAY,GAAG,MAAAA,CAAA,KAAY;IAC/B,IAAI,CAACT,QAAQ,EAAE;IACfM,QAAQ,CAAC,QAAQ,CAAC;IAClB,IAAI;MACF,MAAMvB,UAAU,CAAC2B,KAAK,CAAC,CAAC;MACxB,MAAM3B,UAAU,CAAC4B,iBAAiB,CAAC3B,OAAO,CAACC,IAAI,CAAC;MAChD,MAAM2B,KAAK,GAAG3B,IAAI,CAAC4B,aAAa,CAAC,CAAC5B,IAAI,CAAC6B,UAAU,CAACC,IAAI,CAACC,SAAS,CAAChB,QAAQ,CAAC,CAAC,CAAC,CAAC;MAC7E,IAAIY,KAAK,EAAE,MAAM7B,UAAU,CAACkC,WAAW,CAACC,gBAAgB,CAACN,KAAK,CAAC;MAC/DN,QAAQ,CAAC,SAAS,CAAC;MAAEE,MAAM,CAAC,8CAA8C,CAAC;IAC7E,CAAC,CAAC,OAAOW,CAAM,EAAE;MAAEb,QAAQ,CAAC,OAAO,CAAC;MAAEE,MAAM,CAACW,CAAC,CAACC,OAAO,CAAC;MAAEhB,OAAO,GAAG;QAAEiB,IAAI,EAAE,WAAW;QAAED,OAAO,EAAED,CAAC,CAACC;MAAQ,CAAC,CAAC;IAAE,CAAC,SACxG;MAAErC,UAAU,CAACuC,uBAAuB,CAAC,CAAC;IAAE;EAClD,CAAC;EAED,MAAMC,SAAS,GAAG,MAAAA,CAAA,KAAY;IAC5BjB,QAAQ,CAAC,QAAQ,CAAC;IAClB,IAAI;MACF,MAAMvB,UAAU,CAAC2B,KAAK,CAAC,CAAC;MACxB,MAAM3B,UAAU,CAAC4B,iBAAiB,CAAC3B,OAAO,CAACC,IAAI,CAAC;MAChD,MAAMuC,GAAG,GAAG,MAAMzC,UAAU,CAAC0C,MAAM,CAAC,CAAC;MACrC,IAAI,CAACD,GAAG,EAAEE,WAAW,GAAG,CAAC,CAAC,EAAEC,OAAO,EAAE,MAAM,IAAIC,KAAK,CAAC,uBAAuB,CAAC;MAC7E,MAAMD,OAAO,GAAG,IAAIE,UAAU,CAACL,GAAG,CAACE,WAAW,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC;MAC1D,MAAMG,IAAI,GAAG7C,IAAI,CAAC6C,IAAI,CAACC,aAAa,CAACJ,OAAO,CAAC;MAC7C,MAAMK,MAAM,GAAGjB,IAAI,CAACkB,KAAK,CAACH,IAAI,CAAC;MAC/B,MAAMI,MAAM,GAAG,MAAMhD,WAAW,CAACiD,IAAI,CAAC;QAAEC,aAAa,EAAEJ,MAAM,CAACI,aAAa;QAAEC,QAAQ,EAAEL,MAAM,CAACK,QAAQ;QAAEvC,MAAM,EAAE,CAACA,MAAM,IAAI,CAAC,IAAI,GAAG;QAAEwC,SAAS,EAAE;MAAc,CAAC,CAAC;MAChKnC,SAAS,GAAG;QAAEoC,EAAE,EAAEL,MAAM,CAACM,SAAS;QAAEA,SAAS,EAAEN,MAAM,CAACM,SAAS;QAAEC,IAAI,EAAE,OAAO;QAAEC,OAAO,EAAE,KAAK;QAAE5C,MAAM,EAAEoC,MAAM,CAACpC,MAAM;QAAEC,QAAQ,EAAEmC,MAAM,CAACnC,QAAQ;QAAE4C,MAAM,EAAET,MAAM,CAACS,MAAM;QAAEC,SAAS,EAAE;UAAEC,WAAW,EAAEb,MAAM,CAACa;QAAY,CAAC;QAAEC,SAAS,EAAEZ,MAAM,CAACY;MAAU,CAAC,CAAC;MACvPxC,QAAQ,CAAC,SAAS,CAAC;MAAEE,MAAM,CAAC,eAAe,CAAC;IAC9C,CAAC,CAAC,OAAOW,CAAM,EAAE;MAAEb,QAAQ,CAAC,OAAO,CAAC;MAAEE,MAAM,CAACW,CAAC,CAACC,OAAO,CAAC;MAAEhB,OAAO,GAAG;QAAEiB,IAAI,EAAE,WAAW;QAAED,OAAO,EAAED,CAAC,CAACC;MAAQ,CAAC,CAAC;IAAE,CAAC,SACxG;MAAErC,UAAU,CAACuC,uBAAuB,CAAC,CAAC;IAAE;EAClD,CAAC;EAED,oBACE3B,KAAA,CAACf,IAAI;IAACmE,KAAK,EAAEC,EAAE,CAACC,IAAK;IAAAC,QAAA,gBACnBzD,IAAA,CAACZ,IAAI;MAACsE,OAAO,EAAElD,MAAO;MAAC8C,KAAK,EAAEC,EAAE,CAACI,IAAK;MAAAF,QAAA,EAAC;IAAI,CAAM,CAAC,eAClDvD,KAAA,CAACd,IAAI;MAACkE,KAAK,EAAEC,EAAE,CAACK,KAAM;MAAAH,QAAA,GAAC,MAAI,EAACrD,IAAI,KAAK,MAAM,GAAG,SAAS,GAAG,SAAS;IAAA,CAAO,CAAC,eAC3EF,KAAA,CAACf,IAAI;MAACmE,KAAK,EAAE,CAACC,EAAE,CAACM,OAAO,EAAEjD,KAAK,KAAK,QAAQ,IAAI2C,EAAE,CAACO,SAAS,EAAElD,KAAK,KAAK,SAAS,IAAI2C,EAAE,CAACQ,UAAU,EAAEnD,KAAK,KAAK,OAAO,IAAI2C,EAAE,CAACS,QAAQ,CAAE;MAAAP,QAAA,gBACpIzD,IAAA,CAACZ,IAAI;QAACkE,KAAK,EAAEC,EAAE,CAACU,QAAS;QAAAR,QAAA,EAAE7C,KAAK,KAAK,SAAS,GAAG,IAAI,GAAGA,KAAK,KAAK,OAAO,GAAG,KAAK,GAAG;MAAK,CAAO,CAAC,eACjGZ,IAAA,CAACZ,IAAI;QAACkE,KAAK,EAAEC,EAAE,CAACW,QAAS;QAAAT,QAAA,EACtB7C,KAAK,KAAK,MAAM,GAAIR,IAAI,KAAK,MAAM,GAAG,YAAY,GAAG,gBAAgB,GACnEQ,KAAK,KAAK,QAAQ,GAAG,aAAa,GAClCA,KAAK,KAAK,SAAS,GAAG,UAAU,GAChCE;MAAG,CACF,CAAC;IAAA,CACH,CAAC,EACNF,KAAK,KAAK,MAAM,iBAAIZ,IAAA,CAACN,QAAQ;MAACyE,KAAK,EAAE/D,IAAI,KAAK,MAAM,GAAG,gBAAgB,GAAG,kBAAmB;MAACsD,OAAO,EAAEtD,IAAI,KAAK,MAAM,GAAG0B,SAAS,GAAGd,YAAa;MAACsC,KAAK,EAAE;QAAEc,SAAS,EAAEvE,CAAC,CAACwE;MAAG;IAAE,CAAE,CAAC,EACjLzD,KAAK,KAAK,SAAS,iBAAIZ,IAAA,CAACN,QAAQ;MAACyE,KAAK,EAAC,MAAM;MAACT,OAAO,EAAEjD,MAAO;MAAC6C,KAAK,EAAE;QAAEc,SAAS,EAAEvE,CAAC,CAACwE;MAAG;IAAE,CAAE,CAAC,EAC7FzD,KAAK,KAAK,OAAO,iBAAIZ,IAAA,CAACN,QAAQ;MAACyE,KAAK,EAAC,WAAW;MAACT,OAAO,EAAEA,CAAA,KAAM7C,QAAQ,CAAC,MAAM,CAAE;MAACyC,KAAK,EAAE;QAAEc,SAAS,EAAEvE,CAAC,CAACwE;MAAG;IAAE,CAAE,CAAC;EAAA,CAC7G,CAAC;AAEX;AAEA,MAAMd,EAAE,GAAGlE,UAAU,CAACiF,MAAM,CAAC;EAC3Bd,IAAI,EAAE;IAAEe,IAAI,EAAE,CAAC;IAAEC,OAAO,EAAE3E,CAAC,CAAC4E;EAAG,CAAC;EAChCd,IAAI,EAAE;IAAEe,KAAK,EAAE/E,CAAC,CAACgF,KAAK;IAAEC,QAAQ,EAAE9E,CAAC,CAACuE,EAAE;IAAEQ,UAAU,EAAE,KAAK;IAAEC,YAAY,EAAEjF,CAAC,CAACwE;EAAG,CAAC;EAC/ET,KAAK,EAAE;IAAEgB,QAAQ,EAAE9E,CAAC,CAACiF,EAAE;IAAEF,UAAU,EAAE,KAAK;IAAEH,KAAK,EAAE/E,CAAC,CAACqF,GAAG;IAAEF,YAAY,EAAEjF,CAAC,CAAC4E;EAAG,CAAC;EAC9EZ,OAAO,EAAE;IAAEoB,MAAM,EAAE,GAAG;IAAEC,eAAe,EAAEvF,CAAC,CAACqF,GAAG;IAAEG,YAAY,EAAEvF,CAAC,CAACmF,EAAE;IAAEK,cAAc,EAAE,QAAQ;IAAEC,UAAU,EAAE;EAAS,CAAC;EACpHvB,SAAS,EAAE;IAAEoB,eAAe,EAAEvF,CAAC,CAACgF;EAAM,CAAC;EACvCZ,UAAU,EAAE;IAAEmB,eAAe,EAAEvF,CAAC,CAAC2F;EAAM,CAAC;EACxCtB,QAAQ,EAAE;IAAEkB,eAAe,EAAEvF,CAAC,CAAC4F;EAAI,CAAC;EACpCtB,QAAQ,EAAE;IAAEW,QAAQ,EAAE,EAAE;IAAEF,KAAK,EAAE/E,CAAC,CAAC6F,KAAK;IAAEX,UAAU,EAAE,KAAK;IAAEC,YAAY,EAAEjF,CAAC,CAAC4F;EAAG,CAAC;EACjFvB,QAAQ,EAAE;IAAEQ,KAAK,EAAE/E,CAAC,CAAC6F,KAAK;IAAEZ,QAAQ,EAAE9E,CAAC,CAAC2E,EAAE;IAAEI,UAAU,EAAE;EAAM;AAChE,CAAC,CAAC","ignoreList":[]}