import React, { Component } from "react"; import { API } from "aws-amplify"; import { Grid, Row, Col, Button, ProgressBar, Alert, FormGroup, ControlLabel, FormControl, HelpBlock, Well } from "react-bootstrap"; import { Card } from "components/Card/Card.jsx"; class DeviceRegistration extends Component { constructor(props) { super(props); this.goBack = this.goBack.bind(this); this.register = this.register.bind(this); this.finish = this.finish.bind(this); this.handleSerialNumberChange = this.handleSerialNumberChange.bind(this); this.handleDeviceNameChange = this.handleDeviceNameChange.bind(this); this.handleModelNumberChange = this.handleModelNumberChange.bind(this); this.state = { step: 0, serialNumber: '', deviceName: '', modelNumber: '', isLoading: false, error: false, serialNumberValidateState: null, showSerialNumberHelpBlock: false, deviceNameValidateState: null, showDeviceNameHelpBlock: false, modelNumberValidateState: null, showModelNumberHelpBlock: false, isRegistering: false, }; }; componentDidMount() { // Checks if the previous page sends a state. // It would only happens when the device is pending to be registered, and a user wants to see the registration instruction again. const state = this.props.location.state; if (state) { let deviceId = state.deviceId; this.setState({ step: 1, serialNumber: deviceId }); } } goBack() { this.props.history.push('/devices'); } // Handles input changes handleSerialNumberChange = (event) => { this.setState({ serialNumber: event.target.value }, () => { this.serialNumberValidate(); }); } handleDeviceNameChange = (event) => { this.setState({ deviceName: event.target.value }, () => { this.validateInput('deviceName'); }); } handleModelNumberChange = (event) => { this.setState({ modelNumber: event.target.value }, () => { this.validateInput('modelNumber'); }); } // Validates serial number serialNumberValidate = () => { let serialNumber = this.state.serialNumber; let regexp = /^[a-zA-Z0-9-_:]+$/; let pass = regexp.test(serialNumber); if (pass) { this.setState({ showSerialNumberHelpBlock: false, serialNumberValidateState: null, }); } else { this.setState({ showSerialNumberHelpBlock: true, serialNumberValidateState: 'error', }); } return pass; } // Validates inputs validateInput = (type) => { let regexp = /^[a-zA-Z0-9-_.,:/@#]+$/; let pass = false; let input = ''; switch (type) { case 'deviceName': { input = this.state.deviceName; pass = regexp.test(input); if (pass) { this.setState({ showDeviceNameHelpBlock: false, deviceNameValidateState: null, }); } else { this.setState({ showDeviceNameHelpBlock: true, deviceNameValidateState: 'error', }); } break; } case 'modelNumber': { input = this.state.modelNumber; pass = regexp.test(input); if (pass) { this.setState({ showModelNumberHelpBlock: false, modelNumberValidateState: null, }); } else { this.setState({ showModelNumberHelpBlock: true, modelNumberValidateState: 'error', }); } break; } default : { // do nothing break; } } return pass; } // Registers device register = async () => { this.setState({ error: false, }); if (!this.state.isRegistering) { this.setState({ isRegistering: true }); let isSerialNumberValidated = this.serialNumberValidate(); let isDeviceNameValidated = this.validateInput('deviceName'); let isModelNumberValidated = this.validateInput('modelNumber'); if (!isSerialNumberValidated || !isDeviceNameValidated || !isModelNumberValidated) { this.props.handleNotification('Check input variables', 'error', 'pe-7s-check', 5); this.setState({ isRegistering: false }); } else { this.setState({ isLoading: true }); let token = await this.props.getToken(); let apiName = 'smart-product-api'; let path = 'registration'; let params = { body: { modelNumber: this.state.modelNumber, deviceId: this.state.serialNumber, deviceName: this.state.deviceName, }, headers: { 'Authorization': token } }; API.post(apiName, path, params) .then(response => { this.setState({ step: 1 }); }) .catch(error => { let message = error.response; if (message === undefined) { message = error.message; } else { message = error.response.data.message; } this.setState({ error: message, }); }) .finally(() => { this.setState({ isLoading: false, isRegistering: false, }); }); } } else { this.props.handleNotification('Device is still registering', 'warning', 'pe-7s-close-circle', 5); } } finish = () => { let deviceId = this.state.serialNumber; this.props.history.push(`/devices/${deviceId}`); } render() { const { isLoading, error, serialNumberValidateState, showSerialNumberHelpBlock, deviceNameValidateState, showDeviceNameHelpBlock, modelNumberValidateState, showModelNumberHelpBlock, } = this.state; if (this.state.step === 1) { return (