@@ -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 ( `${ userServiceUri ( window . location . hostname ) } /auth/verify-token` , {
37
43
method : "GET" ,
38
44
headers : {
@@ -42,10 +48,12 @@ const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
42
48
. then ( ( res ) => {
43
49
res . json ( ) . then ( ( result ) => {
44
50
setUser ( result . data ) ;
51
+ setIsLoading ( false ) ;
45
52
} ) ;
46
53
} )
47
54
. catch ( ( err ) => {
48
55
console . error ( err ) ;
56
+ setIsLoading ( false ) ;
49
57
} ) ;
50
58
}
51
59
} , [ token ] ) ;
@@ -85,14 +93,15 @@ const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
85
93
} ;
86
94
87
95
const logout = async ( ) => {
88
- setUser ( null ) ;
89
- setToken ( null ) ;
90
- localStorage . removeItem ( "jwtToken" ) ;
91
96
router . push ( "/" ) ;
97
+ localStorage . removeItem ( "jwtToken" ) ;
98
+ setUser ( undefined ) ;
99
+ setToken ( undefined ) ;
100
+ setIsLoading ( true ) ;
92
101
} ;
93
102
94
103
return (
95
- < AuthContext . Provider value = { { user, token, login, logout } } >
104
+ < AuthContext . Provider value = { { user, token, login, logout, isLoading } } >
96
105
{ children }
97
106
</ AuthContext . Provider >
98
107
) ;
0 commit comments