From ccaab607d493125f3bf2d72c0601e2815f4e9bb4 Mon Sep 17 00:00:00 2001 From: Avanish Singh <79073722+aaviix@users.noreply.github.com> Date: Tue, 21 Nov 2023 22:25:43 +0100 Subject: [PATCH] Add files via upload --- frontend-react/src/components/Chatbot.js | 133 ++++++++++++++++++ frontend-react/src/components/Header.js | 15 ++ frontend-react/src/components/InputSection.js | 37 +++++ frontend-react/src/components/Left_message.js | 16 +++ frontend-react/src/components/Message.js | 16 +++ .../src/components/MessageSection.js | 34 +++++ .../src/components/Right_message.js | 16 +++ frontend-react/src/components/Sidebar.js | 38 +++++ 8 files changed, 305 insertions(+) create mode 100644 frontend-react/src/components/Chatbot.js create mode 100644 frontend-react/src/components/Header.js create mode 100644 frontend-react/src/components/InputSection.js create mode 100644 frontend-react/src/components/Left_message.js create mode 100644 frontend-react/src/components/Message.js create mode 100644 frontend-react/src/components/MessageSection.js create mode 100644 frontend-react/src/components/Right_message.js create mode 100644 frontend-react/src/components/Sidebar.js diff --git a/frontend-react/src/components/Chatbot.js b/frontend-react/src/components/Chatbot.js new file mode 100644 index 0000000..2b80524 --- /dev/null +++ b/frontend-react/src/components/Chatbot.js @@ -0,0 +1,133 @@ +import React, {useEffect, useState} from "react"; +import "../images/style.css"; +import Header from "./Header"; +import InputSection from "./InputSection"; +import MessageSection from "./MessageSection"; +import Sidebar from "./Sidebar"; +import io from 'socket.io-client'; + +import RightMessage from "./Right_message"; +import LeftMessage from "./Left_message"; + +const socket = io(); +const Chatbot = () => { + + const [messages, setMessage] = useState([]) + const [theme, setTheme] = useState('Light'); + const [area, setArea] = useState('msg_sec'); + + const [update, setUpdate] = useState('https://upload.wikimedia.org/wikipedia/commons/b/bc/Refresh_icon.png'); + + const greetingMessage = { + info: "Hey, Welcome to Recipe Selection System, Say Hi to start chat?", + date: getCurrentTime(), + type: "left", + name: "FoodWhizz Bot" + }; + useEffect(() => { + setMessage([greetingMessage]); + }, []); + + function handleButtonClick() { + + const head = document.getElementById("head"); + const input = document.getElementById("input"); + const input_area = document.getElementById("input_area"); + const container = document.getElementById("container"); + const body = document.getElementsByTagName("body")[0]; + const bar = document.getElementById("sidebar"); + const labels = document.getElementsByTagName("ul")[0]; + if (theme === 'light'){ + setTheme('dark'); + setUpdate("https://upload.wikimedia.org/wikipedia/commons/3/38/Solid_white_bordered.png"); + setArea('msg_sec black'); + head.style.background = '#010507'; + head.style.color = '#ffffff'; + head.style.borderBottom = '3px solid black'; + input.style.background = '#010507'; + input.style.borderTop = '3px solid black'; + input_area.style.background = 'black'; + input_area.style.color = 'white'; + input_area.classList.toggle("placeholder-white"); + body.style.background = 'linear-gradient(135deg, #000102 0%, #173146 100%)'; + container.style.border = '3px solid black'; + container.style.backgroundColor = '#010507'; + bar.style.color = 'black'; + labels.style.color = 'black'; + } + else { + setTheme('light'); + setUpdate("https://upload.wikimedia.org/wikipedia/commons/b/bc/Refresh_icon.png"); + setArea('msg_sec'); + head.style.background = '#d0d0d0'; + head.style.color = '#5b5b5b'; + head.style.borderBottom = '3px solid white'; + input.style.background = '#d0d0d0'; + input.style.borderTop = '3px solid white'; + input_area.style.background = 'white'; + input_area.style.color = '#5b5b5b'; + input_area.classList.remove("placeholder-white"); + body.style.background = 'linear-gradient(135deg, #a7acad 0%, #bac5cc 100%)'; + container.style.border = '3px solid white'; + container.style.backgroundColor = '#d0d0d0'; + bar.style.color = 'white'; + labels.style.color = 'white'; + } + + }; + + function AddMes(value_info, value_type) { + var new_mes_right = Create(value_info, value_type, "User"); + setMessage([...messages, new_mes_right]); + + socket.emit('human', value_info) + socket.on('botmes', (dat) =>{ + const new_mes = Create(data, "left", "Bot"); + setMessages([...messages,new_mes_right,new_mes]); + }) + } + + function getCurrentTime() { + const date = new Date(); + const hours = date.getHours().toString().padStart(2, '0'); + const minutes = date.getMinutes().toString().padStart(2, '0'); + return `${hours}:${minutes}`; + } + + function Create(value_info, value_type, name){ + let date = new Date(); + let minutes = date.getMinutes().toString(); + if (date.getMinutes() < 10){ + minutes = "0" + minutes.toString(); + } + return( + { + info: value_info, + date: date.getHours().toString() + ":" + minutes, + type: value_type, + name: name + } + ) + + } + + function Update() { + setMessage([greetingMessage]) + } + + return ( + <div> + <input className="down_button" id="top-box" type="checkbox" hidden></input> + <label className="down_label" htmlFor="top-box"></label> + <Sidebar func={handleButtonClick}/> + <div className="main" id="container"> + <Header update={Update} button={update}/> + <MessageSection messages={messages} area={area}/> + <InputSection send_button={AddMes}/> + </div> + <footer>© Copyright 2023</footer> + </div> + ); +}; + +export default Chatbot; diff --git a/frontend-react/src/components/Header.js b/frontend-react/src/components/Header.js new file mode 100644 index 0000000..c0b63a1 --- /dev/null +++ b/frontend-react/src/components/Header.js @@ -0,0 +1,15 @@ +import React from "react"; +import "../images/style.css"; + +const Header = (props) => { + return ( + <div className="header" id="head">Chatbot + <button className="refresh" type="submit" onClick={props.update}> + <img className="update hover" + src="refresh.png"></img> + </button> + </div> + ); +}; + +export default Header; \ No newline at end of file diff --git a/frontend-react/src/components/InputSection.js b/frontend-react/src/components/InputSection.js new file mode 100644 index 0000000..fd53633 --- /dev/null +++ b/frontend-react/src/components/InputSection.js @@ -0,0 +1,37 @@ +import React, {useRef, useState} from "react"; +import '../images/style.css'; + +const InputSection = (props) => { + + const [value , setValue] = useState("") + const textareaRef = useRef(null); + + const handleKeyDown = (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + return false; + } + }; + + function HandleSend() { + if (value !== "") { + props.send_button(value, "right"); + setValue("") + } + } + + return( + <div className="header_bottom" id="input"> + <textarea id="input_section" ref={textareaRef} onKeyDown={handleKeyDown} placeholder="Say Hey to start" value={value} onChange={event => setValue(event.target.value)}></textarea> + <button className="send_button" type="submit" id="send" onClick={HandleSend}>Send</button> + </div> + ); +}; + +document.addEventListener('keydown', function (event){ + if (event.key === 'Enter') { + document.getElementById('send').click(); + } +}); + +export default InputSection; \ No newline at end of file diff --git a/frontend-react/src/components/Left_message.js b/frontend-react/src/components/Left_message.js new file mode 100644 index 0000000..2da5fac --- /dev/null +++ b/frontend-react/src/components/Left_message.js @@ -0,0 +1,16 @@ +import React from "react"; +import Message from "./Message"; +import '../images/style.css'; + +const LeftMessage = (props) => { + return ( + <div className="left_message"> + <div className="icon left"></div> + <div className="msg left"> + <Message message={props.left_message}></Message> + </div> + </div> + ); +}; + +export default LeftMessage; \ No newline at end of file diff --git a/frontend-react/src/components/Message.js b/frontend-react/src/components/Message.js new file mode 100644 index 0000000..9379212 --- /dev/null +++ b/frontend-react/src/components/Message.js @@ -0,0 +1,16 @@ +import React from "react"; +import '../images/style.css'; + +const Message = (props) => { + return ( + <div className="message"> + <div className="msg_info"> + <div className="mes_header">{props.message.name}</div> + <div className="mes_time">{props.message.data}</div> + </div> + <div className="mes_text">{props.message.info}</div> + </div> + ); +}; + +export default Message; \ No newline at end of file diff --git a/frontend-react/src/components/MessageSection.js b/frontend-react/src/components/MessageSection.js new file mode 100644 index 0000000..ee77725 --- /dev/null +++ b/frontend-react/src/components/MessageSection.js @@ -0,0 +1,34 @@ +import React, {useEffect, useRef} from "react"; +import LeftMessage from "./Left_message"; +import RightMessage from "./Right_message"; +import '../images/style.css'; + +const MessageSection = (props) => { + const End = useRef(null) + + useEffect(() => { + if (props.message.length > 0 ) { + scrollToBottom(); + } + }) + + function scrollToBottom() { + End.current.scrollIntoView({behavior: "smooth"}) + } + + return( + <div className={props.area}> + {props.message.map(mes => { + switch (mes.type) { + case "right": + return <RightMessage right_message={mes}/>; + case "left": + return <LeftMessage left_message={mes}/> + } + })} + <div ref={End}></div> + </div> + ); +}; + +export default MessageSection; \ No newline at end of file diff --git a/frontend-react/src/components/Right_message.js b/frontend-react/src/components/Right_message.js new file mode 100644 index 0000000..8dc95cd --- /dev/null +++ b/frontend-react/src/components/Right_message.js @@ -0,0 +1,16 @@ +import React from "react"; +import '../images/style.css'; +import Message from "./Message"; + +const RightMessage = (props) => { + return ( + <div className="right_message"> + <div className="icon"></div> + <div className=" msg right"> + <Message message={props.right_message}/> + </div> + </div> + ); +}; + +export default RightMessage; \ No newline at end of file diff --git a/frontend-react/src/components/Sidebar.js b/frontend-react/src/components/Sidebar.js new file mode 100644 index 0000000..ef1eb6b --- /dev/null +++ b/frontend-react/src/components/Sidebar.js @@ -0,0 +1,38 @@ +import React from "react"; +import '../images/style.css'; + +function addText(text_for_sidebar) { + const area = document.getElementById("text"); + area.innerText = text_for_sidebar; +} + +const Sidebar = (props) => { + + return ( + <div id="sidebar"> + <ul> + <li> + <button className="bar" id="home">Home</button> + </li> + <li> + <button className="bar" + onClick={() => addText("Welcome to Recipe Bot WebPage." + + "This bot is made to help you have proper recipes for the food you would love to have. Team Members:" + + "Avanish Kumar Singh, Brahim Ghaouthi, Rashid Aghayev,Mamoun Mourad")}>About Us</button> + </li> + <li> + <button className="bar" onClick={() => addText('you can add your emails here:\n' + + 'Avanish Kumar Singh:avanish.singh@stud.th-deg.de \nMamoun Mourad: \nRashid Aghayev: \nBrahim Ghaouthi: brahim.ghaouthi@stud.th-deg.de')}>Contact + </button> + </li> + <button className="bar" id="dark_theme" onClick={props.func}>Change Mode</button> + </ul> + <p id="text"> Welcome to the Recipe Bot WebPage. + This bot is made to help you have proper recipes for the food you would love to have. + Team Members: Avanish Kumar Singh, Brahim Ghaouthi, Rashid Aghayev,Mamoun Mourad + </p> + </div> + ); +}; + +export default Sidebar; \ No newline at end of file -- GitLab