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", }; if (this.state.deviceName === "") { data.name = defaultNames[this.state.typeOfDevice]; } switch (this.state.typeOfDevice) { 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 = [ { 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" }, }, ]; 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 = ( ); const step2 = (typeOfDevice) => { const deviceName = (
); const sensorForm = ( ); const switchOptions = ( ); const dimmerOptions = ( ); return (
{deviceName} {this.state.typeOfDevice === "sensor" ? sensorForm : ""} {this.state.typeOfDevice === "switch" ? switchOptions : ""} {this.state.typeOfDevice === "buttonDimmer" || this.state.typeOfDevice === "knobDimmer" ? dimmerOptions : ""}
); }; const steps = [step1, step2()]; return ( } centered={true} > Add a New Device {steps[this.state.step - 1]} {this.state.step > 1 ? ( ) : ( "" )} {this.state.step < steps.length ? ( ) : ( "" )} {this.state.step === steps.length ? ( ) : ( "" )} ); } } const mapStateToProps = (state, _) => ({ devices: Object.values(state.devices), activeRoom: state.active.activeRoom, }); const NewDeviceContainer = connect(mapStateToProps, RemoteService)(NewDevice); export default NewDeviceContainer;