import { CameraView, useCameraPermissions } from 'expo-camera'; import { useEffect, useRef, useState } from 'react'; import { ActivityIndicator, Dimensions, Pressable, ScrollView, StyleSheet, Text, Vibration, View } from 'react-native'; import ChooseCarForChargingRow from '../../../../component/global/chooseCarForChargingRow'; import { CrossLogoWhiteSvg, QuestionSvg } from '../../../../component/global/SVG'; import { router } from 'expo-router'; import { chargeStationService } from '../../../../service/chargeStationService'; const ScanQrPage = () => { const [permission, requestPermission] = useCameraPermissions(); const [scanned, setScanned] = useState(false); const viewRef = useRef(null); const [scannedResult, setScannedResult] = useState(''); useEffect(() => { (async () => { const { status } = await requestPermission(); if (status !== 'granted') { alert('需要相機權限以掃描QR碼'); } })(); }, []); if (!permission) { return ; } if (!permission.granted) { return ( 需要相機權限以掃描QR碼,請在設定中開啟相機權限 ); } const { width: screenWidth, height: screenHeight } = Dimensions.get('window'); const handleBarCodeScanned = ({ bounds, data, type }: { bounds: any; data: any; type: any }) => { const { origin, size } = bounds; // Calculate the size of the square transparent area const transparentAreaSize = Math.min(screenWidth * 0.6, screenHeight * 0.3); const transparentAreaX = (screenWidth - transparentAreaSize) / 2; const transparentAreaY = (screenHeight - transparentAreaSize) / 2; // Check if the barcode is within the transparent area if ( origin.x >= transparentAreaX && origin.y >= transparentAreaY && origin.x + size.width <= transparentAreaX + transparentAreaSize && origin.y + size.height <= transparentAreaY + transparentAreaSize ) { setScanned(true); setScannedResult(data); Vibration.vibrate(100); console.log(` type: ${type} data: ${data} `); startCharging(data); setTimeout(() => { setScanned(false); }, 5000); } }; // const dummyDataChooseCarForCharging = [ // { // imageUrl: require('../../../../assets/car1.png'), // VehicleName: 'TESLA - Model 3', // isDefault: true // }, // { VehicleName: 'TESLA - Model Y', isDefault: false }, // { // imageUrl: require('../../../../assets/car1.png'), // VehicleName: 'TESLA - Model X', // isDefault: false // }, // { VehicleName: 'TESLA - Model 3', isDefault: false } // ]; const ChooseCar = () => { const [loading, setLoading] = useState(false); const isLargeScreen = screenHeight >= 800; const [carData, setCarData] = useState([]); const defaultImageUrl = require('../../../../assets/car1.png'); const [selectedCar, setSelectedCar] = useState(''); useEffect(() => { const fetchAllCars = async () => { setLoading(true); try { const response = await chargeStationService.getUserCars(); if (response) { // console.log(response.data); const carTypes = response.data.map((item: any) => ({ id: item.id, name: item.car_type.name, image: item.car_type.type_image_url })); // console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', carTypes); let updatedCarTypes = [...carTypes]; for (let i = 0; i < carTypes.length; i++) { const car = updatedCarTypes[i]; const imageUrl = await chargeStationService.getProcessedImageUrl(car.image); updatedCarTypes[i] = { ...car, image: imageUrl }; } setCarData(updatedCarTypes); return true; } } catch (error) { console.log(error); } finally { setLoading(false); } }; fetchAllCars(); }, []); useEffect(() => { console.log('Current carData:', carData); }, [carData]); // useEffect(() => { // console.log('Current selectedCar:', selectedCar); // }, [selectedCar]); return ( {loading ? ( ) : ( { if (router.canGoBack()) { router.back(); } else { router.replace('mainPage'); } }} > 選擇充電車輛 {carData.map((car, index) => ( setSelectedCar(car.id)} isSelected={selectedCar === car.id} // imageUrl={image} VehicleName={car.name} isDefault={car.isDefault} /> ))} )} ); }; //scan==> retrieve string ==> PUT charge/start requrest ==> const startCharging = async (scannedResult: string) => { try { const requestToBeSent = { StartChargeSeq: 'what is this', ConnectorID: scannedResult, StopBy: 'what is this', StopValue: 'what is this', StartBalance: 'what is this' }; const response = await chargeStationService.startCharging(requestToBeSent); console.log('Charging started', response); // ADD NAVIGATE TO NEW PAGE HERE } catch (error) { console.log('Failed to start charging:', error); } }; return ( 請掃瞄充電座上的二維碼 router.push('assistancePage')}> 需要協助? ); }; const styles = StyleSheet.create({ container: { flex: 1 }, camera: { flex: 1 }, overlay: { flex: 1 }, topOverlay: { flex: 35, alignItems: 'center', backgroundColor: 'rgba(0,0,0,0.5)' }, centerRow: { flex: 30, flexDirection: 'row' }, leftOverlay: { flex: 20, backgroundColor: 'rgba(0,0,0,0.5)' }, transparentArea: { flex: 60, aspectRatio: 1, position: 'relative' }, rightOverlay: { flex: 20, backgroundColor: 'rgba(0,0,0,0.5)' }, bottomOverlay: { flex: 35, backgroundColor: 'rgba(0,0,0,0.5)' } }); export default ScanQrPage;