import axios from '@/utils/axios'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import React from 'react'
export type Auth = {
user: { email: string }
isAuthenticated: boolean
login: (user: { email: string }) => Promise<void>
logout: () => Promise<void>
isLoading: boolean
}
const AuthContext = React.createContext<Auth | null>(null)
export function AuthProvider({ children }: { children: React.ReactNode }) {
const queryClient = useQueryClient()
const mutation = useMutation({
mutationFn: (user: { email: string }) =>
axios.post('auth/login', user).then((res) => res.data),
onSuccess: (data) => {
queryClient.setQueryData(['user'], data)
return data
},
})
const { data: user, isLoading } = useQuery({
queryKey: ['user'],
queryFn: async () => await axios.get('api/v1/user').then((res) => res.data),
retry: false,
})
const isAuthenticated = !!user
const login = async (user: { email: string }) => {
await mutation.mutateAsync(user).then(async (data) => {
// await queryClient.invalidateQueries({ queryKey: ['user'] })
await queryClient.setQueryData(['user'], data)
})
}
console.log('user', user)
const logout = async () => {
await axios
.post('auth/logout')
.then(async () => {
await queryClient.setQueryData(['user'], null)
// await queryClient.invalidateQueries({ queryKey: ['user'] })
})
.catch(async () => {
await queryClient.setQueryData(['user'], null)
// await queryClient.invalidateQueries({ queryKey: ['user'] })
})
}
return (
<AuthContext.Provider
value={{ isAuthenticated, user, login, logout, isLoading }}
>
{children}
</AuthContext.Provider>
)
}
export function useAuth() {
const context = React.useContext(AuthContext)
if (!context) {
throw new Error('useAuth must be used within an AuthProvider')
}
return context
}
import axios from '@/utils/axios'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import React from 'react'
export type Auth = {
user: { email: string }
isAuthenticated: boolean
login: (user: { email: string }) => Promise<void>
logout: () => Promise<void>
isLoading: boolean
}
const AuthContext = React.createContext<Auth | null>(null)
export function AuthProvider({ children }: { children: React.ReactNode }) {
const queryClient = useQueryClient()
const mutation = useMutation({
mutationFn: (user: { email: string }) =>
axios.post('auth/login', user).then((res) => res.data),
onSuccess: (data) => {
queryClient.setQueryData(['user'], data)
return data
},
})
const { data: user, isLoading } = useQuery({
queryKey: ['user'],
queryFn: async () => await axios.get('api/v1/user').then((res) => res.data),
retry: false,
})
const isAuthenticated = !!user
const login = async (user: { email: string }) => {
await mutation.mutateAsync(user).then(async (data) => {
// await queryClient.invalidateQueries({ queryKey: ['user'] })
await queryClient.setQueryData(['user'], data)
})
}
console.log('user', user)
const logout = async () => {
await axios
.post('auth/logout')
.then(async () => {
await queryClient.setQueryData(['user'], null)
// await queryClient.invalidateQueries({ queryKey: ['user'] })
})
.catch(async () => {
await queryClient.setQueryData(['user'], null)
// await queryClient.invalidateQueries({ queryKey: ['user'] })
})
}
return (
<AuthContext.Provider
value={{ isAuthenticated, user, login, logout, isLoading }}
>
{children}
</AuthContext.Provider>
)
}
export function useAuth() {
const context = React.useContext(AuthContext)
if (!context) {
throw new Error('useAuth must be used within an AuthProvider')
}
return context
}