# Session: Monkchat II **Autor**: Elias de Freitas Cavalcante **Número**: 12 **Turma**: INFO C **- Implementar a tela de Login** **- Implementar acesso apenas a usuários logados** **- Implementar segurança com criptografia na tela de login** **Login e Implementar acesso apenas a usuários logados** ```htmlmixed= import { Container } from './styled' import { ChatButton, ChatInput } from '../../components/outros/inputs' import { useState, useRef } from 'react' import { useHistory } from 'react-router-dom' import Api from '../../service/api' import Cookies from 'js-cookie' 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.constinuousStart(); let r = await api.login (usuario, senha); if (r.erro){ toast.erro(`${r.erro}`) loading.current.complete(); } else{ Cookies.set('usuario-logado', true); navigation.push('/chat') } } return ( <Container> <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> ) } 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 Cookies from 'js-cookie' import { useHistory } from 'react-router-dom' import Api from '../../service/api'; const api = new Api(); export default function Conteudo() { const [chat, setChat] = useState([]); const [sala, setSala] = useState(''); const [usu, setUsu] = useState(''); const [msg, setMsg] = useState('') const loading = useRef(null); const navigation = useHistory(); let usuarioLogado = Cookie.get('usuario-logado'); if (usuarioLogado == null) navigation.push('/'); 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} onChange={e => setUsu(e.target.value)} /> </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> ) } ``` **Implementar segurança com criptografia na tela de login** ```htmlmixed= import axios from 'axios' const api = axios.create({ baseURL: 'http://localhost:3030' }) export default class Api { async listarMensagens(idSala) { let r = await api.get(`/chat/${idSala}`); return r.data; } async inserirMensagem(nomeSala, nomeUsuario, mensagem) { let chat = { sala: { nome: nomeSala }, usuario: { nome: nomeUsuario }, mensagem: mensagem } let r = await api.post(`/chat`, chat); return r.data; } async inserirSala(sala) { let r = await api.post(`/sala/`, { nome: sala }); return r.data; } async inserirUsuario(usuario) { let r = await api.post(`/usuario/`, { nome: usuario }); return r.data; } async login(usuario, senha){ let r = await api.post('/login', { usuario: usuario, senha: senha }) return r.data; } } ```
{"metaMigratedAt":"2023-06-16T09:18:00.633Z","metaMigratedFrom":"Content","title":"Session: Monkchat II","breaks":true,"contributors":"[{\"id\":\"330b3204-61c5-4231-8ab3-e59d5589a829\",\"add\":8098,\"del\":0}]"}
Expand menu