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;