# Session: MonkChat **AUTOR:** Matheus Rafael Morato Rocha **TURMA:** Informática C. **NÚMERO:** 40. ## api ````jsx import db from './db.js'; import express from 'express' import cors from 'cors' import tb_usuario from './models/tb_usuario.js'; import crypto from 'crypto-js' const app = express(); app.use(cors()); app.use(express.json()); app.post('/sala', async (req, resp) => { try { let salaParam = req.body; let s = await db.tb_sala.findOne({ where: { nm_sala: salaParam.nome } }); if (s != null) return resp.send({ erro: 'Sala já existe!' }); let r = await db.tb_sala.create({ nm_sala: salaParam.nome, bt_ativo: salaParam.ativo }) resp.send(r); } catch (e) { resp.send({ erro: 'Ocorreu um erro!'}) } }) app.get('/sala', async (req, resp) => { try { let salas = await db.tb_sala.findAll(); resp.send(salas); } catch (e) { resp.send({ erro: 'Ocorreu um erro!'}) } }) app.post('/usuario', async (req, resp) => { try { let usuParam = req.body; let u = await db.tb_usuario.findOne({ where: { nm_usuario: usuParam.nome } }); if (u != null) return resp.send({ erro: 'Usuário já existe!' }); let r = await db.tb_usuario.create({ nm_usuario: usuParam.nome, ds_login: usuParam.login, ds_senha: crypto.SHA256 (usuParam.senha).toString(crypto.enc.Base64) }) resp.send(r); } catch (e) { resp.send({ erro: 'Ocorreu um erro!'}) } }) app.get('/usuario', async (req, resp) => { try { let usuarios = await db.tb_usuario.findAll(); resp.send(usuarios); } catch (e) { resp.send({ erro: 'Ocorreu um erro!'}) } }) app.post('/chat', async (req, resp) => { try { let chat = req.body; let sala = await db.tb_sala.findOne({ where: { nm_sala: chat.sala.nome } }); let usu = await db.tb_usuario.findOne({ where: { nm_usuario: chat.usuario.nome } }) if (usu == null) return resp.send({ erro: 'Usuário não existe!' }); if (sala == null) return resp.send({ erro: 'Sala não existe!' }); if (!chat.mensagem || chat.mensagem.replace(/\n/g, '') == '') return resp.send({ erro: 'Mensagem é obrigatória!' }); let mensagem = { id_sala: sala.id_sala, id_usuario: usu.id_usuario, ds_mensagem: chat.mensagem, dt_mensagem: new Date() } let r = await db.tb_chat.create(mensagem); resp.send(r); } catch (e) { resp.send('Deu erro'); console.log(e.toString()); } }); app.get('/chat/:sala', async (req, resp) => { try { let sala = await db.tb_sala.findOne({ where: { nm_sala: req.params.sala } }); if (sala == null) return resp.send({ erro: 'Sala não existe!' }); let mensagens = await db.tb_chat.findAll({ where: { id_sala: sala.id_sala }, order: [['id_chat', 'desc']], include: ['tb_usuario', 'tb_sala'], }); resp.send(mensagens); } catch (e) { resp.send(e.toString()) } }) app.post('/login', async (req, resp) => { let login = req.body.usuario; let senha = req.body.senha; let cryptosenha = crypto.SHA256(senha).toString(crypto.enc.Base64); console.log(cryptosenha) var a = await db.tb_usuario.findOne( { where: { ds_login: login, ds_senha: cryptosenha } }) if (a == null) return resp.send({ erro:'Credencias Inválidas'}); delete a.ds_senha; resp.send(a); }); app.listen(process.env.PORT, x => console.log(`>> Server up at port ${process.env.PORT}`)) ```` ## conteudo ````jsx import { ToastContainer, toast } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import LoadingBar from 'react-top-loading-bar' import { ContainerConteudo } from './conteudo.styled' import { ChatButton, ChatInput, ChatTextArea } from '../../components/outros/inputs' import { useState, useRef } from 'react'; import { useHistory } from 'react-router-dom' import Cookies from 'js-cookie'; import Api from '../../service/api'; const api = new Api(); function LerUsuarioLogado(navigation) { let Logado = Cookies.get('usuario-logado'); if (Logado == null) navigation.push('/'); let UsuarioLogado = JSON.parse(Logado) return UsuarioLogado } export default function Conteudo() { const navigation = useHistory(); let UsuarioLogado = LerUsuarioLogado(navigation); const [chat, setChat] = useState([]); const [sala, setSala] = useState(''); const [usu, setUsu] = useState(UsuarioLogado.nm_usuario); const [msg, setMsg] = useState('') const loading = useRef(null); const validarResposta = (resp) => { //console.log(resp); if (!resp.erro) return true; toast.error(`${resp.erro}`); return false; } const carregarMensagens = async () => { loading.current.continuousStart(); const mensagens = await api.listarMensagens(sala); if (validarResposta(mensagens)) setChat(mensagens); loading.current.complete(); } const enviarMensagem = async () => { const resp = await api.inserirMensagem(sala, usu, msg); if (!validarResposta(resp)) return; toast.dark('💕 Mensagem enviada com sucesso!'); await carregarMensagens(); } const inserirUsuario = async () => { const resp = await api.inserirUsuario(usu); if (!validarResposta(resp)) return; toast.dark('💕 Usuário cadastrado!'); await carregarMensagens(); } const inserirSala = async () => { const resp = await api.inserirSala(sala); if (!validarResposta(resp)) return; toast.dark('💕 Sala cadastrada!'); await carregarMensagens(); } return ( <ContainerConteudo> <ToastContainer /> <LoadingBar color="red" ref={loading} /> <div className="container-form"> <div className="box-sala"> <div> <div className="label">Sala</div> <ChatInput value={sala} onChange={e => setSala(e.target.value)} /> </div> <div> <div className="label">Nick</div> <ChatInput value={usu} readOnly={true} /> </div> <div> <ChatButton onClick={inserirSala}> Criar </ChatButton> <ChatButton onClick={inserirUsuario}> Entrar </ChatButton> </div> </div> <div className="box-mensagem"> <div className="label">Mensagem</div> <ChatTextArea value={msg} onChange={e => setMsg(e.target.value)} /> <ChatButton onClick={enviarMensagem} className="btn-enviar"> Enviar </ChatButton> </div> </div> <div className="container-chat"> <img onClick={carregarMensagens} className="chat-atualizar" src="/assets/images/atualizar.png" alt="" /> <div className="chat"> {chat.map(x => <div key={x.id_chat}> <div className="chat-message"> <div>({new Date(x.dt_mensagem.replace('Z', '')).toLocaleTimeString()})</div> <div><b>{x.tb_usuario.nm_usuario}</b> fala para <b>Todos</b>:</div> <div> {x.ds_mensagem} </div> </div> </div> )} </div> </div> </ContainerConteudo> ) } ```` ## login ````jsx import { Container } from './styled' import { ChatButton, ChatInput } from '../../components/outros/inputs' import Cookies from 'js-cookie'; import { useHistory } from 'react-router-dom' import { ToastContainer, toast } from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import LoadingBar from 'react-top-loading-bar' import { useState, useRef } from 'react'; import Api from '../../service/api' const api = new Api(); export default function Login() { const [usuario, setUsuario] = useState(''); const [senha,setSenha] = useState(''); const navigation = useHistory() const loading = useRef(null); const logar = async () => { loading.current.continuousStart(); let r = await api.login(usuario,senha); console.log(r) if (r.erro) { toast.error(`${r.erro}`); loading.current.complete(); } else { Cookies.set('usuario-logado', JSON.stringify(r)) navigation.push('/chat') } } return ( <Container> <ToastContainer /> <LoadingBar color="red" ref={loading} /> <div className="box"> <div className="titulo"> <img src="/assets/images/logo-monkchat.png" alt="" /> <br /> MonkChat </div> </div> <div className="login"> <div className="container-form"> <div className="form-row"> <div className="title">Faça seu Login</div> </div> <div className="form-row"> <div> <div className="label">Login </div> <ChatInput value = {usuario} onChange={e => setUsuario(e.target.value) } style={{ border: '1px solid gray', fontSize: '1.5em' }} /> </div> <div> <div className="label">Senha </div> <ChatInput value = {senha} onChange={e => setSenha(e.target.value) } type="password" style={{ border: '1px solid gray', fontSize: '1.5em' }} /> </div> <div> <ChatButton onClick = {logar} style={{ fontSize: '1.2em'}}> Login </ChatButton> </div> </div> </div> </div> </Container> ) } ```` ## router ````jsx import { BrowserRouter, Switch, Route } from 'react-router-dom' import MonkChat from './pages/monkchat' import Login from './pages/login/index' export default function Routes() { return ( <BrowserRouter> <Switch> <Route path="/chat" exact={true} component={MonkChat} /> <Route path="/" exact={true} component={Login} /> </Switch> </BrowserRouter> ) } ````
{"metaMigratedAt":"2023-06-16T09:13:40.207Z","metaMigratedFrom":"Content","title":"Session: MonkChat","breaks":true,"contributors":"[{\"id\":\"0ba297e4-eafa-413a-9b17-c3ef1702e693\",\"add\":11747,\"del\":15}]"}
Expand menu