| 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, |
| }; |
| } |
|
|