diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a033693..66f9d91 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ image: node:latest stages: - build - test + - deploy cache: paths: @@ -19,6 +20,25 @@ install_dependencies: testing_testing: stage: test - script: + script: - cd smart-hut - - yarn test \ No newline at end of file + - yarn test + +smartHut_deploy: + stage: deploy + tags: + - dind + image: docker:latest + services: + - docker:dind + variables: + DOCKER_DRIVER: overlay + before_script: + - docker version + - docker info + - docker login -u smarthutsm -p $CI_DOCKER_PASS #GiovanniRoberto + script: + - "docker build -t smarthutsm/smarthut:${CI_COMMIT_BRANCH} ." + - "docker push smarthutsm/smarthut:${CI_COMMIT_BRANCH}" + after_script: + - docker logout diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..18cd721 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +#FROM mhart/alpine-node:11 AS pleaseGodWork +#WORKDIR /app +#COPY . /app +#RUN ls +#RUN yarn run build +# +#RUN yarn global add serve +# +# +#CMD ["serve", "-p", "8080", "-s", "."] + +# base image +FROM node:9.6.1 +RUN mkdir /usr/src/app +WORKDIR /usr/src/app +ENV PATH /usr/src/app/node_modules/.bin:$PATH + + +COPY smart-hut/package.json /usr/src/app/package.json +RUN npm install --silent +RUN npm install react-scripts@1.1.1 -g --silent + + +CMD ["npm", "start"] + +FROM node:9.6.1 as builder +RUN mkdir /usr/src/app +WORKDIR /usr/src/app +ENV PATH /usr/src/app/node_modules/.bin:$PATH +COPY smart-hut/package.json /usr/src/app/package.json +RUN npm install --silent +RUN npm install react-scripts@1.1.1 -g --silent +COPY smart-hut/. /usr/src/app +RUN npm run build + +FROM nginx:1.13.9-alpine +COPY --from=builder /usr/src/app/build /usr/share/nginx/html +EXPOSE 8080 +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/smart-hut/public/avatar.png b/smart-hut/public/avatar.png new file mode 100644 index 0000000..86ce723 Binary files /dev/null and b/smart-hut/public/avatar.png differ diff --git a/smart-hut/public/avatar2.png b/smart-hut/public/avatar2.png new file mode 100644 index 0000000..97ac118 Binary files /dev/null and b/smart-hut/public/avatar2.png differ diff --git a/smart-hut/public/img/room_404_meme/1.jpeg b/smart-hut/public/img/room_404_meme/1.jpeg new file mode 100644 index 0000000..b039f37 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/1.jpeg differ diff --git a/smart-hut/public/img/room_404_meme/10.jpg b/smart-hut/public/img/room_404_meme/10.jpg new file mode 100644 index 0000000..d1b2abd Binary files /dev/null and b/smart-hut/public/img/room_404_meme/10.jpg differ diff --git a/smart-hut/public/img/room_404_meme/11.jpeg b/smart-hut/public/img/room_404_meme/11.jpeg new file mode 100644 index 0000000..0675dac Binary files /dev/null and b/smart-hut/public/img/room_404_meme/11.jpeg differ diff --git a/smart-hut/public/img/room_404_meme/12.gif b/smart-hut/public/img/room_404_meme/12.gif new file mode 100644 index 0000000..575dbac Binary files /dev/null and b/smart-hut/public/img/room_404_meme/12.gif differ diff --git a/smart-hut/public/img/room_404_meme/13.gif b/smart-hut/public/img/room_404_meme/13.gif new file mode 100644 index 0000000..94b389c Binary files /dev/null and b/smart-hut/public/img/room_404_meme/13.gif differ diff --git a/smart-hut/public/img/room_404_meme/14.gif b/smart-hut/public/img/room_404_meme/14.gif new file mode 100644 index 0000000..575599e Binary files /dev/null and b/smart-hut/public/img/room_404_meme/14.gif differ diff --git a/smart-hut/public/img/room_404_meme/2.jpeg b/smart-hut/public/img/room_404_meme/2.jpeg new file mode 100644 index 0000000..eb71f0b Binary files /dev/null and b/smart-hut/public/img/room_404_meme/2.jpeg differ diff --git a/smart-hut/public/img/room_404_meme/3.png b/smart-hut/public/img/room_404_meme/3.png new file mode 100644 index 0000000..8c2b210 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/3.png differ diff --git a/smart-hut/public/img/room_404_meme/4.jpeg b/smart-hut/public/img/room_404_meme/4.jpeg new file mode 100644 index 0000000..413c5f3 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/4.jpeg differ diff --git a/smart-hut/public/img/room_404_meme/5.jpeg b/smart-hut/public/img/room_404_meme/5.jpeg new file mode 100644 index 0000000..294fcb4 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/5.jpeg differ diff --git a/smart-hut/public/img/room_404_meme/6.jpg b/smart-hut/public/img/room_404_meme/6.jpg new file mode 100644 index 0000000..e830719 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/6.jpg differ diff --git a/smart-hut/public/img/room_404_meme/7.jpg b/smart-hut/public/img/room_404_meme/7.jpg new file mode 100644 index 0000000..358bec2 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/7.jpg differ diff --git a/smart-hut/public/img/room_404_meme/8.jpg b/smart-hut/public/img/room_404_meme/8.jpg new file mode 100644 index 0000000..0f63a46 Binary files /dev/null and b/smart-hut/public/img/room_404_meme/8.jpg differ diff --git a/smart-hut/public/img/room_404_meme/9.jpeg b/smart-hut/public/img/room_404_meme/9.jpeg new file mode 100644 index 0000000..db5935a Binary files /dev/null and b/smart-hut/public/img/room_404_meme/9.jpeg differ diff --git a/smart-hut/public/smart-home.png b/smart-hut/public/smart-home.png new file mode 100644 index 0000000..d2681ce Binary files /dev/null and b/smart-hut/public/smart-home.png differ diff --git a/smart-hut/public/smart-home_index.png b/smart-hut/public/smart-home_index.png new file mode 100644 index 0000000..3b678bc Binary files /dev/null and b/smart-hut/public/smart-home_index.png differ diff --git a/smart-hut/public/title.png b/smart-hut/public/title.png new file mode 100644 index 0000000..0e288cf Binary files /dev/null and b/smart-hut/public/title.png differ diff --git a/smart-hut/public/title3.png b/smart-hut/public/title3.png new file mode 100644 index 0000000..635a665 Binary files /dev/null and b/smart-hut/public/title3.png differ diff --git a/smart-hut/public/title4.png b/smart-hut/public/title4.png new file mode 100644 index 0000000..8a39bf1 Binary files /dev/null and b/smart-hut/public/title4.png differ diff --git a/smart-hut/public/user-icon.png b/smart-hut/public/user-icon.png new file mode 100644 index 0000000..7c2a03c Binary files /dev/null and b/smart-hut/public/user-icon.png differ diff --git a/smart-hut/src/App.js b/smart-hut/src/App.js index 5cc0cd3..efde975 100644 --- a/smart-hut/src/App.js +++ b/smart-hut/src/App.js @@ -80,12 +80,12 @@ class App extends Component { }; logout() { + console.log("logout") this.setState({ loggedIn : false, }); localStorage.removeItem("token"); - this.props.history.push("/"); }; render() { diff --git a/smart-hut/src/client_server.js b/smart-hut/src/client_server.js index 18c2ae4..3821dcb 100644 --- a/smart-hut/src/client_server.js +++ b/smart-hut/src/client_server.js @@ -59,6 +59,28 @@ export var call = { return err; }); }, + getAllDevices: function(token) { + if (!token){ + token = tkn; + } + return axios.get(config + 'device', { headers: { Authorization : "Bearer " + token } }) + .then(res => { + return res; + }).catch(err => { + return err; + }); + }, + getAllDevicesByRoom: function(id, token) { + if (!token){ + token = tkn; + } + return axios.get(config + 'room/' + id + '/devices' , { headers: { Authorization : "Bearer " + token } }) + .then(res => { + return res; + }).catch(err => { + return err; + }); + }, createRoom: function(data, headers) { return axios.post(config + 'room', data, { headers: { Authorization : "Bearer " + tkn } }) .then(res => { diff --git a/smart-hut/src/components/HeaderController.js b/smart-hut/src/components/HeaderController.js index 355d08a..5bf9c9f 100644 --- a/smart-hut/src/components/HeaderController.js +++ b/smart-hut/src/components/HeaderController.js @@ -29,7 +29,7 @@ const HeaderExampleIconProp = () => ( -const GridExampleInverted = () => ( +const GridExampleInverted = (props) => ( @@ -57,7 +57,7 @@ const GridExampleInverted = () => ( See profile... - Logout + Logout @@ -67,9 +67,10 @@ const GridExampleInverted = () => ( export default class MyHeader extends React.Component { render() { + console.log(this.props) return (
- +
); } diff --git a/smart-hut/src/components/dashboard/DevicePanel.js b/smart-hut/src/components/dashboard/DevicePanel.js index 0276963..cb32a63 100644 --- a/smart-hut/src/components/dashboard/DevicePanel.js +++ b/smart-hut/src/components/dashboard/DevicePanel.js @@ -2,93 +2,38 @@ import React, {Component} from 'react'; import { Grid, } from "semantic-ui-react"; -import NewDevice from "./devices/NewDevice"; -import {LightDevice, SmartPlugDevice} from "./devices/TypesOfDevices"; import {editButtonStyle, panelStyle} from "./devices/styleComponents"; import {checkMaxLength, DEVICE_NAME_MAX_LENGTH} from "./devices/constants"; -import Light from "./devices/Light"; -import SmartPlug from "./devices/SmartPlug"; -import Sensor from "./devices/Sensor"; -import DigitalSensor from "./devices/DigitalSensor"; -import Switch from "./devices/Switch"; -import SettingsModal from "./devices/SettingsModal"; +import DeviceType from './devices/DeviceTypeController'; +import NewDevice from "./devices/NewDevice"; - -const devices = [ - { - "id": 1, - "name": "Bedroom Light", - "type": "light", - "hasIntensity": true, - "intensityLevel": 0.20, - ...LightDevice - }, - { - "id": 2, - "name": "Bathroom Light", - "type": "light", - ...LightDevice - }, - { - "id": 3, - "name": "Desktop Light", - "type": "light", - ...LightDevice - }, - { - "id": 4, - "name": "Entrance Light", - "type": "light", - ...LightDevice - }, - { - "id": 5, - "name": "Smart Plug", - "type": "smart-plug", - ...SmartPlugDevice - }, - { - "id": 6, - "name": "Bedroom Thermometer", - "type": "temperature-sensor", - }, - { - "id": 7, - "name": "Bedroom Alarm", - }, - -]; - -class Panel extends Component { +export default class DevicePanel extends Component { constructor(props) { super(props); this.state = { - devices: devices, - - editMode: false, - openSettingsModal: false, - settingsDeviceId: null, + editMode : false, + devices : this.props.devices, }; } - editModeController = (e) => { - this.setState((prevState) => ({editMode: !prevState.editMode})); - }; + editModeController = (e) => this.setState((prevState) => ({ editMode: !prevState.editMode })); changeDeviceData = (deviceId, newSettings) => { - console.log(newSettings.name, " <-- new name --> ", deviceId); + + console.log(newSettings.name, " <-- new name --> ", deviceId ); this.state.devices.map(device => { - if (device.id === deviceId) { - for (let prop in newSettings) { - if (device.hasOwnProperty(prop)) { - if (prop === "name") { - if (checkMaxLength(newSettings[prop])) { + if(device.id === deviceId){ + for(let prop in newSettings){ + if(device.hasOwnProperty(prop)){ + if(prop==="name"){ + if(checkMaxLength(newSettings[prop])){ device[prop] = newSettings[prop]; - } else { + } + else{ alert("Name must be less than " + DEVICE_NAME_MAX_LENGTH + " characters."); } - } else { + }else{ device[prop] = newSettings[prop]; } @@ -100,38 +45,26 @@ class Panel extends Component { this.forceUpdate(); }; - openModal = (settingsDeviceId) => { - this.setState(prevState => ({ - openSettingsModal: !prevState.openSettingsModal, - settingsDeviceId: settingsDeviceId - })); - }; render() { - const edit = { - mode: this.state.editMode, - openModal: this.openModal, - }; return (
- - {this.state.openSettingsModal ? - d.id === this.state.settingsDeviceId)[0]}/> : ""} + 0 ? this.state.devices.length : 1} divided="vertically"> + { + this.state.devices ? + this.state.devices.map((e, i) => { + return ( + + + + ) + }) + : + null + } - - - - - - - - - - - - - +
@@ -140,21 +73,3 @@ class Panel extends Component { } - -export default class DevicePanel extends Component { - - constructor(props) { - super(props); - this.state = { - shownRoom: "All" - } - } - - render() { - return ( - - ) - } - -} - diff --git a/smart-hut/src/components/dashboard/devices/DeviceTypeController.js b/smart-hut/src/components/dashboard/devices/DeviceTypeController.js new file mode 100644 index 0000000..2b1cc08 --- /dev/null +++ b/smart-hut/src/components/dashboard/devices/DeviceTypeController.js @@ -0,0 +1,25 @@ +import React, { Component } from 'react'; +import Light from "./Light"; +import SmartPlug from "./SmartPlug"; +import Sensor from "./Sensor"; +import DefaultDimmer from "./Dimmer"; +import Switcher from "./Switch"; + + + +const DeviceType = (props) => { + switch(props.type) { + case "light": + return + case "sensor": + return + case "dimmer": + return + case "smartplug": + return + case "switch": + return + } +} + +export default DeviceType; diff --git a/smart-hut/src/components/dashboard/devices/Dimmer.js b/smart-hut/src/components/dashboard/devices/Dimmer.js index 078fe94..862095a 100644 --- a/smart-hut/src/components/dashboard/devices/Dimmer.js +++ b/smart-hut/src/components/dashboard/devices/Dimmer.js @@ -30,7 +30,7 @@ export class StatefulDimmer extends Component{ } } -export class DefaultDimmer extends Component{ +export default class DefaultDimmer extends Component{ // As far as I am concern, even though this dimmer doesn't have state, internally it's needed constructor(props){ super(props); diff --git a/smart-hut/src/components/modalform.js b/smart-hut/src/components/modalform.js index 3400d42..79ca7da 100644 --- a/smart-hut/src/components/modalform.js +++ b/smart-hut/src/components/modalform.js @@ -7,7 +7,8 @@ export default class ModalWindow extends Component { constructor(props) { super(props); this.state = { - selectedIcon: 'home', + id : "", + selectedIcon: "", name: "", img: "", openModal: false @@ -23,14 +24,26 @@ export default class ModalWindow extends Component { "name" : this.state.name, "images" : this.state.img } - - console.log(this.props, data); this.props.addRoom(data); this.closeModal(); } + modifyRoomModal = (e) => { + let data = { + "icon" : this.state.selectedIcon, + "name" : this.state.name, + "images" : this.state.img + } + this.props.updateRoom(data); + this.closeModal(); + } + deleteRoom = (e) => { - console.log(e); + let data = { + "id" : this.state.id + } + this.props.deleteRoom(data); + this.closeModal(); } changeSomething = (event) => { @@ -49,7 +62,6 @@ export default class ModalWindow extends Component { } updateIcon(e) { - console.log(e); this.setState({selectedIcon : e}) } @@ -64,10 +76,16 @@ export default class ModalWindow extends Component { return (
+ + {this.props.type == "new" ? + : + + } + @@ -76,16 +94,19 @@ export default class ModalWindow extends Component {

Insert the name of the room:

- +

Insert an image of the room:

- +

Select an icon:

+ {this.props.type == "new" ? "home" : this.props.idRoom.icon }
@@ -100,9 +121,12 @@ export default class ModalWindow extends Component { - +
diff --git a/smart-hut/src/views/Dashboard.js b/smart-hut/src/views/Dashboard.js index 10be5e6..e9d4253 100644 --- a/smart-hut/src/views/Dashboard.js +++ b/smart-hut/src/views/Dashboard.js @@ -4,18 +4,24 @@ import Navbar from './Navbar' import MyHeader from '../components/HeaderController' import { call } from '../client_server'; -import {Button} from 'semantic-ui-react'; -import { Menu } from 'semantic-ui-react' -import { Grid, Image, Icon } from 'semantic-ui-react' +import { Grid } from 'semantic-ui-react' +/* + rooms -> actual rooms + activeItem -> the current room in view + devices -> current device in current room view + id of Home is -1 +*/ + export default class Dashboard extends Component{ constructor(props) { super(props); this.state = { rooms: [], - activeItem: "Home", - tkn: this.props.tkn + activeItem: -1, + devices: [], + tkn: this.props.tkn, }; this.addRoom = this.addRoom.bind(this); @@ -25,14 +31,20 @@ export default class Dashboard extends Component{ componentDidMount() { call.getAllRooms(this.props.tkn) .then(res => { - res.data.forEach((e) => { - this.setState(state => ({ - rooms: state.rooms.concat([e]) - })); + this.setState({ + rooms: res.data }); }).catch(err => { - console.log(err); - }); + console.log(err); + }); + call.getAllDevices(this.props.tkn) + .then(res => { + this.setState({ + devices: res.data + }); + }).catch(err => { + console.log(err); + }); } addRoom(data) { @@ -45,35 +57,48 @@ export default class Dashboard extends Component{ })); } }).catch(err => { - console.log(err); - }); + console.log(err); + }); }; deleteRoom(id) { - + call.deleteRoom(id) + .then(res => { + //remove room in state.rooms + }).catch(err => { + console.log(err); + }); } - handleItemClick(el) { + handleItemClick(id) { + // el -> obj of name and id //da fare richiesta get della room e settare activeItem + call.getAllDevicesByRoom(id, this.props.tkn) + .then(res => { + this.setState({ + devices: res.data + }); + }).catch(err => { + console.log(err); + }); } render () { return(
- - - - - - + + + + + - + diff --git a/smart-hut/src/views/ForgotPassword.js b/smart-hut/src/views/ForgotPassword.js new file mode 100644 index 0000000..7b3a2bd --- /dev/null +++ b/smart-hut/src/views/ForgotPassword.js @@ -0,0 +1,107 @@ +import React, { Component } from "react"; +import { render } from "react-dom"; +import HomeNavbar from "./../components/HomeNavbar"; +import { + Container, + Icon, + Image, + Menu, + Sidebar, + Responsive, + Header, + Divider, + Message, + Grid +} from "semantic-ui-react"; + +class Paragraph extends Component { + state = { visible: true } + + handleDismiss = () => { + this.setState({ visible: false }) + + setTimeout(() => { + this.setState({ visible: true }) + }, 2000) + } + + render() { + if (this.state.visible) { + return ( + + ) + } + + return ( +

+
+ The message will return in 2s +
+
+

+ ) + } + } + + + const MessageReg = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) + +export default class ForgotPasswrod extends React.Component { + render () { + return ( + + ) + } +} \ No newline at end of file diff --git a/smart-hut/src/views/FourOhFour.js b/smart-hut/src/views/FourOhFour.js index 99cca6c..2aa89f5 100644 --- a/smart-hut/src/views/FourOhFour.js +++ b/smart-hut/src/views/FourOhFour.js @@ -1,5 +1,5 @@ import React, {Component} from 'react'; -import { Message} from 'semantic-ui-react'; +import { Header, Grid, Message, Button} from 'semantic-ui-react'; import {Link } from "react-router-dom"; @@ -7,13 +7,29 @@ export default class FourOhFour extends Component { render() { return ( - - 404 Page Not Found -

- Hey what are you doing here? - Go back to our homepage -

-
+
+ + +
404
+
+ + + + 404 Page Not Found +

+ Hey what are you doing here? + Looks like you are lost, this room does not exist. +

+
+
+ + + +
+
+
) } } \ No newline at end of file diff --git a/smart-hut/src/views/Navbar.js b/smart-hut/src/views/Navbar.js index c887f59..121d4b7 100644 --- a/smart-hut/src/views/Navbar.js +++ b/smart-hut/src/views/Navbar.js @@ -8,27 +8,24 @@ class Navbar extends Component { super(props); this.state = { activeItem: 'Home', - edited: "" + edited: "", + editMode : false } } - showForm = (event) => { - console.log(event); - if (event === "new"){ - console.log("funziona"); - return () - } - } + editModeController = (e) => { + this.setState((prevState) => ({ editMode: !prevState.editMode })); + }; - handleClick = (e, { i }) => { - this.setState({ activeItem: e.name, - edited: i + handleClick = (e, {id}) => { + console.log(id); + this.setState({ activeItem: id, }); - this.props.handleItemClick(e) + this.props.handleItemClick(id) } render(){ - const { activeItem } = this.state + //const { activeItem } = this.state return (
@@ -40,8 +37,9 @@ class Navbar extends Component { @@ -50,7 +48,7 @@ class Navbar extends Component { - Home + HOME @@ -64,38 +62,38 @@ class Navbar extends Component { id={e.id} key={i} name={e.name} - active={activeItem === e.name} + active={this.state.activeItem === e.id} onClick={this.handleClick} > - + - + {e.name} - - + + {this.state.edit ? + + : null + } - - ) }) : null } + - - + - diff --git a/smart-hut/src/views/TestHeaderController.js b/smart-hut/src/views/TestHeaderController.js new file mode 100644 index 0000000..6293908 --- /dev/null +++ b/smart-hut/src/views/TestHeaderController.js @@ -0,0 +1,20 @@ +import _ from "lodash"; +import React, { Component } from "react"; +import HeaderController from "./../components/HeaderController"; +import { render } from "react-dom"; +import { + Container, + Icon, + Image, + Menu, + Sidebar, + Responsive +} from "semantic-ui-react"; + +export default class TestHeaderController extends React.Component { + render () { + return ( + + ) + } +} \ No newline at end of file