From bc8d95a912bb26a33ed922f179bbf22131fc1f53 Mon Sep 17 00:00:00 2001 From: Vinicius Souza Date: Fri, 1 Nov 2024 09:21:40 -0300 Subject: [PATCH] feat: save user data on successful sign in --- src/contexts/AuthContext.tsx | 23 ++++++++++++++++++++--- src/screens/SignUp.tsx | 19 +++++++++++++++---- src/storage/storageAuthToken.ts | 7 +++++++ src/storage/storageConfig.ts | 3 ++- 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 src/storage/storageAuthToken.ts diff --git a/src/contexts/AuthContext.tsx b/src/contexts/AuthContext.tsx index de87199..5247fd6 100644 --- a/src/contexts/AuthContext.tsx +++ b/src/contexts/AuthContext.tsx @@ -3,6 +3,7 @@ import { createContext, useEffect, useState } from 'react'; import { UserDTO } from '@dtos/UserDTO'; import { api } from '@services/api'; import { storageUserGet, storageUserRemove, storageUserSave } from '@storage/storageUser'; +import { storageAuthTokenSave } from '@storage/storageAuthToken'; type AuthContextData = { user: UserDTO; @@ -21,13 +22,29 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) { const [user, setUser] = useState({} as UserDTO); const [isLoadingUserStorageData, setIsLoadingUserStorageData] = useState(true); + async function storeUserAndToken(userData: UserDTO, token: string) { + try { + setIsLoadingUserStorageData(true); + + api.defaults.headers.common['Authorization'] = `Bearer ${token}`; + + setUser(userData); + await storageUserSave(userData); + await storageAuthTokenSave(token); + } catch (error) { + console.error(error); + throw error; + } finally { + setIsLoadingUserStorageData(false); + } + } + async function signIn(email: string, password: string) { try { const { data } = await api.post('/sessions', { email, password }); - if (data.user) { - setUser(data.user); - storageUserSave(data.user); + if (data.user && data.token) { + storeUserAndToken(data.user, data.token); } } catch (error) { console.error(error); diff --git a/src/screens/SignUp.tsx b/src/screens/SignUp.tsx index 592fcc2..7df37ee 100644 --- a/src/screens/SignUp.tsx +++ b/src/screens/SignUp.tsx @@ -1,3 +1,4 @@ +import { useState } from 'react'; import { Center, Heading, Image, ScrollView, Text, useToast, VStack } from '@gluestack-ui/themed'; import { useNavigation } from '@react-navigation/native'; import { Controller, useForm } from 'react-hook-form'; @@ -5,6 +6,7 @@ import * as yup from 'yup'; import { yupResolver } from '@hookform/resolvers/yup'; import { api } from '@services/api'; +import { useAuth } from '@hooks/useAuth'; import { AppError } from '@utils/AppError'; import BackgroundImg from '@assets/background.png'; @@ -34,8 +36,10 @@ const signUpSchema = yup.object({ }); export function SignUp() { + const [isLoading, setIsLoading] = useState(false); const navigation = useNavigation(); const toast = useToast(); + const { signIn } = useAuth(); const { control, @@ -47,15 +51,18 @@ export function SignUp() { async function handleSignUp({ name, email, password }: FormData) { try { - const response = await api.post('/users', { name, email, password }); - console.debug(response.data); + setIsLoading(true); + + await api.post('/users', { name, email, password }); + await signIn(email, password); } catch (error) { - console.info(error); + console.error(error); const isAppError = error instanceof AppError; const title = isAppError ? error.message : 'Não foi possível criar a conta. Tente novamente mais tarde.'; + setIsLoading(false); toast.show({ placement: 'top', render: ({ id }) => ( @@ -158,7 +165,11 @@ export function SignUp() { )} /> -