|
import { useState, useEffect } from "react"; |
|
import { useLocation, useNavigate } from "react-router-dom"; |
|
import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "@huggingface/hub"; |
|
import { HF_CONFIG } from "../config/auth"; |
|
|
|
async function fetchUserInfo(token) { |
|
const response = await fetch("https://huggingface.co/api/whoami-v2", { |
|
headers: { |
|
Authorization: `Bearer ${token}`, |
|
}, |
|
}); |
|
if (!response.ok) { |
|
throw new Error("Failed to fetch user info"); |
|
} |
|
return response.json(); |
|
} |
|
|
|
export function useAuth() { |
|
const [isAuthenticated, setIsAuthenticated] = useState(false); |
|
const [user, setUser] = useState(null); |
|
const [loading, setLoading] = useState(true); |
|
const [error, setError] = useState(null); |
|
const location = useLocation(); |
|
const navigate = useNavigate(); |
|
|
|
|
|
useEffect(() => { |
|
let mounted = true; |
|
const initAuth = async () => { |
|
try { |
|
console.group("Auth Initialization"); |
|
setLoading(true); |
|
|
|
|
|
let oauthResult = await oauthHandleRedirectIfPresent(); |
|
|
|
|
|
if (!oauthResult) { |
|
const storedAuth = localStorage.getItem(HF_CONFIG.STORAGE_KEY); |
|
if (storedAuth) { |
|
try { |
|
oauthResult = JSON.parse(storedAuth); |
|
console.log("Found existing auth"); |
|
const userInfo = await fetchUserInfo(oauthResult.access_token); |
|
if (mounted) { |
|
setIsAuthenticated(true); |
|
setUser({ |
|
username: userInfo.name, |
|
token: oauthResult.access_token, |
|
}); |
|
} |
|
} catch (err) { |
|
console.log("Invalid stored auth data, clearing...", err); |
|
localStorage.removeItem(HF_CONFIG.STORAGE_KEY); |
|
if (mounted) { |
|
setIsAuthenticated(false); |
|
setUser(null); |
|
} |
|
} |
|
} |
|
} else { |
|
console.log("Processing OAuth redirect"); |
|
const token = oauthResult.accessToken; |
|
const userInfo = await fetchUserInfo(token); |
|
|
|
const authData = { |
|
access_token: token, |
|
username: userInfo.name, |
|
}; |
|
|
|
localStorage.setItem(HF_CONFIG.STORAGE_KEY, JSON.stringify(authData)); |
|
|
|
if (mounted) { |
|
setIsAuthenticated(true); |
|
setUser({ |
|
username: userInfo.name, |
|
token: token, |
|
}); |
|
} |
|
|
|
|
|
const returnTo = localStorage.getItem("auth_return_to"); |
|
if (returnTo) { |
|
navigate(returnTo); |
|
localStorage.removeItem("auth_return_to"); |
|
} |
|
} |
|
} catch (err) { |
|
console.error("Auth initialization error:", err); |
|
if (mounted) { |
|
setError(err.message); |
|
setIsAuthenticated(false); |
|
setUser(null); |
|
} |
|
} finally { |
|
if (mounted) { |
|
setLoading(false); |
|
} |
|
console.groupEnd(); |
|
} |
|
}; |
|
|
|
initAuth(); |
|
|
|
return () => { |
|
mounted = false; |
|
}; |
|
}, [navigate, location.pathname]); |
|
|
|
const login = async () => { |
|
try { |
|
console.group("Login Process"); |
|
setLoading(true); |
|
|
|
|
|
const currentRoute = window.location.hash.replace("#", "") || "/"; |
|
localStorage.setItem("auth_return_to", currentRoute); |
|
|
|
|
|
const redirectUrl = |
|
window.location.hostname === "localhost" || |
|
window.location.hostname === "127.0.0.1" |
|
? HF_CONFIG.DEV_URL |
|
: HF_CONFIG.PROD_URL; |
|
|
|
console.log("Using redirect URL:", redirectUrl); |
|
|
|
|
|
const loginUrl = await oauthLoginUrl({ |
|
clientId: HF_CONFIG.CLIENT_ID, |
|
redirectUrl, |
|
scope: HF_CONFIG.SCOPE, |
|
}); |
|
|
|
window.location.href = loginUrl + "&prompt=consent"; |
|
|
|
console.groupEnd(); |
|
} catch (err) { |
|
console.error("Login error:", err); |
|
setError(err.message); |
|
setLoading(false); |
|
console.groupEnd(); |
|
} |
|
}; |
|
|
|
const logout = () => { |
|
console.group("Logout Process"); |
|
setLoading(true); |
|
try { |
|
console.log("Clearing auth data..."); |
|
localStorage.removeItem(HF_CONFIG.STORAGE_KEY); |
|
localStorage.removeItem("auth_return_to"); |
|
setIsAuthenticated(false); |
|
setUser(null); |
|
console.log("Logged out successfully"); |
|
} catch (err) { |
|
console.error("Logout error:", err); |
|
setError(err.message); |
|
} finally { |
|
setLoading(false); |
|
console.groupEnd(); |
|
} |
|
}; |
|
|
|
return { |
|
isAuthenticated, |
|
user, |
|
loading, |
|
error, |
|
login, |
|
logout, |
|
}; |
|
} |
|
|