Fix issue where the first users cache is not populated (#366)

This commit is contained in:
Eduard Gert
2024-03-28 11:27:00 +01:00
committed by GitHub
parent 06fdbd8ec4
commit 80ce7d21b0

View File

@@ -3,7 +3,14 @@ import FullScreenLoading from "@components/ui/FullScreenLoading";
import { useApiCall } from "@utils/api"; import { useApiCall } from "@utils/api";
import { useIsMd } from "@utils/responsive"; import { useIsMd } from "@utils/responsive";
import { getLatestNetbirdRelease } from "@utils/version"; import { getLatestNetbirdRelease } from "@utils/version";
import React, { useContext, useEffect, useMemo, useRef, useState } from "react"; import React, {
useCallback,
useContext,
useEffect,
useMemo,
useRef,
useState,
} from "react";
import { useLocalStorage } from "@/hooks/useLocalStorage"; import { useLocalStorage } from "@/hooks/useLocalStorage";
import { User } from "@/interfaces/User"; import { User } from "@/interfaces/User";
import type { NetbirdRelease } from "@/interfaces/Version"; import type { NetbirdRelease } from "@/interfaces/Version";
@@ -32,13 +39,27 @@ export default function ApplicationProvider({ children }: Props) {
const userRequest = useApiCall<User[]>("/users", true); const userRequest = useApiCall<User[]>("/users", true);
const [show, setShow] = useState(false); const [show, setShow] = useState(false);
const requestCalled = useRef(false); const requestCalled = useRef(false);
const maxTries = 3;
const populateCache = useCallback(
async (tries = 0) => {
if (tries >= maxTries) {
setShow(true);
return Promise.reject();
}
try {
await userRequest.get().then(() => setShow(true));
return Promise.resolve();
} catch (e) {
setTimeout(() => populateCache(tries + 1), 500);
}
},
[userRequest, setShow],
);
useEffect(() => { useEffect(() => {
if (!requestCalled.current) { if (!requestCalled.current) {
userRequest populateCache().then();
.get()
.then(() => setShow(true))
.catch(() => setShow(true));
requestCalled.current = true; requestCalled.current = true;
} }
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps