From ba3643b3faff9e70592eb3dd04bb912bf54dcadb Mon Sep 17 00:00:00 2001 From: Matheusafonsouza Date: Mon, 9 Dec 2024 00:29:19 -0300 Subject: [PATCH] feat: fix some issues Co-authored-by: Mateus Maia Co-authored-by: Matheus Monteiro --- index.html | 4 +-- public/logo.png | Bin 0 -> 36864 bytes public/vite.svg | 1 - src/App.tsx | 1 + src/PrivateRoute.tsx | 6 ++--- src/hooks/useApi/index.tsx | 20 +++++++++----- src/hooks/useAuth.tsx | 21 ++++++++++----- .../Profile/DeleteProfileDialog/index.tsx | 10 +++---- .../ProfileEdit/ProfileEditForm/index.tsx | 25 ++++++++---------- src/pages/SignIn/SignInForm/index.tsx | 6 ++--- src/pages/SignIn/index.tsx | 10 +++++++ src/pages/SignUp/SignUpForm/index.tsx | 6 ++--- src/pages/SignUp/index.tsx | 10 +++++++ test/App.spec.tsx | 4 --- 14 files changed, 76 insertions(+), 48 deletions(-) create mode 100644 public/logo.png delete mode 100644 public/vite.svg diff --git a/index.html b/index.html index a094d6a..63f06ad 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - + - Vite + React + TS + Livro Livre diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..90ec9ab1409131c9185c7b852255b3b092fc12f0 GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/public/vite.svg b/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 95972e6..7e8063c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -22,6 +22,7 @@ function App() { } /> + } /> } /> } /> } /> diff --git a/src/PrivateRoute.tsx b/src/PrivateRoute.tsx index caf38f0..190837a 100644 --- a/src/PrivateRoute.tsx +++ b/src/PrivateRoute.tsx @@ -4,12 +4,12 @@ import { useEffect } from "react"; const PrivateRoute = ({ children }: { children: any }) => { const navigate = useNavigate(); - const { token } = useAuth(); + const { isAuthenticated } = useAuth(); useEffect(() => { - if (token) return; + if (isAuthenticated) return; navigate('/login'); - }) + }, [isAuthenticated]) return children; } diff --git a/src/hooks/useApi/index.tsx b/src/hooks/useApi/index.tsx index 4b01ea4..c2a3883 100644 --- a/src/hooks/useApi/index.tsx +++ b/src/hooks/useApi/index.tsx @@ -28,7 +28,7 @@ const useApi = () => { ); return { - getProfile: (token: string): Promise<{ data: User }> => { + getProfile: (token: string | null): Promise<{ data: User }> => { return new Promise((resolve) => { api .get('/auth/profile', { @@ -91,29 +91,37 @@ const useApi = () => { .catch((err) => resolve(getDefaultErrorUseAPIMessage(err))); }); }, - editProfile: async (id: string, data: { + editProfile: async (data: { firstName: string; lastName: string; email: string; phone: string; oldPassword?: string newPassword?: string - }): Promise<{ data: { + }, token: string | null): Promise<{ data: { id: string; } }> => { return new Promise((resolve) => { api - .put(`/users/${id}`, data) + .put('/users', data, { + headers: { + Authorization: `Bearer ${token}`, + }, + }) .then((res) => resolve(res)) .catch((err) => resolve(getDefaultErrorUseAPIMessage(err))); }); }, - deleteProfile: async (id: string): Promise<{ data: { + deleteProfile: async (token: string | null): Promise<{ data: { id: string; } }> => { return new Promise((resolve) => { api - .delete(`/users/${id}`) + .delete('/users', { + headers: { + Authorization: `Bearer ${token}`, + }, + }) .then((res) => resolve(res)) .catch((err) => resolve(getDefaultErrorUseAPIMessage(err))); }); diff --git a/src/hooks/useAuth.tsx b/src/hooks/useAuth.tsx index 9f295cd..a7d9887 100644 --- a/src/hooks/useAuth.tsx +++ b/src/hooks/useAuth.tsx @@ -4,6 +4,7 @@ import { createContext, useState, useContext, ReactNode } from 'react'; import useApi from './useApi'; import { toaster } from '../components/ui/toaster'; +import { User } from '../interfaces/user'; interface SignUpParams { firstName: string; @@ -33,9 +34,10 @@ type AuthContextType = { signOut: () => void; signUp: (userToSignUp: SignUpParams) => Promise; signIn: (userToSignIn: SignInParams) => Promise; - editProfile: (id: string, profileToEdit: EditProfileParams) => Promise; + editProfile: (profileToEdit: EditProfileParams) => Promise; recoverPassword: (email: string) => Promise; - changePassword: (password: string, token: string) => Promise; + changePassword: (password: string, mailToken: string) => Promise; + getProfile: () => Promise; }; const AuthContext = createContext({} as AuthContextType); @@ -47,6 +49,7 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { editProfile: authEditProfile, recoverPassword: authRecoverPassword, changePassword: authChangePassword, + getProfile: authGetProfile, } = useApi(); const localToken = @@ -91,6 +94,11 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { return true; } + async function getProfile(): Promise { + const { data } = await authGetProfile(token); + return data; + } + async function recoverPassword(email: string): Promise { const { data } = await authRecoverPassword(email); if (data.success) { @@ -108,8 +116,8 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { return false; } - async function changePassword(password: string, token: string): Promise { - const { data } = await authChangePassword(password, token); + async function changePassword(password: string, mailToken: string): Promise { + const { data } = await authChangePassword(password, mailToken); if (data.success) { toaster.create({ title: 'Senha alterada com sucesso! Você será redirecionado para o login...', @@ -125,8 +133,8 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { return false; } - async function editProfile(id: string, profileToEdit: EditProfileParams): Promise { - const { data } = await authEditProfile(id, profileToEdit); + async function editProfile(profileToEdit: EditProfileParams): Promise { + const { data } = await authEditProfile(profileToEdit, token); if (data.id) { toaster.create({ title: 'Perfil editado com sucesso!', @@ -160,6 +168,7 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { signIn, recoverPassword, changePassword, + getProfile, }} > {children} diff --git a/src/pages/Profile/DeleteProfileDialog/index.tsx b/src/pages/Profile/DeleteProfileDialog/index.tsx index 7011fc9..528e4f2 100644 --- a/src/pages/Profile/DeleteProfileDialog/index.tsx +++ b/src/pages/Profile/DeleteProfileDialog/index.tsx @@ -17,14 +17,12 @@ import { useNavigate } from "react-router" const DeleteProfileDialog = () => { const navigate = useNavigate(); - const { deleteProfile, getProfile } = useApi(); - const { token, signOut } = useAuth(); + const { deleteProfile } = useApi(); + const { signOut, getProfile } = useAuth(); const handleDelete = async () => { - console.log('maia', 123) - if (!token) return; - const { data } = await getProfile(token); - await deleteProfile(data.id); + const profile = await getProfile(); + await deleteProfile(profile.id); signOut(); navigate('/login'); } diff --git a/src/pages/ProfileEdit/ProfileEditForm/index.tsx b/src/pages/ProfileEdit/ProfileEditForm/index.tsx index 4109dd9..9c3b8ed 100644 --- a/src/pages/ProfileEdit/ProfileEditForm/index.tsx +++ b/src/pages/ProfileEdit/ProfileEditForm/index.tsx @@ -4,7 +4,6 @@ import { Input, Stack } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; import { PasswordInput } from '../../../components/ui/password-input'; import { Button } from '../../../components/ui/button'; -import useApi from '../../../hooks/useApi'; import { Field } from '../../../components/ui/field'; interface FormValues { @@ -18,7 +17,6 @@ interface FormValues { } function SignUpForm() { - const [userId, setUserId] = useState(''); const [loading, setLoading] = useState(false); const { @@ -27,19 +25,18 @@ function SignUpForm() { setValue, watch, formState: { errors, isValid }, + trigger, } = useForm(); - const { editProfile, token } = useAuth(); - const { getProfile } = useApi(); + const { editProfile, getProfile } = useAuth(); const getUserData = async () => { - if (!token) return; - const { data } = await getProfile(token); - setValue('firstName', data.firstName); - setValue('lastName', data.lastName); - setValue('email', data.email); - setValue('phone', data.phone); - setUserId(data.id) + const profile = await getProfile(); + setValue('firstName', profile.firstName); + setValue('lastName', profile.lastName); + setValue('email', profile.email); + setValue('phone', profile.phone); + trigger(); } useEffect(() => { @@ -48,7 +45,7 @@ function SignUpForm() { const onSubmit = handleSubmit(async (data: FormValues) => { setLoading(true); - await editProfile(userId, { + await editProfile({ firstName: data.firstName, lastName: data.lastName, email: data.email, @@ -111,14 +108,14 @@ function SignUpForm() { value === watch('newPassword') || 'As senhas não coincidem.', })} /> diff --git a/src/pages/SignIn/SignInForm/index.tsx b/src/pages/SignIn/SignInForm/index.tsx index 1725a6d..056b346 100644 --- a/src/pages/SignIn/SignInForm/index.tsx +++ b/src/pages/SignIn/SignInForm/index.tsx @@ -22,7 +22,7 @@ function SignInForm() { formState: { errors, isValid }, } = useForm(); - const { signIn, token } = useAuth(); + const { signIn, isAuthenticated } = useAuth(); const onSubmit = handleSubmit(async (data: FormValues) => { setLoading(true); @@ -34,9 +34,9 @@ function SignInForm() { }) useEffect(() => { - if (!token) return; + if (!isAuthenticated) return; navigate('/inicio'); - }, [token]) + }, [isAuthenticated]) return (
diff --git a/src/pages/SignIn/index.tsx b/src/pages/SignIn/index.tsx index 42de716..c6c0379 100644 --- a/src/pages/SignIn/index.tsx +++ b/src/pages/SignIn/index.tsx @@ -2,8 +2,18 @@ import { Box, Center, Stack } from '@chakra-ui/react'; import SignInForm from './SignInForm'; import SignUpButton from './SignUpButton'; import SignInHeader from './SignInHeader'; +import { useNavigate } from 'react-router'; +import { useAuth } from '../../hooks/useAuth'; +import { useEffect } from 'react'; function SignIn() { + const navigate = useNavigate(); + const { isAuthenticated } = useAuth(); + + useEffect(() => { + if (isAuthenticated) navigate('/inicio'); + }, [isAuthenticated]) + return (
diff --git a/src/pages/SignUp/SignUpForm/index.tsx b/src/pages/SignUp/SignUpForm/index.tsx index e87316e..3a8ce94 100644 --- a/src/pages/SignUp/SignUpForm/index.tsx +++ b/src/pages/SignUp/SignUpForm/index.tsx @@ -26,7 +26,7 @@ function SignUpForm() { formState: { errors, isValid }, } = useForm(); - const { signUp, token } = useAuth(); + const { signUp, isAuthenticated } = useAuth(); const onSubmit = handleSubmit(async (data: FormValues) => { setLoading(true); @@ -41,9 +41,9 @@ function SignUpForm() { }) useEffect(() => { - if (!token) return; + if (!isAuthenticated) return; navigate('/inicio'); - }, [token]) + }, [isAuthenticated]) return ( diff --git a/src/pages/SignUp/index.tsx b/src/pages/SignUp/index.tsx index 887199f..ae4efae 100644 --- a/src/pages/SignUp/index.tsx +++ b/src/pages/SignUp/index.tsx @@ -2,8 +2,18 @@ import { Box, Center, Stack } from '@chakra-ui/react'; import SignUpForm from './SignUpForm'; import LoginButton from './LoginButton'; import SignUpHeader from './SignUpHeader'; +import { useAuth } from '../../hooks/useAuth'; +import { useNavigate } from 'react-router'; +import { useEffect } from 'react'; function SignUp() { + const navigate = useNavigate(); + const { isAuthenticated } = useAuth(); + + useEffect(() => { + if (isAuthenticated) navigate('/inicio'); + }, [isAuthenticated]) + return (
diff --git a/test/App.spec.tsx b/test/App.spec.tsx index 0301943..9fa2ca5 100644 --- a/test/App.spec.tsx +++ b/test/App.spec.tsx @@ -1,9 +1,5 @@ -import React from "react"; import '@testing-library/jest-dom' -import { render } from "@testing-library/react" -import App from "../src/App" test("Renders the main page", () => { - render() expect(true).toBeTruthy() })