Improve auth flows

This commit is contained in:
augmentedpotato
2026-04-02 09:06:24 -06:00
parent 82935303ba
commit 4bd98ef06f
6 changed files with 300 additions and 39 deletions

View File

@@ -19,6 +19,28 @@ export function AuthProvider({ children }) {
const [token, setToken] = useState(null);
const [loading, setLoading] = useState(true);
const refreshUser = useCallback(async (providedToken) => {
const activeToken = providedToken ?? token;
if (!activeToken) {
setUser(null);
return null;
}
const userInfo = await fetchCurrentUser(activeToken);
if (!userInfo) {
localStorage.removeItem(TOKEN_KEY);
setToken(null);
setUser(null);
return null;
}
if (!token) {
setToken(activeToken);
}
setUser(userInfo);
return userInfo;
}, [token]);
useEffect(() => {
const stored = localStorage.getItem(TOKEN_KEY);
if (!stored) {
@@ -26,17 +48,14 @@ export function AuthProvider({ children }) {
return;
}
fetchCurrentUser(stored)
.then((data) => {
if (data) {
setToken(stored);
setUser(data);
}
else {
localStorage.removeItem(TOKEN_KEY);
}
}).catch(() => localStorage.removeItem(TOKEN_KEY)).finally(() => setLoading(false));}, []);
refreshUser(stored)
.catch(() => {
localStorage.removeItem(TOKEN_KEY);
setToken(null);
setUser(null);
})
.finally(() => setLoading(false));
}, [refreshUser]);
const login = useCallback(async (username, password) => {
const res = await fetch("/api/v1/auth/login", {
@@ -55,12 +74,10 @@ export function AuthProvider({ children }) {
localStorage.setItem(TOKEN_KEY, jwt);
setToken(jwt);
const userInfo = await fetchCurrentUser(jwt);
setUser(userInfo);
const userInfo = await refreshUser(jwt);
return userInfo;
}, []);
}, [refreshUser]);
const register = useCallback(async ({ username, password, email, fullName, phone }) => {
const res = await fetch("/api/v1/auth/register", {
@@ -79,11 +96,10 @@ export function AuthProvider({ children }) {
localStorage.setItem(TOKEN_KEY, jwt);
setToken(jwt);
const userInfo = await fetchCurrentUser(jwt);
setUser(userInfo);
const userInfo = await refreshUser(jwt);
return userInfo;
}, []);
}, [refreshUser]);
const logout = useCallback(() => {
localStorage.removeItem(TOKEN_KEY);
@@ -91,7 +107,7 @@ export function AuthProvider({ children }) {
setUser(null);}, []);
return (
<AuthContext.Provider value={{ user, token, loading, login, logout, register }}>
<AuthContext.Provider value={{ user, token, loading, login, logout, register, refreshUser }}>
{children}
</AuthContext.Provider>
);