Skip to content

Commit be616da

Browse files
Merge upstream develop
2 parents 0e63e90 + 892c409 commit be616da

7 files changed

Lines changed: 78 additions & 175 deletions

File tree

apps/polycentric/app.config.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,6 @@ export default ({ config }: ConfigContext): ExpoConfig => ({
6565
],
6666
'expo-font',
6767
'expo-web-browser',
68-
[
69-
'react-native-vision-camera',
70-
{
71-
cameraPermissionText: '$(PRODUCT_NAME) needs access to your Camera.',
72-
enableLocation: false,
73-
},
74-
],
7568
[
7669
'expo-dev-client',
7770
{

apps/polycentric/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,14 @@
6767
"react-native": "0.83.9",
6868
"react-native-draggable-flatlist": "^4.0.3",
6969
"react-native-gesture-handler": "~2.30.1",
70+
"react-native-nitro-image": "^0.15.1",
71+
"react-native-nitro-modules": "^0.35.9",
7072
"react-native-qrcode-svg": "^6.3.21",
7173
"react-native-reanimated": "~4.2.3",
7274
"react-native-safe-area-context": "5.8.0",
7375
"react-native-screens": "~4.23.0",
7476
"react-native-toast-message": "^2.3.3",
75-
"react-native-vision-camera": "^4.7.3",
77+
"react-native-vision-camera": "^5.0.0",
7678
"react-native-web": "~0.21.2",
7779
"react-native-webview": "13.16.1",
7880
"react-native-worklets": "0.7.2",
Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,18 @@
1-
import { useState, useEffect } from 'react';
2-
import { Camera } from 'react-native-vision-camera';
1+
import { useCameraPermission as useVisionCameraPermission } from 'react-native-vision-camera';
32

43
export interface UseCameraPermissionReturn {
54
hasPermission: boolean | null;
6-
isLoading: boolean;
75
requestPermission: () => Promise<boolean>;
8-
checkPermission: () => void;
6+
canRequestPermission: boolean;
97
}
108

119
export function useCameraPermission(): UseCameraPermissionReturn {
12-
const [hasPermission, setHasPermission] = useState<boolean | null>(null);
13-
const [isLoading, setIsLoading] = useState(true);
14-
15-
const checkPermission = () => {
16-
try {
17-
const status = Camera.getCameraPermissionStatus();
18-
setHasPermission(status === 'granted');
19-
} catch (error) {
20-
console.error('Error checking camera permission:', error);
21-
setHasPermission(false);
22-
} finally {
23-
setIsLoading(false);
24-
}
25-
};
26-
27-
const requestPermission = async (): Promise<boolean> => {
28-
try {
29-
const status = await Camera.requestCameraPermission();
30-
const granted = status === 'granted';
31-
setHasPermission(granted);
32-
return granted;
33-
} catch (error) {
34-
console.error('Error requesting camera permission:', error);
35-
setHasPermission(false);
36-
return false;
37-
}
38-
};
39-
40-
useEffect(() => {
41-
checkPermission();
42-
}, []);
10+
const { hasPermission, requestPermission, canRequestPermission } =
11+
useVisionCameraPermission();
4312

4413
return {
4514
hasPermission,
46-
isLoading,
4715
requestPermission,
48-
checkPermission,
16+
canRequestPermission,
4917
};
5018
}

apps/polycentric/src/common/lib/camera/useQRScanner.tsx

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { useState, useCallback } from 'react';
2-
import { useCameraDevice, useCodeScanner } from 'react-native-vision-camera';
2+
import {
3+
isScannedCode,
4+
useCameraDevice,
5+
useObjectOutput,
6+
} from 'react-native-vision-camera';
7+
import type { ScannedObject } from 'react-native-vision-camera';
38
import { useCameraPermission } from './useCameraPermission';
49

510
export type QRScanResult =
@@ -15,20 +20,19 @@ export interface UseQRScannerOptions {
1520
export interface UseQRScannerReturn {
1621
device: ReturnType<typeof useCameraDevice>;
1722
hasPermission: boolean | null;
18-
isLoading: boolean;
1923
requestPermission: () => Promise<boolean>;
2024
isActive: boolean;
2125
setIsActive: (active: boolean) => void;
2226
scannedData: QRScanResult | null;
23-
codeScanner: ReturnType<typeof useCodeScanner>;
27+
objectOutput: ReturnType<typeof useObjectOutput>;
2428
}
2529

2630
export function useQRScanner(
2731
options: UseQRScannerOptions = {},
2832
): UseQRScannerReturn {
2933
const { parseJSON = false, onScan, onError } = options;
3034

31-
const { hasPermission, isLoading, requestPermission } = useCameraPermission();
35+
const { hasPermission, requestPermission } = useCameraPermission();
3236
const device = useCameraDevice('back');
3337
const [isActive, setIsActive] = useState(false);
3438
const [scannedData, setScannedData] = useState<QRScanResult | null>(null);
@@ -49,12 +53,10 @@ export function useQRScanner(
4953
[parseJSON],
5054
);
5155

52-
const handleCodeScanned = useCallback(
53-
(codes: any[]) => {
54-
if (codes.length === 0) return;
55-
56-
const code = codes[0];
57-
const rawValue = code.value;
56+
const handleObjectsScanned = useCallback(
57+
(objects: ScannedObject[]) => {
58+
const code = objects.find(isScannedCode);
59+
const rawValue = code?.value;
5860

5961
if (!rawValue) return;
6062

@@ -80,19 +82,18 @@ export function useQRScanner(
8082
[parseQRData, onScan, onError],
8183
);
8284

83-
const codeScanner = useCodeScanner({
84-
codeTypes: ['qr'],
85-
onCodeScanned: handleCodeScanned,
85+
const objectOutput = useObjectOutput({
86+
types: ['qr'],
87+
onObjectsScanned: handleObjectsScanned,
8688
});
8789

8890
return {
8991
device,
9092
hasPermission,
91-
isLoading,
9293
requestPermission,
9394
isActive,
9495
setIsActive,
9596
scannedData,
96-
codeScanner,
97+
objectOutput,
9798
};
9899
}

apps/polycentric/src/features/identity-pairing/components/PairIdentityCamera.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { useEffect, useRef, useState } from 'react';
44
import { View } from 'react-native';
55
import {
66
Camera,
7+
isScannedCode,
78
useCameraDevice,
89
useCameraPermission,
9-
useCodeScanner,
10+
useObjectOutput,
1011
} from 'react-native-vision-camera';
1112
import { PairIdentityManualEntry } from './PairIdentityManualEntry';
1213

@@ -26,11 +27,11 @@ export function PairIdentityCamera({
2627
const { theme } = useTheme();
2728
const scannedRef = useRef(false);
2829

29-
const codeScanner = useCodeScanner({
30-
codeTypes: ['qr'],
31-
onCodeScanned: (codes) => {
30+
const objectOutput = useObjectOutput({
31+
types: ['qr'],
32+
onObjectsScanned: (objects) => {
3233
if (scannedRef.current) return;
33-
const qrCode = codes[0];
34+
const qrCode = objects.find(isScannedCode);
3435
if (qrCode?.value) {
3536
scannedRef.current = true;
3637
const { code, server } = parseInput(qrCode.value);
@@ -73,7 +74,7 @@ export function PairIdentityCamera({
7374
<Camera
7475
device={device}
7576
isActive={true}
76-
codeScanner={codeScanner}
77+
outputs={[objectOutput]}
7778
style={{ flex: 1 }}
7879
/>
7980
</View>

0 commit comments

Comments
 (0)