import React, { Component } from "react"; import styled from "styled-components"; import { Button, Dropdown, Form, Icon, Image, Input, Modal, } from "semantic-ui-react"; import { RemoteService } from "../../../remote"; import { connect } from "react-redux"; const StyledDiv = styled.div` background-color: #505bda; padding: 3rem; width: 10rem; height: 10rem; border-radius: 100%; border: none; position: relative; box-shadow: 3px 2px 10px 5px #ccc; transition: all 0.3s ease-out; :hover { background-color: #4345d9; } :active { transform: translate(0.3px, 0.8px); box-shadow: 0.5px 0.5px 7px 3.5px #ccc; } `; class NewDevice extends Component { constructor(props) { super(props); this.state = { step: 1, openModal: false, motion: false, deviceName: "", }; this.baseState = this.state; this.createDevice = this.createDevice.bind(this); } handleOpen = () => { this.setState({ openModal: true }); }; handleClose = () => { this.setState({ openModal: false }); }; resetState = () => { this.setState(this.baseState); this.handleClose(); }; nextStep = () => { this.setState((prevState) => ({ step: prevState.step + 1 })); }; previousStep = () => { this.setState((prevState) => ({ step: prevState.step - 1 })); }; setTypeOfDevice = (e, d) => { if (d.value === "dimmableLight") { this.setState({ typeOfDevice: d.value, intensity: 0 }); } else { this.setState({ typeOfDevice: d.value }); } }; setDeviceName = (e, d) => { this.setState({ deviceName: d.value }); }; setTypeOfSensor = (e, d) => { console.log(d.value); if (d.value === "motionSensor") { this.setState({ typeOfSensor: d.value, motion: true }); } else { this.setState({ typeOfSensor: d.value }); } }; setLightsDimmerSwitch = (e, d) => { this.setState({ lightsAttached: d.value }); }; async createDevice() { // Connect to the backend and create device here. const data = { id: null, roomId: this.props.activeRoom, name: this.state.deviceName, kind: this.state.motion ? "motionSensor" : this.state.typeOfDevice, }; let outputs = null; const defaultNames = { regularLight: "New regular light", dimmableLight: "New intensity light", smartPlug: "New smart Plug", sensor: "New sensor", switch: "New switch", buttonDimmer: "New button dimmer", knobDimmer: "New knob dimmer", securityCamera: "New security camera", }; if (this.state.deviceName === "") { data.name = defaultNames[this.state.typeOfDevice]; } console.log("-------------------------"); console.log(this.state.typeOfDevice); switch (this.state.typeOfDevice) { //trying to make securityCamera work //case "securityCamera": // data.path="/security_camera_videos/security_camera_1.mp4"; // data.on=false; //break; //trying to make thermostat work case "thermostat": data.targetTemperature = 0; data.measuredTemperature = 0; break; case "dimmableLight": data.intensity = 0; break; case "sensor": if (!this.state.motion) { data.sensor = this.state.typeOfSensor; data.value = 0; } break; case "switch": case "buttonDimmer": case "knobDimmer": outputs = this.state.lightsAttached; break; default: break; } try { let newDevice = await this.props.saveDevice(data); if (outputs) { await this.props.connectOutputs(newDevice, outputs); } this.resetState(); } catch (e) { console.error("device creation error: ", e); } } render() { const deviceOptions = [ //stuff { key: "thermostat", text: "Thermostat", value: "thermostat", image: {} }, { key: "curtains", text: "Curtain", value: "curtains", image: {} }, //stuff ends { key: "light", text: "Normal Light", value: "regularLight", image: { avatar: true, src: "/img/lightOn.svg" }, }, { key: "intensity-light", text: "Intensity Light", value: "dimmableLight", image: { avatar: true, src: "/img/intensity-light.svg" }, }, { key: "smart-plug", text: "Smart Plug", value: "smartPlug", image: { avatar: true, src: "/img/smart-plug.svg" }, }, { key: "sensor", text: "Sensor", value: "sensor", image: { avatar: true, src: "/img/sensorOn.svg" }, }, { key: "switch", text: "Switch", value: "switch", image: { avatar: true, src: "/img/switchOn.svg" }, }, { key: "knobDimmer", text: "Knob Dimmer", value: "knobDimmer", image: { avatar: true, src: "/img/knob.svg" }, }, { key: "buttonDimmer", text: "Button Dimmer", value: "buttonDimmer", image: { avatar: true, src: "/img/plusMinus.svg" }, }, { key: "securityCamera", text: "Security Camera", value: "securityCamera", image: { avatar: true, src: "/img/security-icon.png" }, }, ]; const sensorOptions = [ { key: "temperature", text: "Temperature Sensor", value: "TEMPERATURE", image: { avatar: true, src: "/img/temperature-sensor.svg" }, }, { key: "humidity", text: "Humidity Sensor", value: "HUMIDITY", image: { avatar: true, src: "/img/humidity-sensor.svg" }, }, { key: "light", text: "Light Sensor", value: "LIGHT", image: { avatar: true, src: "/img/light-sensor.svg" }, }, { key: "motion", text: "Motion Sensor", value: "motionSensor", image: { avatar: true, src: "/img/sensorOn.svg" }, }, ]; const availableSwitchDevices = []; const availableDimmerDevices = []; this.props.devices.forEach((d) => { if ( d.kind === "regularLight" || d.kind === "dimmableLight" || d.kind === "smartPlug" ) { availableSwitchDevices.push({ key: d.id, text: d.name, value: d.id, }); } if (d.kind === "dimmableLight") { availableDimmerDevices.push({ key: d.id, text: d.name, value: d.id, }); } }); const step1 = ( <Dropdown name="typeOfDevice" placeholder="Select a Type of Device" fluid selection onChange={this.setTypeOfDevice} options={deviceOptions} /> ); const step2 = (typeOfDevice) => { const deviceName = ( <div> <Form.Field> <label>Device Name: </label> <Input fluid size={"large"} onChange={this.setDeviceName} focus placeholder="Device Name" /> </Form.Field> </div> ); const sensorForm = ( <Form.Field style={{ marginTop: "1rem" }}> <label>Type of Sensor: </label> <Dropdown name="typeOfDevice" placeholder="Select a Type of Sensor" fluid selection onChange={this.setTypeOfSensor} options={sensorOptions} /> </Form.Field> ); const switchOptions = ( <Form.Field style={{ marginTop: "1rem" }}> <label>Select the lights or smart plugs You Want to Attach: </label> <Dropdown name="typeOfDevice" placeholder="Select Lights" fluid multiple onChange={this.setLightsDimmerSwitch} options={availableSwitchDevices} /> </Form.Field> ); const dimmerOptions = ( <Form.Field style={{ marginTop: "1rem" }}> <label>Select the dimmable lights You Want to Attach: </label> <Dropdown name="typeOfDevice" placeholder="Select Lights" fluid multiple onChange={this.setLightsDimmerSwitch} options={availableDimmerDevices} /> </Form.Field> ); return ( <Form> {deviceName} {this.state.typeOfDevice === "sensor" ? sensorForm : ""} {this.state.typeOfDevice === "switch" ? switchOptions : ""} {this.state.typeOfDevice === "buttonDimmer" || this.state.typeOfDevice === "knobDimmer" ? dimmerOptions : ""} </Form> ); }; const steps = [step1, step2()]; return ( <Modal closeIcon open={this.state.openModal} onClose={this.resetState} trigger={ <StyledDiv onClick={this.handleOpen} style={{ position: "relative", top: "calc(50% - 5rem)", left: "calc(50% - 5rem)", }} > <Image src="/img/add.svg" style={{ filter: "invert()" }} /> </StyledDiv> } centered={true} > <Modal.Header>Add a New Device</Modal.Header> <Modal.Content>{steps[this.state.step - 1]}</Modal.Content> <Modal.Actions> {this.state.step > 1 ? ( <Button onClick={this.previousStep} color="blue" icon labelPosition="left" > <Icon name="left arrow" /> Back </Button> ) : ( "" )} {this.state.step < steps.length ? ( <Button color="blue" onClick={this.nextStep} icon labelPosition="right" > Next <Icon name="right arrow" /> </Button> ) : ( "" )} {this.state.step === steps.length ? ( <Button onClick={this.createDevice} color="blue" icon labelPosition="right" > <Icon name="up arrow" /> Finish </Button> ) : ( "" )} </Modal.Actions> </Modal> ); } } const mapStateToProps = (state, _) => ({ devices: Object.values(state.devices), activeRoom: state.active.activeRoom, }); const NewDeviceContainer = connect(mapStateToProps, RemoteService)(NewDevice); export default NewDeviceContainer;