import React, { Component } from 'react' import PropTypes from 'prop-types' import {connect} from 'react-redux' import { hideQrScanner, qrCodeDetected} from '../../actions' import Instascan from 'instascan' import Spinner from '../spinner' class QrScanner extends Component { static propTypes = { visible: PropTypes.bool, hideQrScanner: PropTypes.func, qrCodeDetected: PropTypes.func, } constructor (props) { super(props) this.state = { ready: false, msg: 'Accesing your camera...', } this.scanning = false } componentDidUpdate () { if (this.props.visible && this.camera && !this.scanning) { this.scanner = new Instascan.Scanner({ video: this.camera, backgroundScan: false, continuous: true, }) this.scanner.addListener('scan', (content) => { this.scanner.stop().then(_ => { const result = this.parseContent(content) if (result.type !== 'unknown') { console.log('QR-SCANNER: CODE DETECTED', result) this.props.qrCodeDetected(result) this.props.hideQrScanner() this.setState({ ready: false }) } else { this.setState({msg: 'Error: We couldn\'t identify that QR code'}) } this.scanning = false }) }) Instascan.Camera.getCameras().then((cameras) => { if (cameras.length > 0) { this.scanner.start(cameras[0]) this.setState({ ready: true }) this.setState({ msg: 'Place the QR code in front of your camera so we can read it...'}) console.log('QR-SCANNER: started scanning with camera', cameras[0]) } else { this.setState({ msg: 'No camera found :('}) } }).catch(function (e) { console.error(e) }) this.scanning = true } } parseContent (content) { let type = 'unknown' let values = {} // Here we could add more cases // To parse other codes (transactions for ex.) if (content.split('ethereum:').length > 1) { type = 'address' values = {'address': content.split('ethereum:')[1] } } return {type, values} } stopAndClose = () => { this.scanner.stop().then(_ => { this.scanning = false this.props.hideQrScanner() this.setState({ ready: false }) }) } render () { const { visible } = this.props if (!visible) { return null } return (

Scan QR code

{this.state.msg}
) } } function mapDispatchToProps (dispatch) { return { hideQrScanner: () => dispatch(hideQrScanner()), qrCodeDetected: (data) => dispatch(qrCodeDetected(data)), } } function mapStateToProps (state) { return {} } export default connect(mapStateToProps, mapDispatchToProps)(QrScanner)