import { useStartTestMutation } from "@/api/userTests"; import { Button, ButtonText } from "@/components/ui/button"; import { ThemedText } from "@/components/ui/themed-text"; import getErrorAxiosMessage from "@/utils/get-error-axios-message"; import { router, Stack, useFocusEffect } from "expo-router"; import { useCallback, useState } from "react"; import { StyleSheet, Text, View } from "react-native"; import { useToast } from "react-native-toast-notifications"; import { Camera, useCameraDevice, useCameraPermission, useCodeScanner, } from "react-native-vision-camera"; const QrScreen = () => { const device = useCameraDevice("back"); const { hasPermission, requestPermission } = useCameraPermission(); const toast = useToast(); const [scanned, setScanned] = useState(false); const { mutate, isPending } = useStartTestMutation(); useFocusEffect( useCallback(() => { setScanned(false); }, []) ); const handleStartTest = (id: number) => { mutate( { test_id: id, }, { onSuccess: (data) => { router.push(`/user-tests/doing/${data.id}`); }, onError: (error) => { toast.show(getErrorAxiosMessage(error), { type: "danger" }); }, } ); }; const codeScanner = useCodeScanner({ codeTypes: ["qr", "ean-13"], onCodeScanned: (codes) => { if (scanned) return; if (!codes || codes.length === 0) return; const scannedValue = codes[0].value; if (scannedValue) { const id = parseInt(scannedValue, 10); setScanned(true); toast.show("Going to test", { type: "normal" }); router.push(`/tests/${id}`); // handleStartTest(id); } else { toast.show("Invalid QR code", { type: "warning" }); } }, }); if (!hasPermission) { return ( No camera permission ); } if (!device) { return ( No camera device found ); } return ( <> ); }; const styles = StyleSheet.create({ center: { flex: 1, alignItems: "center", justifyContent: "center", }, }); export default QrScreen;