# 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;
}
}
```