thêm quét QR đăng nhập, sửa lại logic để gọi api bằng ip thiết bị
This commit is contained in:
@@ -23,6 +23,8 @@ export default function ScanQRCode({
|
||||
const [permission, requestPermission] = useCameraPermissions();
|
||||
const [scanned, setScanned] = useState(false);
|
||||
const cameraRef = useRef(null);
|
||||
// Dùng ref để chặn quét nhiều lần trong cùng một frame/event loop
|
||||
const hasScannedRef = useRef(false);
|
||||
|
||||
// Request camera permission when component mounts or when visible changes to true
|
||||
useEffect(() => {
|
||||
@@ -38,6 +40,13 @@ export default function ScanQRCode({
|
||||
}
|
||||
}, [visible]);
|
||||
|
||||
// Mỗi khi reset scanned state thì reset luôn ref guard
|
||||
useEffect(() => {
|
||||
if (!scanned) {
|
||||
hasScannedRef.current = false;
|
||||
}
|
||||
}, [scanned]);
|
||||
|
||||
const handleBarCodeScanned = ({
|
||||
type,
|
||||
data,
|
||||
@@ -45,11 +54,12 @@ export default function ScanQRCode({
|
||||
type: string;
|
||||
data: string;
|
||||
}) => {
|
||||
if (!scanned) {
|
||||
setScanned(true);
|
||||
onScanned(data);
|
||||
onClose();
|
||||
}
|
||||
// Nếu đã scan rồi, bỏ qua
|
||||
if (hasScannedRef.current || scanned) return;
|
||||
hasScannedRef.current = true;
|
||||
setScanned(true);
|
||||
onScanned(data);
|
||||
onClose();
|
||||
};
|
||||
|
||||
if (!permission) {
|
||||
@@ -102,7 +112,8 @@ export default function ScanQRCode({
|
||||
<CameraView
|
||||
ref={cameraRef}
|
||||
style={styles.camera}
|
||||
onBarcodeScanned={handleBarCodeScanned}
|
||||
// Chỉ gắn handler khi chưa scan để ngắt lắng nghe ngay lập tức sau khi quét thành công
|
||||
onBarcodeScanned={scanned ? undefined : handleBarCodeScanned}
|
||||
barcodeScannerSettings={{
|
||||
barcodeTypes: ["qr"],
|
||||
}}
|
||||
|
||||
Reference in New Issue
Block a user