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.
- package/Fpay.podspec +20 -0
- package/LICENSE +20 -0
- package/README.md +37 -0
- package/android/build.gradle +67 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/fpay/FpayModule.kt +15 -0
- package/android/src/main/java/com/fpay/FpayPackage.kt +31 -0
- package/ios/Fpay.h +5 -0
- package/ios/Fpay.mm +21 -0
- package/lib/module/FountainPayProvider.js +18 -0
- package/lib/module/FountainPayProvider.js.map +1 -0
- package/lib/module/core/api/client.js +47 -0
- package/lib/module/core/api/client.js.map +1 -0
- package/lib/module/core/api/index.js +35 -0
- package/lib/module/core/api/index.js.map +1 -0
- package/lib/module/core/types/index.js +4 -0
- package/lib/module/core/types/index.js.map +1 -0
- package/lib/module/engine/BLEReceiverService.js +190 -0
- package/lib/module/engine/BLEReceiverService.js.map +1 -0
- package/lib/module/engine/BLESenderService.js +259 -0
- package/lib/module/engine/BLESenderService.js.map +1 -0
- package/lib/module/engine/FPEngine.js +340 -0
- package/lib/module/engine/FPEngine.js.map +1 -0
- package/lib/module/engine/NearbyUsersService.js +87 -0
- package/lib/module/engine/NearbyUsersService.js.map +1 -0
- package/lib/module/index.js +16 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/ui/components/FPButton.js +71 -0
- package/lib/module/ui/components/FPButton.js.map +1 -0
- package/lib/module/ui/components/LoadingAnimation/InLoading.js +74 -0
- package/lib/module/ui/components/LoadingAnimation/InLoading.js.map +1 -0
- package/lib/module/ui/components/LoadingAnimation/index.js +82 -0
- package/lib/module/ui/components/LoadingAnimation/index.js.map +1 -0
- package/lib/module/ui/components/OtpInput/OTPInputView.js +290 -0
- package/lib/module/ui/components/OtpInput/OTPInputView.js.map +1 -0
- package/lib/module/ui/components/OtpInput/Styles.js +20 -0
- package/lib/module/ui/components/OtpInput/Styles.js.map +1 -0
- package/lib/module/ui/components/OtpInput/helpers/codeToArray.js +7 -0
- package/lib/module/ui/components/OtpInput/helpers/codeToArray.js.map +1 -0
- package/lib/module/ui/components/OtpInput/helpers/device.js +9 -0
- package/lib/module/ui/components/OtpInput/helpers/device.js.map +1 -0
- package/lib/module/ui/components/OtpInput/helpers/styles.js +17 -0
- package/lib/module/ui/components/OtpInput/helpers/styles.js.map +1 -0
- package/lib/module/ui/components/OtpInput/helpers/types.js +4 -0
- package/lib/module/ui/components/OtpInput/helpers/types.js.map +1 -0
- package/lib/module/ui/components/OtpInput/index.js +45 -0
- package/lib/module/ui/components/OtpInput/index.js.map +1 -0
- package/lib/module/ui/components/PulseAnimation.js +61 -0
- package/lib/module/ui/components/PulseAnimation.js.map +1 -0
- package/lib/module/ui/modals/FPPaymentRequestModal.js +253 -0
- package/lib/module/ui/modals/FPPaymentRequestModal.js.map +1 -0
- package/lib/module/ui/modals/FPShell.js +180 -0
- package/lib/module/ui/modals/FPShell.js.map +1 -0
- package/lib/module/ui/screens/ReceiveScreen.js +291 -0
- package/lib/module/ui/screens/ReceiveScreen.js.map +1 -0
- package/lib/module/ui/screens/SendScreen.js +216 -0
- package/lib/module/ui/screens/SendScreen.js.map +1 -0
- package/lib/module/ui/screens/sub/BluetoothSubScreen.js +403 -0
- package/lib/module/ui/screens/sub/BluetoothSubScreen.js.map +1 -0
- package/lib/module/ui/screens/sub/NFCSubScreen.js +169 -0
- package/lib/module/ui/screens/sub/NFCSubScreen.js.map +1 -0
- package/lib/module/ui/screens/sub/NQRSubScreen.js +136 -0
- package/lib/module/ui/screens/sub/NQRSubScreen.js.map +1 -0
- package/lib/module/ui/screens/sub/ProximitySubScreen.js +501 -0
- package/lib/module/ui/screens/sub/ProximitySubScreen.js.map +1 -0
- package/lib/module/ui/screens/sub/TransferSubScreen.js +361 -0
- package/lib/module/ui/screens/sub/TransferSubScreen.js.map +1 -0
- package/lib/module/ui/theme/index.js +64 -0
- package/lib/module/ui/theme/index.js.map +1 -0
- package/lib/module/useFountainPay.js +82 -0
- package/lib/module/useFountainPay.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/FountainPayProvider.d.ts +7 -0
- package/lib/typescript/src/FountainPayProvider.d.ts.map +1 -0
- package/lib/typescript/src/core/api/client.d.ts +7 -0
- package/lib/typescript/src/core/api/client.d.ts.map +1 -0
- package/lib/typescript/src/core/api/index.d.ts +67 -0
- package/lib/typescript/src/core/api/index.d.ts.map +1 -0
- package/lib/typescript/src/core/types/index.d.ts +130 -0
- package/lib/typescript/src/core/types/index.d.ts.map +1 -0
- package/lib/typescript/src/engine/BLEReceiverService.d.ts +43 -0
- package/lib/typescript/src/engine/BLEReceiverService.d.ts.map +1 -0
- package/lib/typescript/src/engine/BLESenderService.d.ts +39 -0
- package/lib/typescript/src/engine/BLESenderService.d.ts.map +1 -0
- package/lib/typescript/src/engine/FPEngine.d.ts +24 -0
- package/lib/typescript/src/engine/FPEngine.d.ts.map +1 -0
- package/lib/typescript/src/engine/NearbyUsersService.d.ts +19 -0
- package/lib/typescript/src/engine/NearbyUsersService.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/FPButton.d.ts +12 -0
- package/lib/typescript/src/ui/components/FPButton.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/LoadingAnimation/InLoading.d.ts +7 -0
- package/lib/typescript/src/ui/components/LoadingAnimation/InLoading.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/LoadingAnimation/index.d.ts +6 -0
- package/lib/typescript/src/ui/components/LoadingAnimation/index.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/OTPInputView.d.ts +29 -0
- package/lib/typescript/src/ui/components/OtpInput/OTPInputView.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/Styles.d.ts +330 -0
- package/lib/typescript/src/ui/components/OtpInput/Styles.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/codeToArray.d.ts +6 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/codeToArray.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/device.d.ts +6 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/device.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/styles.d.ts +6 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/styles.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/types.d.ts +84 -0
- package/lib/typescript/src/ui/components/OtpInput/helpers/types.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/OtpInput/index.d.ts +9 -0
- package/lib/typescript/src/ui/components/OtpInput/index.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/PulseAnimation.d.ts +2 -0
- package/lib/typescript/src/ui/components/PulseAnimation.d.ts.map +1 -0
- package/lib/typescript/src/ui/modals/FPPaymentRequestModal.d.ts +2 -0
- package/lib/typescript/src/ui/modals/FPPaymentRequestModal.d.ts.map +1 -0
- package/lib/typescript/src/ui/modals/FPShell.d.ts +2 -0
- package/lib/typescript/src/ui/modals/FPShell.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/ReceiveScreen.d.ts +10 -0
- package/lib/typescript/src/ui/screens/ReceiveScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/SendScreen.d.ts +9 -0
- package/lib/typescript/src/ui/screens/SendScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/sub/BluetoothSubScreen.d.ts +552 -0
- package/lib/typescript/src/ui/screens/sub/BluetoothSubScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/sub/NFCSubScreen.d.ts +19 -0
- package/lib/typescript/src/ui/screens/sub/NFCSubScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/sub/NQRSubScreen.d.ts +13 -0
- package/lib/typescript/src/ui/screens/sub/NQRSubScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/sub/ProximitySubScreen.d.ts +552 -0
- package/lib/typescript/src/ui/screens/sub/ProximitySubScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/screens/sub/TransferSubScreen.d.ts +12 -0
- package/lib/typescript/src/ui/screens/sub/TransferSubScreen.d.ts.map +1 -0
- package/lib/typescript/src/ui/theme/index.d.ts +62 -0
- package/lib/typescript/src/ui/theme/index.d.ts.map +1 -0
- package/lib/typescript/src/useFountainPay.d.ts +3 -0
- package/lib/typescript/src/useFountainPay.d.ts.map +1 -0
- package/package.json +217 -0
- package/src/FountainPayProvider.tsx +21 -0
- package/src/core/api/client.ts +47 -0
- package/src/core/api/index.ts +61 -0
- package/src/core/types/index.ts +144 -0
- package/src/engine/BLEReceiverService.ts +244 -0
- package/src/engine/BLESenderService.ts +314 -0
- package/src/engine/FPEngine.ts +370 -0
- package/src/engine/NearbyUsersService.ts +106 -0
- package/src/index.ts +30 -0
- package/src/ui/components/FPButton.tsx +42 -0
- package/src/ui/components/LoadingAnimation/InLoading.tsx +88 -0
- package/src/ui/components/LoadingAnimation/index.tsx +93 -0
- package/src/ui/components/OtpInput/OTPInputView.tsx +243 -0
- package/src/ui/components/OtpInput/Styles.ts +19 -0
- package/src/ui/components/OtpInput/helpers/codeToArray.ts +3 -0
- package/src/ui/components/OtpInput/helpers/device.ts +6 -0
- package/src/ui/components/OtpInput/helpers/styles.ts +17 -0
- package/src/ui/components/OtpInput/helpers/types.ts +88 -0
- package/src/ui/components/OtpInput/index.tsx +51 -0
- package/src/ui/components/PulseAnimation.tsx +78 -0
- package/src/ui/modals/FPPaymentRequestModal.tsx +158 -0
- package/src/ui/modals/FPShell.tsx +107 -0
- package/src/ui/screens/ReceiveScreen.tsx +119 -0
- package/src/ui/screens/SendScreen.tsx +86 -0
- package/src/ui/screens/sub/BluetoothSubScreen.tsx +433 -0
- package/src/ui/screens/sub/NFCSubScreen.tsx +83 -0
- package/src/ui/screens/sub/NQRSubScreen.tsx +61 -0
- package/src/ui/screens/sub/ProximitySubScreen.tsx +390 -0
- package/src/ui/screens/sub/TransferSubScreen.tsx +146 -0
- package/src/ui/theme/index.ts +24 -0
- 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":"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","ignoreList":[]}
|