Fix bug in UserContext.jsx

This commit is contained in:
Mathias Wagner
2025-09-09 13:32:24 +02:00
parent 19e0407dbd
commit 0e82a40d66

View File

@@ -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 (
<div style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
height: '100vh',
background: 'var(--bg)',
color: 'var(--text-dim)'
}}>
Loading...
</div>
);
}
return (
<UserContext.Provider value={{ updateSessionToken, user, sessionToken, isSetupCompleted, login, logout }}>