@@ -3,7 +3,14 @@ import FullScreenLoading from "@components/ui/FullScreenLoading";
3
3
import { useApiCall } from "@utils/api" ;
4
4
import { useIsMd } from "@utils/responsive" ;
5
5
import { getLatestNetbirdRelease } from "@utils/version" ;
6
- import React , { useContext , useEffect , useMemo , useRef , useState } from "react" ;
6
+ import React , {
7
+ useCallback ,
8
+ useContext ,
9
+ useEffect ,
10
+ useMemo ,
11
+ useRef ,
12
+ useState ,
13
+ } from "react" ;
7
14
import { useLocalStorage } from "@/hooks/useLocalStorage" ;
8
15
import { User } from "@/interfaces/User" ;
9
16
import type { NetbirdRelease } from "@/interfaces/Version" ;
@@ -32,13 +39,27 @@ export default function ApplicationProvider({ children }: Props) {
32
39
const userRequest = useApiCall < User [ ] > ( "/users" , true ) ;
33
40
const [ show , setShow ] = useState ( false ) ;
34
41
const requestCalled = useRef ( false ) ;
42
+ const maxTries = 3 ;
43
+
44
+ const populateCache = useCallback (
45
+ async ( tries = 0 ) => {
46
+ if ( tries >= maxTries ) {
47
+ setShow ( true ) ;
48
+ return Promise . reject ( ) ;
49
+ }
50
+ try {
51
+ await userRequest . get ( ) . then ( ( ) => setShow ( true ) ) ;
52
+ return Promise . resolve ( ) ;
53
+ } catch ( e ) {
54
+ setTimeout ( ( ) => populateCache ( tries + 1 ) , 500 ) ;
55
+ }
56
+ } ,
57
+ [ userRequest , setShow ] ,
58
+ ) ;
35
59
36
60
useEffect ( ( ) => {
37
61
if ( ! requestCalled . current ) {
38
- userRequest
39
- . get ( )
40
- . then ( ( ) => setShow ( true ) )
41
- . catch ( ( ) => setShow ( true ) ) ;
62
+ populateCache ( ) . then ( ) ;
42
63
requestCalled . current = true ;
43
64
}
44
65
// eslint-disable-next-line react-hooks/exhaustive-deps
0 commit comments