/** * 扫描二维码 * @邠心vbe on 2021/03/24 */ import React, { Component } from 'react' import { Pressable, StyleSheet, View } from 'react-native' import QRCodeScanner from 'react-native-qrcode-scanner'; import { RNCamera } from 'react-native-camera'; import apiCharge from '../../api/apiCharge'; import { PageList } from '../Router'; import Dialog from '../../components/Dialog'; import app from '../../../app.json'; import Button from '../../components/Button'; import TextView from '../../components/TextView'; import { EnterStationDialog } from '../chargeV2/Charging'; import QRResult from './QRResult'; // 函数组件:QR码扫描器 const QRScanner = ({ onCodeScanned, isActive }) => { const [flashOn, switchFlash] = useState(false); const [hasPermission, setHasPermission] = useState(false); const device = useCameraDevice('back'); useEffect(() => { (async () => { const status = await Camera.requestCameraPermission(); setHasPermission(status == 'granted'); })(); }, []); const codeScanner = useCodeScanner({ codeTypes: ['qr'], onCodeScanned: (codes) => { if (codes?.length > 0 && isActive) { const code = codes[0]; onCodeScanned(code.value || ""); } }, }); return ( (device && hasPermission) ? <> { isActive && switchFlash(!flashOn)}> } : Camera access has been denied. Please enable it in your device settings. ); }; export default class QRScan extends Component { constructor(props) { super(props); this.state={ isResult: true, stationId: "", params: this.props.route.params, showInputStation: false } } componentDidMount() { this.props.navigation.addListener('focus', () => { setTimeout(() => { this.setState({ isResult: false }); }, 200); }); this.props.navigation.addListener('beforeRemove', (e) => { if (!this.state.isResult) { e.preventDefault(); this.setState({ isResult: true }, () => { setTimeout(() => { goBack(); }, 300); }); } }); } scanResult = (msg) => { this.setState({ isResult: true }); console.log("result2", msg); if (msg.data.indexOf('::') > 0) { const arr = msg.data.split('::'); if (arr.length == 2) { const qr = { chargeBoxId: arr[0], connectorId: arr[1] } if (this.state.params.id) { qr.sitePk = this.state.params.id } this.getChargeDetail(qr); return; } } else { const qr = { qrContent: msg.data } if (this.state.params.id) { qr.sitePk = this.state.params.id } this.getChargeDetail(qr); return; } Dialog.showDialog({ title: 'Error', message: 'It\'s not a legal QR code', showCancel: false, callback: (e) => { this.setState({ isResult: false }); }}); } getChargeDetail(qr) { console.log('===============SCAN QR==============='); console.log(qr); console.log('===============SCAN QR==============='); apiCharge.checkQRStatus(qr).then(res => { if (res.data && res.data.chargeBoxId) { QRResult.setResult(res.data); if (res.data.sitePk) { if (this.state.params.actionDetail) { startPage(PageList.chargeDetailPage, {stationInfo: {id: res.data.sitePk}, action: 'qr', from: PageList.home}); } else { goBack(); } //startPage(PageList.chargeDetail, {stationInfo: {id: res.data.sitePk}, action: 'qr'}); } } }).catch(({err, code}) => { Dialog.showDialog({ title: 'Error', message: err, showCancel: false, callback: (btn) => { this.setState({ isResult: false }); if (code == 5194 && btn == Dialog.BUTTON_OK && app.vehicle.enable) { startPage(app.vehicle.newVersionPage ? PageList.vehiclesListV2 : PageList.myVehicles) } } }); }) } switchFlash() { this.setState({ flashLight: !this.state.flashLight }) } onEnterStation(visible) { this.setState({ stationId: "", isResult: visible, showInputStation: visible }) } enterStatioinId() { if (QRResult.haveResult()) { const result = QRResult.getResult() if (result.sitePk) { if (this.state.params.actionDetail) { startPage(PageList.chargeDetailPage, {stationInfo: {id: result.sitePk}, action: 'qr', from: PageList.home}); } else { goBack(); } //startPage(PageList.chargeDetail, {stationInfo: {id: res.data.sitePk}, action: 'qr'}); } } } render() { return (