diff --git a/webui/src/common/contexts/UserContext.jsx b/webui/src/common/contexts/UserContext.jsx index 9fd293c..26d0c78 100644 --- a/webui/src/common/contexts/UserContext.jsx +++ b/webui/src/common/contexts/UserContext.jsx @@ -7,8 +7,9 @@ export const UserContext = createContext({}); export const UserProvider = ({ children }) => { const [sessionToken, setSessionToken] = useState(localStorage.getItem("sessionToken")); - const [isSetupCompleted, setIsSetupCompleted] = useState(false); + const [isSetupCompleted, setIsSetupCompleted] = useState(null); // null = unknown, true/false = known const [user, setUser] = useState(null); + const [isLoading, setIsLoading] = useState(true); const updateSessionToken = (sessionToken) => { setSessionToken(sessionToken); @@ -20,8 +21,11 @@ export const UserProvider = ({ children }) => { try { const response = await getRequest("setup/status"); setIsSetupCompleted(response?.first_user_exists); + return response?.first_user_exists; } catch (error) { console.error(error); + setIsSetupCompleted(false); // Default to setup mode if we can't check + return false; } }; @@ -29,11 +33,20 @@ export const UserProvider = ({ children }) => { try { const userObj = await getRequest("accounts/me"); setUser(userObj); + // If login is successful, setup must be completed + if (isSetupCompleted === null) { + setIsSetupCompleted(true); + } } catch (error) { if (error.message === "Unauthorized") { setSessionToken(null); localStorage.removeItem("sessionToken"); + setUser(null); + // Check setup status when unauthorized + await checkFirstTimeSetup(); } + } finally { + setIsLoading(false); } }; @@ -43,7 +56,16 @@ export const UserProvider = ({ children }) => { } catch (e) { // ignore } - window.location.reload(); + + // Clear user state + setUser(null); + setSessionToken(null); + localStorage.removeItem("sessionToken"); + + // Re-check setup status after logout + setIsLoading(true); + await checkFirstTimeSetup(); + setIsLoading(false); }; useEffect(() => { @@ -59,8 +81,44 @@ export const UserProvider = ({ children }) => { }, [location]); useEffect(() => { - sessionToken ? login() : checkFirstTimeSetup(); - }, []); + const initializeAuth = async () => { + setIsLoading(true); + + if (sessionToken) { + // Try to login with existing token + await login(); + } else { + // No token, check setup status + await checkFirstTimeSetup(); + setIsLoading(false); + } + }; + + initializeAuth(); + }, []); // Only run once on mount + + // Handle session token changes + useEffect(() => { + if (sessionToken && user === null && !isLoading) { + login(); + } + }, [sessionToken]); + + // Show loading state while determining auth status + if (isLoading || isSetupCompleted === null) { + return ( +