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:
Tran Anh Tuan
2025-11-10 16:12:52 +07:00
parent c26de5aefc
commit 1a534eccb0
10 changed files with 224 additions and 218 deletions

View File

@@ -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"],
}}