Fix bug in UserContext.jsx
This commit is contained in:
@@ -7,8 +7,9 @@ export const UserContext = createContext({});
|
|||||||
export const UserProvider = ({ children }) => {
|
export const UserProvider = ({ children }) => {
|
||||||
|
|
||||||
const [sessionToken, setSessionToken] = useState(localStorage.getItem("sessionToken"));
|
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 [user, setUser] = useState(null);
|
||||||
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
const updateSessionToken = (sessionToken) => {
|
const updateSessionToken = (sessionToken) => {
|
||||||
setSessionToken(sessionToken);
|
setSessionToken(sessionToken);
|
||||||
@@ -20,8 +21,11 @@ export const UserProvider = ({ children }) => {
|
|||||||
try {
|
try {
|
||||||
const response = await getRequest("setup/status");
|
const response = await getRequest("setup/status");
|
||||||
setIsSetupCompleted(response?.first_user_exists);
|
setIsSetupCompleted(response?.first_user_exists);
|
||||||
|
return response?.first_user_exists;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(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 {
|
try {
|
||||||
const userObj = await getRequest("accounts/me");
|
const userObj = await getRequest("accounts/me");
|
||||||
setUser(userObj);
|
setUser(userObj);
|
||||||
|
// If login is successful, setup must be completed
|
||||||
|
if (isSetupCompleted === null) {
|
||||||
|
setIsSetupCompleted(true);
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error.message === "Unauthorized") {
|
if (error.message === "Unauthorized") {
|
||||||
setSessionToken(null);
|
setSessionToken(null);
|
||||||
localStorage.removeItem("sessionToken");
|
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) {
|
} catch (e) {
|
||||||
// ignore
|
// 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(() => {
|
useEffect(() => {
|
||||||
@@ -59,8 +81,44 @@ export const UserProvider = ({ children }) => {
|
|||||||
}, [location]);
|
}, [location]);
|
||||||
|
|
||||||
useEffect(() => {
|
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 (
|
return (
|
||||||
<UserContext.Provider value={{ updateSessionToken, user, sessionToken, isSetupCompleted, login, logout }}>
|
<UserContext.Provider value={{ updateSessionToken, user, sessionToken, isSetupCompleted, login, logout }}>
|
||||||
|
Reference in New Issue
Block a user