From c8b5fd9b787de052c5ec5e88f80c0b97c934476d Mon Sep 17 00:00:00 2001 From: "Leandro.DS" Date: Wed, 24 Feb 2021 18:01:26 -0300 Subject: [PATCH] Redesign UI --- .vscode/launch.json | 21 -- .vscode/settings.json | 3 - README.md | 17 +- chatear-ui/package.json | 8 +- chatear-ui/src/App.css | 3 +- chatear-ui/src/App.js | 9 +- chatear-ui/src/components/Chat.js | 227 ++++++------- chatear-ui/src/components/ErrorMessage.js | 9 - chatear-ui/src/components/FormsAuth.js | 149 +++++++++ chatear-ui/src/components/Icons.js | 42 ++- chatear-ui/src/components/Navbar.js | 40 +++ chatear-ui/src/components/Signin.js | 84 ----- chatear-ui/src/components/Signup.js | 101 ------ chatear-ui/src/components/UtilComponents.js | 54 +++ chatear-ui/src/css/Chat.css | 312 +++++++++++------- chatear-ui/src/css/FormsAuth.css | 170 ++++++++-- .../src/util/{ApiUtil.js => ApiRequest.js} | 17 +- img/chatear_chat.png | Bin 0 -> 50029 bytes img/chatear_form.png | Bin 0 -> 27472 bytes 19 files changed, 741 insertions(+), 525 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 chatear-ui/src/components/ErrorMessage.js create mode 100644 chatear-ui/src/components/FormsAuth.js create mode 100644 chatear-ui/src/components/Navbar.js delete mode 100644 chatear-ui/src/components/Signin.js delete mode 100644 chatear-ui/src/components/Signup.js create mode 100644 chatear-ui/src/components/UtilComponents.js rename chatear-ui/src/util/{ApiUtil.js => ApiRequest.js} (88%) create mode 100644 img/chatear_chat.png create mode 100644 img/chatear_form.png diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index b0c9ceb..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "java", - "name": "Launch Current File", - "request": "launch", - "mainClass": "${file}" - }, - { - "type": "java", - "name": "Launch ChateArApplication", - "request": "launch", - "mainClass": "com.dsleandro.chatear.ChateArApplication", - "projectName": "chatear" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index c5f3f6b..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "java.configuration.updateBuildConfiguration": "interactive" -} \ No newline at end of file diff --git a/README.md b/README.md index a8fadc7..1eb0544 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,15 @@ -# chateAR -A Java chat application with Spring Boot +# ChateAR + +A Java chat application with Spring Boot, WebSockets and MongoDB. It has also a User Authentication with JWT. + +The UI is created with React.js + +## Screenshots + +### User Form + +![alt text](img/chatear_form.png) + +### Chat + +![alt text](img/chatear_chat.png) diff --git a/chatear-ui/package.json b/chatear-ui/package.json index fa94289..9e73b7f 100644 --- a/chatear-ui/package.json +++ b/chatear-ui/package.json @@ -3,16 +3,16 @@ "version": "0.1.0", "private": true, "dependencies": { - "@testing-library/jest-dom": "^5.11.6", - "@testing-library/react": "^11.2.2", - "@testing-library/user-event": "^12.5.0", + "@testing-library/jest-dom": "^5.11.9", + "@testing-library/react": "^11.2.5", + "@testing-library/user-event": "^12.7.2", "react": "^17.0.1", "react-dom": "^17.0.1", "react-router-dom": "^5.2.0", "react-scripts": "4.0.1", "react-stomp": "^5.0.0", "sockjs-client": "^1.5.0", - "web-vitals": "^0.2.4" + "web-vitals": "^1.1.0" }, "scripts": { "start": "react-scripts start", diff --git a/chatear-ui/src/App.css b/chatear-ui/src/App.css index efa9068..b2f5da2 100644 --- a/chatear-ui/src/App.css +++ b/chatear-ui/src/App.css @@ -1,3 +1,4 @@ .App{ - height: 95vh; + height: 100vh; + overflow: hidden; } diff --git a/chatear-ui/src/App.js b/chatear-ui/src/App.js index e82c21d..6c4ea03 100644 --- a/chatear-ui/src/App.js +++ b/chatear-ui/src/App.js @@ -1,10 +1,12 @@ import React, { useState } from 'react'; import { BrowserRouter as Router, Route } from "react-router-dom"; -import Signin from "./components/Signin"; -import Signup from "./components/Signup"; import Chat from "./components/Chat"; import { ActiveContacts, LogedIn, Messages } from "./context/AuthContext"; +import "./css/Chat.css"; +import "./css/FormsAuth.css"; import "./App.css"; +import FormsAuth from './components/FormsAuth'; + export const AppContext = React.createContext(); const App = () => { @@ -21,8 +23,7 @@ const App = () => { - - + diff --git a/chatear-ui/src/components/Chat.js b/chatear-ui/src/components/Chat.js index a719add..3e86feb 100644 --- a/chatear-ui/src/components/Chat.js +++ b/chatear-ui/src/components/Chat.js @@ -4,22 +4,25 @@ import { countNewMessages, findChatMessages, getCurrentUser, -} from "../util/ApiUtil"; + getLastMessage, +} from "../util/ApiRequest"; import { useActivecontacts, useLogedIn, useMessages } from "../context/AuthContext"; -import "../css/Chat.css"; -import { PaperPlane, UserCircle } from "./Icons"; +import { PaperPlane, DotsMenu } from "./Icons"; +import Navbar from "./Navbar"; +import { Search, UserData, AppLogo } from "./UtilComponents"; var stompClient = null; -const Chat = (props) => { +function Chat(props) { + const currentUser = useLogedIn(); - const [text, setText] = useState(""); - const [contacts, setContacts] = useState([]); const aContact = useActivecontacts(); const userMessages = useMessages(); + const [text, setText] = useState(""); + const [contacts, setContacts] = useState([]); useEffect(() => { if (localStorage.getItem("accessToken") === null) { - props.history.push("/signin"); + props.history.push("/login"); } getCurrentUser().then((res) => { currentUser.setUser(res); @@ -27,18 +30,18 @@ const Chat = (props) => { }, []); useEffect(() => { - if (currentUser.user != null) { + if (currentUser.user != null && contacts.length === 0) { connect(); - loadContacts(); + handleLoadContacts(); } }, [currentUser.user]); useEffect(() => { - if (aContact.activeContact === undefined) return; - findChatMessages(aContact.activeContact.id, currentUser.user.id).then((msgs) => - userMessages.setMessages(msgs) - ); - loadContacts(); + if (aContact.activeContact !== undefined) { + findChatMessages(aContact.activeContact.id, currentUser.user.id).then((msgs) => + userMessages.setMessages(msgs) + ); + } }, [aContact.activeContact]); const connect = () => { @@ -71,16 +74,16 @@ const Chat = (props) => { userMessages.setMessages(msgs) ); } - loadContacts(); + handleLoadContacts(); }; - const sendMessage = (msg) => { + const handleSendMessage = (msg) => { if (msg.trim() !== "") { const message = { senderId: currentUser.user.id, recipientId: aContact.activeContact.id, - senderName: currentUser.user.username, - recipientName: aContact.activeContact.username, + senderUsername: currentUser.user.username, + recipientUsername: aContact.activeContact.username, content: msg, timestamp: new Date(), }; @@ -92,124 +95,98 @@ const Chat = (props) => { } }; - const loadContacts = () => { - const promise = getUsers().then((users) => + const handleLoadContacts = () => { - users.map((contact) => - countNewMessages(contact.id, currentUser.user.id).then((count) => { - contact.newMessages = count; - return contact; - }) - ) - ); + getUsers().then((users) => { + + users.map((contact) => { + countNewMessages(contact.id, currentUser.user.id).then(count => contact.newMessages = count) - promise.then((promises) => - Promise.all(promises).then((users) => { - setContacts(users); - if (aContact.activeContact === undefined && users.length > 0) { - aContact.setActiveContact(users[0]); - } + getLastMessage(contact.id, currentUser.user.id).then(msg => contact.lastMessage = msg.content) + + return contact; }) - ); - }; + setContacts(users); + }); + } - //save contact to get it when new message - const saveActiveContact = (contact) => { + const handleSaveActiveContact = (contact) => { aContact.setActiveContact(contact); - localStorage.setItem("activeContactId", contact.id); + localStorage.setItem("activeContactId", contact.id); //save contact to get it on new message } - const logout = () => { - localStorage.removeItem("accessToken"); - localStorage.removeItem("activeContactId"); - props.history.push("/signin"); - }; - return ( -
-
-
-
- -

{currentUser.user ? currentUser.user.username : null}

-
- {/*TODO: add User Profile component - - View Profile {'>'} */} - -
-
-
    - {contacts.map((contact) => ( -
  • saveActiveContact(contact)} - className={ - aContact.activeContact && contact.id === aContact.activeContact.id - ? "contact active" - : "contact" - } - key={contact.id} - > -
    - -
    -

    {contact.username}

    - {contact.newMessages !== undefined && - contact.newMessages > 0 && ( -

    - {contact.newMessages} new messages -

    - )} -
    -
    -
  • - ))} -
-
- +
+ +
+
+
    + {contacts.map((contact) => ( +
  • handleSaveActiveContact(contact)} + className={ + aContact.activeContact && contact.id === aContact.activeContact.id + ? "contact active" + : "contact" + } + key={contact.id} + > +
    + + {contact.newMessages !== undefined && + contact.newMessages > 0 && ( + + {contact.newMessages} + + )} +
    +
  • + ))} +
-
-
- -

{aContact.activeContact && aContact.activeContact.username}

-
-
-
    - {userMessages.messages !== undefined ? (userMessages.messages.map((msg) => ( -
  • - {msg.senderId !== currentUser.user.id && ( - - )} -

    {msg.content}

    -
  • - ))) : null} -
-
-
-
- setText(event.target.value)} - onKeyPress={(event) => { - if (event.key === "Enter") { - sendMessage(text); + + {aContact.activeContact !== undefined ? + ( +
+
+ + +
+
+
    + {userMessages.messages !== undefined ? (userMessages.messages.map((msg) => ( +
  • +

    {msg.content}

    +
  • + ))) : null} +
+
+
+ setText(event.target.value)} + onKeyPress={(event) => { + if (event.key === "Enter") { + handleSendMessage(text); + setText(""); + } + }} + /> + + + }} + > +
-
-
+ ) : + }
); }; diff --git a/chatear-ui/src/components/ErrorMessage.js b/chatear-ui/src/components/ErrorMessage.js deleted file mode 100644 index 7128f0b..0000000 --- a/chatear-ui/src/components/ErrorMessage.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from "react"; - -function ErrorMessage(props) { - return ( -
{props.message}
- ) -} - -export {ErrorMessage}; \ No newline at end of file diff --git a/chatear-ui/src/components/FormsAuth.js b/chatear-ui/src/components/FormsAuth.js new file mode 100644 index 0000000..0ca42e3 --- /dev/null +++ b/chatear-ui/src/components/FormsAuth.js @@ -0,0 +1,149 @@ +import React, { useState } from "react"; +import { useHistory, Link } from "react-router-dom"; +import { login, signup } from "../util/ApiRequest"; +import { ErrorMessage, AppLogo } from "./UtilComponents"; +import { Spinner } from "./Icons"; + +export default function FormsAuth() { + + const history = useHistory(); + + return ( +
+
+
+
+
+ Login + Sign up +
+ +
+
+ ) +} + +function Forms() { + + const [inputs, setInputs] = useState({ username: "", password: "" }); + const [isError, setIsError] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const history = useHistory(); + + function handleLogin(e) { + e.preventDefault(); + + setIsLoading(true); + + login(inputs).then((res) => { + + setIsLoading(false); + + if (res.accessToken) { + localStorage.setItem("accessToken", res.accessToken); + + history.push("/"); + + } else { + setIsError(true); + } + }).catch(() => { + + setIsLoading(false); + setIsError(true); + + }); + + } + + function handleSignup(e) { + e.preventDefault(); + + setIsLoading(true); + + signup(inputs).then(res => { + setIsLoading(false); + + if (res) { + history.push("/login"); + } else { + setIsError(true); + } + }).catch(() => { + setIsLoading(false); + setIsError(true); + }); + } + + function handleInputs(e) { + var field = e.target; + setInputs((prevState) => { + return { ...prevState, [field.name]: field.value } + }); + } + + function closeErrorMessage() { + setIsError(false); + } + + if (isError) { + setTimeout(closeErrorMessage, 2000); + } + + return ( +
handleLogin(e) + : (e) => handleSignup(e)}> + +
+
+ +
+ {history.location.pathname === "/signup" && + <> handleInputs(e)} + placeholder="First Name" + value={inputs.firstName} + required /> + + handleInputs(e)} + placeholder="Last Name (Optional)" + value={inputs.lastName} /> + } + + handleInputs(e)} + placeholder="Username" + value={inputs.username} + required + autoComplete="username" + /> + handleInputs(e)} + placeholder="Password" + required + autoComplete="new-password" + minLength="8" + /> +
+ + +
+ ) +} diff --git a/chatear-ui/src/components/Icons.js b/chatear-ui/src/components/Icons.js index 875572a..fed2d19 100644 --- a/chatear-ui/src/components/Icons.js +++ b/chatear-ui/src/components/Icons.js @@ -2,38 +2,56 @@ import React from "react"; function UserCircle() { return ( - + ) } function Spinner() { - return( - + return ( + ) } -function SignOutIcon() { +function LogoutIcon() { return ( ) } function PaperPlane() { - return( - + return ( + ) } -function UserIcon() { - return( - +function ContactsIcon() { + return ( + ) } function SettingsIcon() { - return( - + return ( + + ) +} + +function ChatIcon() { + return ( + + ) +} + +function StarIcon() { + return ( + + ) +} + +function DotsMenu() { + return ( + ) } -export { Spinner, UserCircle, SignOutIcon, PaperPlane, UserIcon, SettingsIcon }; \ No newline at end of file +export { Spinner, UserCircle, LogoutIcon, PaperPlane, ContactsIcon, SettingsIcon, ChatIcon, StarIcon, DotsMenu }; \ No newline at end of file diff --git a/chatear-ui/src/components/Navbar.js b/chatear-ui/src/components/Navbar.js new file mode 100644 index 0000000..7f71640 --- /dev/null +++ b/chatear-ui/src/components/Navbar.js @@ -0,0 +1,40 @@ +import React from "react"; +import { UserData } from "./UtilComponents" +import { LogoutIcon, SettingsIcon, ContactsIcon, ChatIcon, StarIcon } from "../components/Icons"; + +export default function Navbar(props) { + + const logout = () => { + localStorage.removeItem("accessToken"); + localStorage.removeItem("activeContactId"); + props.history.push("/login"); + }; + + return ( + + ) +} \ No newline at end of file diff --git a/chatear-ui/src/components/Signin.js b/chatear-ui/src/components/Signin.js deleted file mode 100644 index 720c0ad..0000000 --- a/chatear-ui/src/components/Signin.js +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useState } from "react"; -import { useHistory, Link } from "react-router-dom"; -import { login } from "../util/ApiUtil"; -import { ErrorMessage } from "../components/ErrorMessage"; -import { Spinner } from "../components/Icons"; -import "../css/FormsAuth.css"; - -export default function SignIn(props) { - const [inputs, setInputs] = useState({ username: "", password: "" }); - const [isError, setIsError] = useState(false); - const [isLoading, setIsLoading] = useState(false); - const history = useHistory(); - - - function handleInputs(e) { - var field = e.target; - setInputs((prevState) => { - return { ...prevState, [field.name]: field.value } - }); - } - function handleSubmit(e) { - e.preventDefault(); - - //Loading icon - setIsLoading(true); - - login(inputs).then((res) => { - - setIsLoading(false); - - if (res.accessToken) { - localStorage.setItem("accessToken", res.accessToken); - - history.push("/"); - - } else { - setIsError(true); - } - }).catch(() => { - - setIsLoading(false); - setIsError(true); - - }); - - } - - return ( - isLoading ? : -
-
- - {isError ? : null} -
handleSubmit(e)}> -

Welcome back!

-
- handleInputs(e)} - placeholder="Username" - value={inputs.username} - required - autoComplete="username" - /> - handleInputs(e)} - placeholder="Password" - minLength="8" - autoComplete="current-password" - /> -
- - - Forgot Password? -
-
-
- ) -} diff --git a/chatear-ui/src/components/Signup.js b/chatear-ui/src/components/Signup.js deleted file mode 100644 index 62728d1..0000000 --- a/chatear-ui/src/components/Signup.js +++ /dev/null @@ -1,101 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { signup } from "../util/ApiUtil"; -import { ErrorMessage } from "./ErrorMessage"; -import { Spinner } from "./Icons"; -import "../css/FormsAuth.css"; - -export default function SignUp(props) { - - const [inputs, setInputs] = useState({ username: "", password: "", confirmPassword: "" }); - const [isError, setIsError] = useState(false); - const [isLoading, setIsLoading] = useState(false); - - - useEffect(() => { - if (localStorage.getItem("accessToken") !== null) { - props.history.push("/"); - } - }, []); - - function handleInputs(e) { - var field = e.target; - setInputs((prevState) => { - return { ...prevState, [field.name]: field.value } - }); - } - - async function handleSubmit(e) { - e.preventDefault(); - if (inputs.password === inputs.confirmPassword) { - //delete confirmation input - delete inputs.confirmPassword; - - //Loading icon - setIsLoading(true); - - signup(inputs).then(res => { - //Remove loading icon - setIsLoading(false); - - if (res) { - props.history.push("/signin"); - } else { - return ; - } - }).catch(() => { - //Remove loading icon - setIsLoading(false); - - return ; - }); - - } else setIsError(true) - - } - - return ( - isLoading ? : - < div className="container" > - {isError ? : null} - -
-

Create new user

- -
handleSubmit(e)}> -
- handleInputs(e)} - placeholder="Username" - value={inputs.username} - required - autoComplete="username" - /> - handleInputs(e)} - placeholder="Password" - autoComplete="new-password" - minLength="8" - /> - handleInputs(e)} - placeholder="Confirm Password" - required - autoComplete="new-password" - minLength="8" - /> -
- -
-
-
- ) -} diff --git a/chatear-ui/src/components/UtilComponents.js b/chatear-ui/src/components/UtilComponents.js new file mode 100644 index 0000000..b959c87 --- /dev/null +++ b/chatear-ui/src/components/UtilComponents.js @@ -0,0 +1,54 @@ +import React from "react"; +import { UserCircle, ChatIcon } from "./Icons"; + +function Search() { + + return ( +
+
+
+ + +
+
+
+ ); +} + +function UserData(props) { + + return ( +
+ +
+
{props.user.firstName + " " + props.user.lastName}
+ {props.isContact ?
{props.user.lastMessage}
:
@{props.user.username}
} +
+
+ ); +} + +function ErrorMessage(props) { + + var displayMessage = props.display ? "block" : "none"; + + return ( +
{props.message}
+ ) +} + +function AppLogo() { + return ( +
+
Chatear App
+
+
+ ) +} + +export { Search, UserData, ErrorMessage, AppLogo }; \ No newline at end of file diff --git a/chatear-ui/src/css/Chat.css b/chatear-ui/src/css/Chat.css index 69b3cf6..e5b997b 100644 --- a/chatear-ui/src/css/Chat.css +++ b/chatear-ui/src/css/Chat.css @@ -1,205 +1,252 @@ -#base { +#chat { width: 100%; height: 100vh; - background: #e6eaea; + background: #f5f5f5; } -#base #sidepanel { - float: left; - min-width: 280px; - max-width: 340px; - width: 40%; +#navbar { + display: inline-block; height: 100%; - background: #2c3e50; + width: 20%; + background: linear-gradient(to bottom, #201932, #000000); color: #f5f5f5; - overflow: hidden; position: relative; + overflow: hidden; } -#base #sidepanel #profile { - width: 80%; - margin: 25px auto; +#userData { + padding: 10px; + cursor: pointer; + border-bottom: 1px solid lightgrey; +} + +#userData>* { + display: inline-block; + margin-left: 20px; + vertical-align: middle; } -#base #sidepanel #profile #logoutBtn{ - margin-top: 10px; - height: 40px; +#userData .userDataContainer .names { + font-weight: bold; + font-size: 1.2em; } -#base #sidepanel #profile:hover { - background-color: #32465a; - border-radius: 10px; +#userData .messageOrUsername { + font-size: 0.9em; +} + +#userData .userDataIcon { + font-size: 2.5em; } -#base #sidepanel #profile #viewProfile { - margin-top: 15px; +#navbar #userData:hover { + background: #6714F2; } -#base #sidepanel #profile #userProfile i { - padding-top: 10px; +#navbar .navbarIcon { + font-size: 1.7em; +} + +#navbar #navbarItems { + display: block; + margin-top: 20px; +} + +#navbar .navbarItem { + margin-top: 20px; + padding: 10px; + cursor: pointer; +} + +#navbar .navbarItem>* { margin-left: 15px; + vertical-align: middle; } -#base #sidepanel #profile #userProfile p { - margin: 0; +#navbar .logout { + position: absolute; + width: 100%; + bottom: 10px; + padding-left: 10px; +} + +.navbarItem:hover { + background-color: #6714F2; +} + +.navbarItem.active { + background-color: #6714F2; } -#base #sidepanel #contacts { - height: calc(100% - 177px); +#contacts { + display: inline-block; + height: 100%; overflow-y: auto; overflow-x: hidden; + width: 30%; + background: linear-gradient(to bottom, #201932, #060606); + color: #f5f5f5; + border-right: 1px solid lightgray; +} + +#searchContainer { + padding: 6px; +} + +#baseSearch { + width: 80%; + margin: 20px auto; +} + +#group { + display: flex; +} + +.searchInput { + border-radius: 0 30px 30px 0; + padding: 5px 10px; + height: 30px; + width: 100%; + border: none; +} + +.searchInput:focus { + outline: none !important; + border: none !important; } -#base #sidepanel #contacts::-webkit-scrollbar { +#searchIcon { + display: inline-block; + background: #fff; + color: gray; + padding: 6px 0 0 10px; + border-radius: 30px 0 0 30px; +} + +#contacts::-webkit-scrollbar { width: 8px; background: #2c3e50; } -#base #sidepanel #contacts::-webkit-scrollbar-thumb { +#contacts::-webkit-scrollbar-thumb { background-color: #243140; } -#base #sidepanel #contacts ul li.contact { +#contacts ul li.contact { position: relative; padding: 10px 0 15px 0; font-size: 0.9em; cursor: pointer; - background-color: #f5f5f5; - color: #243140; + border-bottom: 1px solid lightgray; } -#base #sidepanel #contacts ul li.contact:hover { - background: #e0e0e0; +#contacts ul li.contact:hover { + background: rgba(101, 20, 242, 0.50); } -#base #sidepanel #contacts ul li.contact.active { - background: #e0e0e0; - border-right: 5px solid #435f7a; +#contacts ul li.contact.active { + background: rgba(103, 20, 242, 0.50); + border-right: 8px solid #6714F2; } -#base #sidepanel #contacts ul li.contact .wrap { - width: 88%; - margin: 0 auto; - position: relative; +#contacts #userData { + border: none; } -#base #sidepanel #contacts ul li.contact .wrap i { +#contacts .newMessages { position: absolute; - left: 0; - top: 5px; - width: 10px; - height: 10px; -} - -#base #sidepanel #contacts ul li.contact .wrap .meta { - padding: 5px 0 0 0; -} - -#base #sidepanel #contacts ul li.contact .wrap .meta .name { - font-weight: 600; - margin-left: 50px; -} - -#base #sidepanel #contacts ul li.contact .wrap .meta .preview { - margin: 5px 0 0 0; - padding: 0 0 1px; font-weight: 700; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - -moz-transition: 1s all ease; - -o-transition: 1s all ease; - -webkit-transition: 1s all ease; - transition: 1s all ease; - color: green; -} - -#base #sidepanel #contacts ul li.contact .wrap .meta .preview span { - position: initial; - border-radius: initial; - background: none; - border: none; - padding: 0 2px 0 0; - margin: 0 0 0 1px; - opacity: 0.5; + width: 30px; + height: 30px; + padding: 3px; + border-radius: 50%; + text-align: center; + background: #6714F2; + right: 10px; + bottom: 15px; } -#base .content { - float: right; - width: 60%; +.content { + display: inline-block; + width: 50%; height: 100%; overflow: hidden; position: relative; + background: linear-gradient(to bottom, #201932, #000000); + background: #f5f5f5; } -@media screen and (max-width: 735px) { - #base .content { - width: calc(100% - 58px); - min-width: 300px !important; - } +.content #activeContactProfile { + border-bottom: 1px solid lightgray; + position: relative; + box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); } -@media screen and (min-width: 900px) { - #base .content { - width: calc(100% - 340px); - } +.content #activeContactProfile>#userData { + display: inline-block; + border: none; + width: 50%; } -#base .content .contact-profile { - width: 100%; - height: 60px; - line-height: 60px; - background: #f5f5f5; +.content #activeContactProfile>#userData:hover { + background: lightgray; } -#base .content .contact-profile i { - width: 40px; - float: left; - margin: 15px 12px 0 9px; +.content .dotsMenuIcon { + font-size: 1.7em; + width: 50px; + border-radius: 50%; + vertical-align: middle; + text-align: center; + position: absolute; + right: 4%; + top: 20%; + cursor: pointer; +} + +.content .dotsMenuIcon:hover { + background: lightgray; } -#base .content .messages { +.content .messages { height: 600px; overflow-y: scroll; overflow-x: hidden; width: 100%; } -#base .content .messages::-webkit-scrollbar { +.content .messages::-webkit-scrollbar { width: 8px; background: transparent; } -#base .content .messages::-webkit-scrollbar-thumb { +.content .messages::-webkit-scrollbar-thumb { background-color: rgba(0, 0, 0, 0.3); } -#base .content .messages ul li { +.content .messages ul li { display: inline-block; - margin: 5px 15px 5px 15px; + margin: 5px 15px 0 15px; width: calc(100% - 25px); font-size: 0.9em; } -#base .content .messages ul li:nth-last-child(1) { - margin-bottom: 20px; +.content .messages ul li:last-child { + margin-bottom: 40px; } -#base .content .messages ul li.replies i { - margin: 6px 8px 0 0; -} - -#base .content .messages ul li.replies p { - background:#007bff; +.content .messages ul li.replies p { + background: linear-gradient(to bottom, #201932, #000000); color: #f5f5f5; } -#base .content .messages ul li.sent p { - background: #f5f5f5; +.content .messages ul li.sent p { + background: #6714F2; + color: #f5f5f5; float: right; } -#base .content .messages ul li p { +.content .messages ul li p { display: inline-block; padding: 10px 15px; border-radius: 5px; @@ -209,45 +256,58 @@ margin: 0; } -#base .content .message-input { +.content .messageInput { + display: flex; position: absolute; bottom: 0 !important; width: 100%; z-index: 99; } -#base .content .message-input .wrap { - position: relative; -} - -#base .content .message-input .wrap input { +.content .messageInput input { font-family: "proxima-nova", "Source Sans Pro", sans-serif; float: left; border: none; - width: calc(100% - 51px); + width: 100%; padding: 14px 32px 8px 8px; font-size: 0.8em; color: #32465a; font-size: 16px; } -#base .content .message-input .wrap input:focus { +.content .messageInput input:focus { outline: none; } -#base .content .message-input .wrap button { +.content .messageInput button { float: right; border: none; width: 50px; padding: 12px 0; cursor: pointer; - background: #007bff; + background: #6714F2; color: #f5f5f5; height: 48px; } -#base .content .message-input .wrap button:hover { - background: #278fff; +.content .messageInput button:hover { + background: #6514f2cb; +} + +#defaultContent { + display: inline-block; + height: 100%; + width: 50%; + margin: 0 auto; + color: lightgray; + font-size: 5em; + overflow: hidden; + font-weight: bold; + padding-top: 15%; +} + +#defaultContent #chatName, #chatIcon { + text-align: center; } ul { diff --git a/chatear-ui/src/css/FormsAuth.css b/chatear-ui/src/css/FormsAuth.css index c8fa3be..be935fd 100644 --- a/chatear-ui/src/css/FormsAuth.css +++ b/chatear-ui/src/css/FormsAuth.css @@ -1,32 +1,142 @@ +.formAuthContainer { + height: 80vh; + width: 80vw; + margin: 0 auto; + margin-top: 5%; + overflow: hidden; + position: relative; +} + +.appLogoContainer, .formAuth { + display: inline-block; + height: 100%; + width: 50%; + overflow: hidden; +} + +.appLogoContainer>#defaultContent { + width: 100%; + background: #6714F2; + border-radius: 20px 0 0 20px; + color: #fff; + font-size: 4em; +} + +.appLogoContainer #chatIcon { + font-size: 2em; +} + +.formAuth { + background: linear-gradient(to bottom, #201932, #000000); + border-radius: 0 20px 20px 0; + position: relative; +} -.formSignin{ - max-width: 500px; +.formAuth .formAuthData { + display: flex; margin: 0 auto; - border: 1px solid rgb(168, 168, 168); - padding: 20px; - border-radius: 10px; - box-shadow:5px 5px 10px rgba(82, 80, 80, .3); - background-color: #fff; - } - #forgotPassword{ - display: block; - margin-top: 10px; - } - #welcomeBack{ - margin-bottom: 25px; - } - - .errorMessage { - background-color: #fce4e4; - border: 1px solid #fcc2c3; - width: 90%; - padding: 20px 30px; - margin: 20px auto; - color: #cc0033; - font-family: Helvetica, Arial, sans-serif; - font-weight: bold; - text-align: center; - line-height: 20px; - text-shadow: 1px 1px rgba(250,250,250,.3); - } - \ No newline at end of file + height: 80%; + width: 50%; + margin-top: 20%; + flex-flow: column wrap; +} + +.formAuth .formAuthData > .dataContainer { + display: inline-block; + width: 100%; + font-family: Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; +} + +.formAuth .formAuthData .formAuthInput { + display: block; + margin-top: 40px; + width: 100%; + height: 30px; + background: transparent; + outline: none; + border: none; + border-right: 1px solid #f5f5f5; + border-bottom: 1px solid #f5f5f5; + color: #fff; +} + +.formAuth .formAuthData .formAuthInput:focus { + border-right: 1px solid #6714F2; + border-bottom: 1px solid #6714F2; +} + +.formAuth .formAuthData .formAuthSubmit { + display: block; + width: 100%; + height: 50px; + margin-top: 50px; + border: none; + outline: none; + border-radius: 20px; + background: #6714F2; + color: #f5f5f5; +} + +.formAuth .formAuthData .formAuthSubmit:hover { + background: #6514f2b4; +} + + +.changeForm { + float: right; + margin: 20px 30px 0 0; + text-align: center; +} + +.changeForm .formLink{ + padding: 7px 12px; + text-decoration: none; + color: #f5f5f5; + background: linear-gradient(to bottom, #201932, #000000); +} + +.changeForm .formLink.loginLink{ + border-radius: 10px 0 0 10px; +} + +.changeForm .formLink.signupLink{ + border-radius: 0 10px 10px 0; +} + +.changeForm .formLink.active{ + background: #6714F2; +} + +.errorMessage { + background-color: #fce4e4; + border: 1px solid #fcc2c3; + width: 90%; + padding: 20px 30px; + margin: 20px auto; + color: #cc0033; + font-family: Helvetica, Arial, sans-serif; + font-weight: bold; + text-align: center; + line-height: 20px; + text-shadow: 1px 1px rgba(250, 250, 250, .3); +} + +.spinnerContainer { + display: none; + color: #f5f5f5; + font-size: 2em; + position: absolute; + height: 100%; + width: 100%; + background: #000000d0; + margin: -20% -25%; + text-align: center; +} + +.spinnerContainer>* { + margin-top: 45%; +} + +.spinnerContainer.loading { + display: inline-block; +} \ No newline at end of file diff --git a/chatear-ui/src/util/ApiUtil.js b/chatear-ui/src/util/ApiRequest.js similarity index 88% rename from chatear-ui/src/util/ApiUtil.js rename to chatear-ui/src/util/ApiRequest.js index 4c58b91..50f8eaa 100644 --- a/chatear-ui/src/util/ApiUtil.js +++ b/chatear-ui/src/util/ApiRequest.js @@ -13,7 +13,7 @@ const request = (options) => { "Bearer " + localStorage.getItem("accessToken") ); } - + const defaults = { headers: headers }; options = Object.assign({}, defaults, options); @@ -22,7 +22,7 @@ const request = (options) => { if (!response.ok) { return Promise.reject(json); } - + return json; }) ); @@ -97,4 +97,15 @@ export function findChatMessage(id) { url: CHAT_SERVICE + "/messages/" + id, method: "GET", }); -} \ No newline at end of file +} + +export function getLastMessage(senderId, recipientId) { + if (!localStorage.getItem("accessToken")) { + return Promise.reject("No access token set."); + } + + return request({ + url: CHAT_SERVICE + "/messages/last/" + senderId + "/" + recipientId, + method: "GET", + }) +} diff --git a/img/chatear_chat.png b/img/chatear_chat.png new file mode 100644 index 0000000000000000000000000000000000000000..3565fc78f4eec8a7e94886357b5e94b593d60de0 GIT binary patch literal 50029 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 I;lK!Di9-!>NR@n&l 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 E0jH+s>Hq)$ literal 0 HcmV?d00001