@@ -12,18 +12,20 @@ import {
12
12
} from "react" ;
13
13
14
14
interface AuthContextType {
15
- user : User | null ;
16
- token : string | null ;
15
+ user : User | null | undefined ;
16
+ token : string | null | undefined ;
17
17
login : ( email : string , password : string ) => Promise < User | undefined > ;
18
18
logout : ( ) => Promise < void > ;
19
+ isLoading : boolean ;
19
20
}
20
21
21
22
const AuthContext = createContext < AuthContextType | undefined > ( undefined ) ;
22
23
23
24
const AuthProvider : React . FC < { children : ReactNode } > = ( { children } ) => {
24
25
const tokenKey = "jwtToken" ;
25
- const [ user , setUser ] = useState < User | null > ( null ) ;
26
- const [ token , setToken ] = useState < string | null > ( null ) ;
26
+ const [ user , setUser ] = useState < User | null > ( ) ;
27
+ const [ token , setToken ] = useState < string | null > ( ) ;
28
+ const [ isLoading , setIsLoading ] = useState < boolean > ( true ) ;
27
29
const router = useRouter ( ) ;
28
30
29
31
useEffect ( ( ) => {
@@ -32,7 +34,11 @@ const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
32
34
33
35
// Login using locally stored JWT token
34
36
useEffect ( ( ) => {
37
+ if ( token !== undefined ) {
38
+ setIsLoading ( false ) ;
39
+ }
35
40
if ( token ) {
41
+ setIsLoading ( true ) ;
36
42
fetch (
37
43
`${ userServiceUri ( window . location . hostname , AuthType . Public ) } /auth/verify-token` ,
38
44
{
@@ -45,10 +51,12 @@ const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
45
51
. then ( ( res ) => {
46
52
res . json ( ) . then ( ( result ) => {
47
53
setUser ( result . data ) ;
54
+ setIsLoading ( false ) ;
48
55
} ) ;
49
56
} )
50
57
. catch ( ( err ) => {
51
58
console . error ( err ) ;
59
+ setIsLoading ( false ) ;
52
60
} ) ;
53
61
}
54
62
} , [ token ] ) ;
@@ -88,14 +96,15 @@ const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
88
96
} ;
89
97
90
98
const logout = async ( ) => {
91
- setUser ( null ) ;
92
- setToken ( null ) ;
93
- localStorage . removeItem ( "jwtToken" ) ;
94
99
router . push ( "/" ) ;
100
+ localStorage . removeItem ( "jwtToken" ) ;
101
+ setUser ( undefined ) ;
102
+ setToken ( undefined ) ;
103
+ setIsLoading ( true ) ;
95
104
} ;
96
105
97
106
return (
98
- < AuthContext . Provider value = { { user, token, login, logout } } >
107
+ < AuthContext . Provider value = { { user, token, login, logout, isLoading } } >
99
108
{ children }
100
109
</ AuthContext . Provider >
101
110
) ;
0 commit comments