Refactored AuthProvider and RefreshProvider to be simpler.
This commit is contained in:
parent
a3376a8cc1
commit
5d1def13db
@ -1,4 +1,4 @@
|
|||||||
import { createContext, PropsWithChildren, useContext, useReducer } from 'react'
|
import { createContext, PropsWithChildren, useContext, useState } from 'react'
|
||||||
import AccessToken from './types/AccessToken'
|
import AccessToken from './types/AccessToken'
|
||||||
|
|
||||||
export interface AuthContextType {
|
export interface AuthContextType {
|
||||||
@ -6,49 +6,17 @@ export interface AuthContextType {
|
|||||||
putToken: (token: AccessToken | null) => void
|
putToken: (token: AccessToken | null) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
interface AuthReducerState {
|
|
||||||
accessToken: AccessToken | null
|
|
||||||
}
|
|
||||||
|
|
||||||
const initialState: AuthReducerState = {
|
|
||||||
accessToken: null
|
|
||||||
}
|
|
||||||
|
|
||||||
type AuthReducerAction = PutTokenAction | ClearTokenAction
|
|
||||||
|
|
||||||
interface PutTokenAction {
|
|
||||||
tag: 'putToken'
|
|
||||||
accessToken: AccessToken
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ClearTokenAction {
|
|
||||||
tag: 'clearToken'
|
|
||||||
}
|
|
||||||
|
|
||||||
const authReducer = (_state: AuthReducerState, action: AuthReducerAction): AuthReducerState => {
|
|
||||||
switch (action.tag) {
|
|
||||||
case 'putToken':
|
|
||||||
return { accessToken: action.accessToken }
|
|
||||||
case 'clearToken':
|
|
||||||
return { accessToken: null }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const AuthContext = createContext<AuthContextType | null>(null)
|
const AuthContext = createContext<AuthContextType | null>(null)
|
||||||
|
|
||||||
export const AuthProvider = ({ children }: PropsWithChildren) => {
|
export const AuthProvider = ({ children }: PropsWithChildren) => {
|
||||||
const [state, dispatch] = useReducer(authReducer, initialState)
|
const [accessToken, setAccessToken] = useState<AccessToken | null>(null)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AuthContext.Provider
|
<AuthContext.Provider
|
||||||
value={{
|
value={{
|
||||||
accessToken: state.accessToken,
|
accessToken,
|
||||||
putToken: token => {
|
putToken: token => {
|
||||||
if (token === null) {
|
console.log(`token: ${token !== null ? token.token : null}`)
|
||||||
dispatch({ tag: 'clearToken' })
|
setAccessToken(token)
|
||||||
} else {
|
|
||||||
dispatch({ tag: 'putToken', accessToken: token })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { useRouter } from '@tanstack/react-router'
|
import { useRouter } from '@tanstack/react-router'
|
||||||
import { createContext, useContext, PropsWithChildren, useRef, useCallback } from 'react'
|
import { createContext, PropsWithChildren, useCallback, useContext, useRef } from 'react'
|
||||||
import { ApiError } from './api/ApiError'
|
import { ApiError } from './api/ApiError'
|
||||||
import refresh, { RefreshTokenError } from './api/refresh'
|
import refresh, { RefreshTokenError } from './api/refresh'
|
||||||
import { useAuth } from './AuthProvider'
|
import { useAuth } from './AuthProvider'
|
||||||
@ -25,7 +25,6 @@ const RefreshProvider = ({ children }: PropsWithChildren) => {
|
|||||||
const refreshing = useRef(false)
|
const refreshing = useRef(false)
|
||||||
|
|
||||||
const doRefresh: Refresh = useCallback(async () => {
|
const doRefresh: Refresh = useCallback(async () => {
|
||||||
putToken(null)
|
|
||||||
if (!refreshing.current) {
|
if (!refreshing.current) {
|
||||||
refreshing.current = true
|
refreshing.current = true
|
||||||
try {
|
try {
|
||||||
@ -53,11 +52,12 @@ const RefreshProvider = ({ children }: PropsWithChildren) => {
|
|||||||
} else if (error instanceof ApiError) {
|
} else if (error instanceof ApiError) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
}
|
}
|
||||||
|
putToken(null)
|
||||||
refreshing.current = false
|
refreshing.current = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}, [putToken, router])
|
}, [putToken])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RefreshContext.Provider
|
<RefreshContext.Provider
|
||||||
|
Loading…
Reference in New Issue
Block a user