react-native-fpay 0.3.5 → 0.3.7
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/lib/module/FountainPayProvider.js +108 -18
- package/lib/module/FountainPayProvider.js.map +1 -1
- package/lib/module/core/api/client.js +13 -1
- package/lib/module/core/api/client.js.map +1 -1
- package/lib/module/core/api/index.js +66 -24
- package/lib/module/core/api/index.js.map +1 -1
- package/lib/module/engine/BLEReceiverService.js.map +1 -1
- package/lib/module/engine/BLESenderService.js.map +1 -1
- package/lib/module/engine/FPEngine.js +164 -43
- package/lib/module/engine/FPEngine.js.map +1 -1
- package/lib/module/engine/NearbyUsersService.js +1 -1
- package/lib/module/engine/NearbyUsersService.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/store/FPStore.js +155 -0
- package/lib/module/store/FPStore.js.map +1 -0
- package/lib/module/ui/components/AnimatedDots.js +3 -3
- package/lib/module/ui/components/AnimatedDots.js.map +1 -1
- package/lib/module/ui/components/ConfirmScreen.js +137 -123
- package/lib/module/ui/components/ConfirmScreen.js.map +1 -1
- package/lib/module/ui/components/FPButton.js.map +1 -1
- package/lib/module/ui/components/LoadingAnimation/InLoading.js +3 -3
- package/lib/module/ui/components/LoadingAnimation/InLoading.js.map +1 -1
- package/lib/module/ui/components/LoadingAnimation/index.js +3 -3
- package/lib/module/ui/components/LoadingAnimation/index.js.map +1 -1
- package/lib/module/ui/components/OtpInput/OTPInputView.js +11 -11
- package/lib/module/ui/components/OtpInput/OTPInputView.js.map +1 -1
- package/lib/module/ui/components/OtpInput/Styles.js +1 -1
- package/lib/module/ui/components/OtpInput/helpers/codeToArray.js +1 -1
- package/lib/module/ui/components/OtpInput/helpers/device.js.map +1 -1
- package/lib/module/ui/components/OtpInput/helpers/styles.js.map +1 -1
- package/lib/module/ui/components/OtpInput/index.js +3 -1
- package/lib/module/ui/components/OtpInput/index.js.map +1 -1
- package/lib/module/ui/components/PulseAnimation.js +2 -2
- package/lib/module/ui/components/PulseAnimation.js.map +1 -1
- package/lib/module/ui/modals/FPPaymentRequestModal.js +8 -7
- package/lib/module/ui/modals/FPPaymentRequestModal.js.map +1 -1
- package/lib/module/ui/modals/FPShell.js +2 -0
- package/lib/module/ui/modals/FPShell.js.map +1 -1
- package/lib/module/ui/screens/ReceiveScreen.js +8 -9
- package/lib/module/ui/screens/ReceiveScreen.js.map +1 -1
- package/lib/module/ui/screens/SendScreen.js +43 -94
- package/lib/module/ui/screens/SendScreen.js.map +1 -1
- package/lib/module/ui/screens/styles.js +15 -3
- package/lib/module/ui/screens/styles.js.map +1 -1
- package/lib/module/ui/screens/sub/receivePayment/Nfc/index.js +4 -4
- package/lib/module/ui/screens/sub/receivePayment/Nfc/index.js.map +1 -1
- package/lib/module/ui/screens/sub/receivePayment/Qr/index.js +5 -5
- package/lib/module/ui/screens/sub/receivePayment/Qr/index.js.map +1 -1
- package/lib/module/ui/screens/sub/receivePayment/Transfer/index.js +10 -11
- package/lib/module/ui/screens/sub/receivePayment/Transfer/index.js.map +1 -1
- package/lib/module/ui/screens/sub/sendPayment/BluetoothSubScreen.js +31 -8
- package/lib/module/ui/screens/sub/sendPayment/BluetoothSubScreen.js.map +1 -1
- package/lib/module/ui/screens/sub/sendPayment/NFCSubScreen.js +12 -8
- package/lib/module/ui/screens/sub/sendPayment/NFCSubScreen.js.map +1 -1
- package/lib/module/ui/screens/sub/sendPayment/NQRSubScreen.js +17 -5
- package/lib/module/ui/screens/sub/sendPayment/NQRSubScreen.js.map +1 -1
- package/lib/module/ui/screens/sub/sendPayment/ProximitySubScreen.js +67 -35
- package/lib/module/ui/screens/sub/sendPayment/ProximitySubScreen.js.map +1 -1
- package/lib/module/ui/screens/sub/sendPayment/TransferSubScreen.js +110 -34
- package/lib/module/ui/screens/sub/sendPayment/TransferSubScreen.js.map +1 -1
- package/lib/module/ui/theme/index.js.map +1 -1
- package/lib/typescript/src/FountainPayProvider.d.ts +1 -1
- package/lib/typescript/src/FountainPayProvider.d.ts.map +1 -1
- package/lib/typescript/src/core/api/client.d.ts.map +1 -1
- package/lib/typescript/src/core/api/index.d.ts +42 -26
- package/lib/typescript/src/core/api/index.d.ts.map +1 -1
- package/lib/typescript/src/core/types/index.d.ts +53 -28
- package/lib/typescript/src/core/types/index.d.ts.map +1 -1
- package/lib/typescript/src/engine/BLEReceiverService.d.ts +2 -0
- package/lib/typescript/src/engine/BLEReceiverService.d.ts.map +1 -1
- package/lib/typescript/src/engine/BLESenderService.d.ts.map +1 -1
- package/lib/typescript/src/engine/FPEngine.d.ts +5 -3
- package/lib/typescript/src/engine/FPEngine.d.ts.map +1 -1
- package/lib/typescript/src/engine/useIsForeground.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/store/FPStore.d.ts +60 -0
- package/lib/typescript/src/store/FPStore.d.ts.map +1 -0
- package/lib/typescript/src/ui/components/AnimatedDots.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/ConfirmScreen.d.ts +5 -5
- package/lib/typescript/src/ui/components/ConfirmScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/FPButton.d.ts +1 -1
- package/lib/typescript/src/ui/components/FPButton.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/LoadingAnimation/InLoading.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/LoadingAnimation/index.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/OtpInput/OTPInputView.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/OtpInput/helpers/codeToArray.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/OtpInput/helpers/device.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/OtpInput/helpers/styles.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/OtpInput/helpers/types.d.ts +1 -2
- package/lib/typescript/src/ui/components/OtpInput/helpers/types.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/OtpInput/index.d.ts +3 -1
- package/lib/typescript/src/ui/components/OtpInput/index.d.ts.map +1 -1
- package/lib/typescript/src/ui/components/PulseAnimation.d.ts.map +1 -1
- package/lib/typescript/src/ui/modals/FPPaymentRequestModal.d.ts.map +1 -1
- package/lib/typescript/src/ui/modals/FPShell.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/ReceiveScreen.d.ts +1 -1
- package/lib/typescript/src/ui/screens/ReceiveScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/SendScreen.d.ts +1 -1
- package/lib/typescript/src/ui/screens/SendScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/styles.d.ts +197 -0
- package/lib/typescript/src/ui/screens/styles.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/receivePayment/Nfc/index.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/receivePayment/Qr/index.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/receivePayment/Transfer/index.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/BluetoothSubScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/NFCSubScreen.d.ts +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/NFCSubScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/NQRSubScreen.d.ts +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/NQRSubScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/ProximitySubScreen.d.ts +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/ProximitySubScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/TransferSubScreen.d.ts +1 -1
- package/lib/typescript/src/ui/screens/sub/sendPayment/TransferSubScreen.d.ts.map +1 -1
- package/lib/typescript/src/ui/theme/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/FountainPayProvider.tsx +163 -24
- package/src/core/api/client.ts +26 -4
- package/src/core/api/index.ts +170 -49
- package/src/core/types/index.ts +81 -48
- package/src/engine/BLEReceiverService.ts +86 -28
- package/src/engine/BLESenderService.ts +133 -69
- package/src/engine/FPEngine.ts +316 -97
- package/src/engine/NearbyUsersService.ts +6 -6
- package/src/engine/useIsForeground.ts +12 -12
- package/src/index.ts +10 -4
- package/src/store/FPStore.ts +216 -0
- package/src/ui/components/AnimatedDots.tsx +4 -5
- package/src/ui/components/ConfirmScreen.tsx +182 -169
- package/src/ui/components/FPButton.tsx +50 -9
- package/src/ui/components/LoadingAnimation/InLoading.tsx +23 -27
- package/src/ui/components/LoadingAnimation/index.tsx +3 -7
- package/src/ui/components/OtpInput/OTPInputView.tsx +254 -205
- package/src/ui/components/OtpInput/Styles.ts +1 -1
- package/src/ui/components/OtpInput/helpers/codeToArray.ts +2 -2
- package/src/ui/components/OtpInput/helpers/device.ts +4 -3
- package/src/ui/components/OtpInput/helpers/styles.ts +13 -14
- package/src/ui/components/OtpInput/helpers/types.ts +83 -79
- package/src/ui/components/OtpInput/index.tsx +18 -15
- package/src/ui/components/PulseAnimation.tsx +3 -5
- package/src/ui/modals/FPPaymentRequestModal.tsx +111 -28
- package/src/ui/modals/FPShell.tsx +60 -34
- package/src/ui/screens/ReceiveScreen.tsx +245 -84
- package/src/ui/screens/SendScreen.tsx +419 -167
- package/src/ui/screens/styles.ts +17 -5
- package/src/ui/screens/sub/receivePayment/Nfc/index.tsx +17 -25
- package/src/ui/screens/sub/receivePayment/Qr/index.tsx +21 -20
- package/src/ui/screens/sub/receivePayment/Transfer/index.tsx +34 -28
- package/src/ui/screens/sub/sendPayment/BluetoothSubScreen.tsx +135 -67
- package/src/ui/screens/sub/sendPayment/NFCSubScreen.tsx +188 -112
- package/src/ui/screens/sub/sendPayment/NQRSubScreen.tsx +102 -69
- package/src/ui/screens/sub/sendPayment/ProximitySubScreen.tsx +225 -99
- package/src/ui/screens/sub/sendPayment/TransferSubScreen.tsx +209 -89
- package/src/ui/theme/index.ts +14 -2
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
Text,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
ActivityIndicator,
|
|
7
|
+
Image,
|
|
8
|
+
TouchableOpacity,
|
|
9
|
+
Dimensions,
|
|
10
|
+
Animated,
|
|
11
|
+
Easing,
|
|
12
|
+
Alert,
|
|
13
|
+
Vibration,
|
|
14
|
+
Linking,
|
|
15
|
+
} from 'react-native';
|
|
3
16
|
import { nqrAPI } from '../../../../core/api';
|
|
4
17
|
import { FPButton } from '../../../components/FPButton';
|
|
5
18
|
import { C, R, S, F, shadow } from '../../../theme';
|
|
6
19
|
import type { FPCurrency, FPError, Props } from '../../../../core/types';
|
|
7
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
Camera,
|
|
22
|
+
useCameraDevice,
|
|
23
|
+
useCameraDevices,
|
|
24
|
+
useCodeScanner,
|
|
25
|
+
} from 'react-native-vision-camera';
|
|
8
26
|
import styled from 'styled-components/native';
|
|
9
27
|
import { launchImageLibrary } from 'react-native-image-picker';
|
|
10
28
|
import QRKit from 'react-native-qr-kit';
|
|
@@ -122,8 +140,8 @@ const CornerBorder = styled(View)<{ position: string }>`
|
|
|
122
140
|
position: absolute;
|
|
123
141
|
width: 40px;
|
|
124
142
|
height: 40px;
|
|
125
|
-
${props => {
|
|
126
|
-
switch(props.position) {
|
|
143
|
+
${(props) => {
|
|
144
|
+
switch (props.position) {
|
|
127
145
|
case 'topLeft':
|
|
128
146
|
return 'top: 0; left: 0; border-top-width: 4px; border-left-width: 4px;';
|
|
129
147
|
case 'topRight':
|
|
@@ -184,36 +202,32 @@ const ScannedDataText = styled(Text)`
|
|
|
184
202
|
font-weight: 600;
|
|
185
203
|
`;
|
|
186
204
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
amount,
|
|
205
|
+
export function NQRSubScreen({
|
|
206
|
+
amount,
|
|
190
207
|
currency,
|
|
191
|
-
onClose,
|
|
192
|
-
onProcessTransaction,
|
|
193
|
-
onError
|
|
194
|
-
|
|
208
|
+
onClose,
|
|
209
|
+
onProcessTransaction,
|
|
210
|
+
onError,
|
|
211
|
+
}: Props) {
|
|
195
212
|
const [hasPermission, setHasPermission] = useState<boolean | null>(null);
|
|
196
213
|
const [scannedData, setScannedData] = useState<string | null>(null);
|
|
197
214
|
const [isScanning, setIsScanning] = useState(true);
|
|
198
215
|
const [torch, setTorch] = useState(false);
|
|
199
216
|
const [layoutReady, setLayoutReady] = useState(false);
|
|
200
|
-
|
|
201
217
|
|
|
202
218
|
const [isActive, setIsActive] = useState(false);
|
|
203
219
|
const isForeground = useIsForeground();
|
|
204
220
|
|
|
205
|
-
|
|
206
221
|
const lineAnim = React.useRef(new Animated.Value(0)).current;
|
|
207
222
|
const lineWidth = 2;
|
|
208
223
|
|
|
209
|
-
|
|
210
224
|
const device = useCameraDevice('back', {
|
|
211
225
|
physicalDevices: ['wide-angle-camera'],
|
|
212
226
|
});
|
|
213
227
|
|
|
214
228
|
useEffect(() => {
|
|
215
229
|
checkCameraPermission();
|
|
216
|
-
|
|
230
|
+
|
|
217
231
|
return () => {
|
|
218
232
|
setIsActive(false);
|
|
219
233
|
};
|
|
@@ -221,50 +235,65 @@ export function NQRSubScreen({
|
|
|
221
235
|
|
|
222
236
|
useEffect(() => {
|
|
223
237
|
// if (scanned) {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
238
|
+
Animated.loop(
|
|
239
|
+
Animated.sequence([
|
|
240
|
+
Animated.timing(lineAnim, {
|
|
241
|
+
toValue: qrSize - lineWidth, // Move to right edge
|
|
242
|
+
duration: 1500,
|
|
243
|
+
easing: Easing.inOut(Easing.linear),
|
|
244
|
+
useNativeDriver: true,
|
|
245
|
+
}),
|
|
246
|
+
Animated.timing(lineAnim, {
|
|
247
|
+
toValue: 0, // Move back to left
|
|
248
|
+
duration: 1500,
|
|
249
|
+
easing: Easing.inOut(Easing.linear),
|
|
250
|
+
useNativeDriver: true,
|
|
251
|
+
}),
|
|
252
|
+
])
|
|
253
|
+
).start();
|
|
240
254
|
// }
|
|
241
255
|
}, []);
|
|
242
256
|
|
|
243
257
|
useEffect(() => {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
258
|
+
if (hasPermission && device && isForeground) {
|
|
259
|
+
const timer = setTimeout(() => {
|
|
260
|
+
setIsActive(true);
|
|
261
|
+
}, 500);
|
|
248
262
|
|
|
249
|
-
|
|
250
|
-
|
|
263
|
+
return () => clearTimeout(timer);
|
|
264
|
+
}
|
|
251
265
|
|
|
252
|
-
|
|
253
|
-
}, [hasPermission, device, isForeground]);
|
|
266
|
+
return undefined;
|
|
267
|
+
}, [hasPermission, device, isForeground]);
|
|
254
268
|
|
|
255
269
|
const checkCameraPermission = async () => {
|
|
256
270
|
try {
|
|
257
271
|
const permission = await Camera.getCameraPermissionStatus();
|
|
258
272
|
console.log('Current permission status:', permission);
|
|
259
|
-
|
|
273
|
+
|
|
260
274
|
if (permission === 'granted') {
|
|
261
275
|
setHasPermission(true);
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (permission === 'not-determined') {
|
|
280
|
+
// Request must be awaited — iOS shows dialog here
|
|
281
|
+
const result = await Camera.requestCameraPermission();
|
|
282
|
+
console.log('Permission result:', result);
|
|
283
|
+
setHasPermission(result === 'granted');
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (permission === 'denied' || permission === 'restricted') {
|
|
267
288
|
setHasPermission(false);
|
|
289
|
+
Alert.alert(
|
|
290
|
+
'Camera Permission Required',
|
|
291
|
+
'Please enable camera access in your device settings to scan QR codes.',
|
|
292
|
+
[
|
|
293
|
+
{ text: 'Cancel', style: 'cancel' },
|
|
294
|
+
{ text: 'Open Settings', onPress: () => Linking.openSettings() },
|
|
295
|
+
]
|
|
296
|
+
);
|
|
268
297
|
}
|
|
269
298
|
} catch (error) {
|
|
270
299
|
console.error('Permission check error:', error);
|
|
@@ -276,14 +305,14 @@ export function NQRSubScreen({
|
|
|
276
305
|
try {
|
|
277
306
|
const permission = await Camera.requestCameraPermission();
|
|
278
307
|
console.log('Requested permission:', permission);
|
|
279
|
-
|
|
308
|
+
|
|
280
309
|
if (permission === 'denied') {
|
|
281
310
|
Alert.alert(
|
|
282
311
|
'Permission Required',
|
|
283
312
|
'Camera permission is required to scan QR codes. Please enable it in settings.',
|
|
284
313
|
[
|
|
285
314
|
{ text: 'Cancel', style: 'cancel' },
|
|
286
|
-
{ text: 'Open Settings', onPress: () => Linking.openSettings() }
|
|
315
|
+
{ text: 'Open Settings', onPress: () => Linking.openSettings() },
|
|
287
316
|
]
|
|
288
317
|
);
|
|
289
318
|
setHasPermission(false);
|
|
@@ -296,19 +325,19 @@ export function NQRSubScreen({
|
|
|
296
325
|
}
|
|
297
326
|
};
|
|
298
327
|
|
|
299
|
-
const handleQrData=(data: any)=>{
|
|
328
|
+
const handleQrData = (data: any) => {
|
|
300
329
|
console.log('QR Code Data:', data);
|
|
301
|
-
const payload={
|
|
330
|
+
const payload = {
|
|
302
331
|
accountNo: data?.accountNo,
|
|
303
332
|
bank: data?.bankName,
|
|
304
333
|
accountDetail: data?.accountName,
|
|
305
334
|
channel: 'qr',
|
|
306
335
|
amount: data?.amount,
|
|
307
|
-
remark: data?.description
|
|
308
|
-
}
|
|
336
|
+
remark: data?.description,
|
|
337
|
+
};
|
|
309
338
|
console.log('Qr details:', payload);
|
|
310
339
|
onProcessTransaction?.(payload as any);
|
|
311
|
-
}
|
|
340
|
+
};
|
|
312
341
|
|
|
313
342
|
const scanQrFromGallery = async () => {
|
|
314
343
|
try {
|
|
@@ -326,17 +355,16 @@ export function NQRSubScreen({
|
|
|
326
355
|
const barcodes: any = await QRKit.decodeQR(imageUri);
|
|
327
356
|
if (barcodes?.success) {
|
|
328
357
|
Vibration.vibrate(100);
|
|
329
|
-
|
|
358
|
+
|
|
330
359
|
await handleQrData(JSON.parse(barcodes?.data));
|
|
331
360
|
} else {
|
|
332
|
-
Alert.alert('Error:', barcodes?.message)
|
|
361
|
+
Alert.alert('Error:', barcodes?.message);
|
|
333
362
|
}
|
|
334
363
|
} catch (error) {
|
|
335
364
|
console.error('QR Scan Error:', error);
|
|
336
365
|
}
|
|
337
366
|
};
|
|
338
367
|
|
|
339
|
-
|
|
340
368
|
const codeScanner = useCodeScanner({
|
|
341
369
|
codeTypes: ['qr', 'ean-13'],
|
|
342
370
|
onCodeScanned: (codes: any) => {
|
|
@@ -344,7 +372,7 @@ export function NQRSubScreen({
|
|
|
344
372
|
const qrData: any = codes[0].value;
|
|
345
373
|
setScannedData(qrData);
|
|
346
374
|
setIsScanning(false);
|
|
347
|
-
|
|
375
|
+
|
|
348
376
|
// Vibrate on scan (optional)
|
|
349
377
|
Vibration.vibrate(100);
|
|
350
378
|
console.log('Scanned QR Code:', JSON.parse(qrData));
|
|
@@ -361,8 +389,15 @@ export function NQRSubScreen({
|
|
|
361
389
|
// }, []);
|
|
362
390
|
|
|
363
391
|
const renderCamera = () => {
|
|
364
|
-
console.log(
|
|
365
|
-
|
|
392
|
+
console.log(
|
|
393
|
+
'Render camera - hasPermission:',
|
|
394
|
+
hasPermission,
|
|
395
|
+
'device:',
|
|
396
|
+
!!device,
|
|
397
|
+
'isActive:',
|
|
398
|
+
isActive
|
|
399
|
+
);
|
|
400
|
+
|
|
366
401
|
if (hasPermission === null) {
|
|
367
402
|
return (
|
|
368
403
|
<CameraPlaceholder>
|
|
@@ -413,18 +448,19 @@ export function NQRSubScreen({
|
|
|
413
448
|
|
|
414
449
|
return (
|
|
415
450
|
<Container>
|
|
416
|
-
|
|
417
451
|
{/* Header */}
|
|
418
452
|
<Header>
|
|
419
453
|
<HeaderButton onPress={onClose}>
|
|
420
454
|
<Ionicons name="close" size={24} />
|
|
421
455
|
</HeaderButton>
|
|
422
|
-
|
|
456
|
+
|
|
423
457
|
<HeaderCenter>
|
|
424
|
-
<Text style={{ fontWeight: 'bold', fontSize: 16, color:'#FFF' }}>
|
|
458
|
+
<Text style={{ fontWeight: 'bold', fontSize: 16, color: '#FFF' }}>
|
|
459
|
+
QRIS
|
|
460
|
+
</Text>
|
|
425
461
|
<Text style={{ fontSize: 10, color: '#FFF' }}>QB Code Standar</Text>
|
|
426
462
|
</HeaderCenter>
|
|
427
|
-
|
|
463
|
+
|
|
428
464
|
<HeaderRight>
|
|
429
465
|
<HeaderButton onPress={scanQrFromGallery}>
|
|
430
466
|
<Ionicons name="image-outline" size={22} />
|
|
@@ -434,10 +470,10 @@ export function NQRSubScreen({
|
|
|
434
470
|
</HeaderButton>
|
|
435
471
|
</HeaderRight>
|
|
436
472
|
</Header>
|
|
437
|
-
|
|
473
|
+
|
|
438
474
|
<CameraContainer onLayout={() => setLayoutReady(true)}>
|
|
439
475
|
{renderCamera()}
|
|
440
|
-
|
|
476
|
+
|
|
441
477
|
{/* Scan Overlay*/}
|
|
442
478
|
{hasPermission && device && isActive && (
|
|
443
479
|
<ScanOverlay pointerEvents="none">
|
|
@@ -462,22 +498,19 @@ export function NQRSubScreen({
|
|
|
462
498
|
)}
|
|
463
499
|
|
|
464
500
|
{/* Scanned Data Display */}
|
|
465
|
-
{scannedData && (
|
|
501
|
+
{scannedData && (
|
|
466
502
|
<ScannedDataContainer>
|
|
467
503
|
<ScannedDataText>Scanned: {scannedData}</ScannedDataText>
|
|
468
504
|
</ScannedDataContainer>
|
|
469
|
-
)}
|
|
505
|
+
)}
|
|
470
506
|
</CameraContainer>
|
|
471
507
|
{/* <StatusBarBlurBackground /> */}
|
|
472
|
-
|
|
473
|
-
|
|
474
508
|
</Container>
|
|
475
509
|
);
|
|
476
510
|
}
|
|
477
511
|
|
|
478
512
|
const qrSize = width * 0.75;
|
|
479
513
|
const styles = StyleSheet.create({
|
|
480
|
-
|
|
481
514
|
scanningLine: {
|
|
482
515
|
height: qrSize,
|
|
483
516
|
width: 2,
|