import posthog from "posthog-js"; import React from "react"; import OpenHands from "#/api/open-hands"; import { removeGitHubTokenHeader as removeOpenHandsGitHubTokenHeader, setGitHubTokenHeader as setOpenHandsGitHubTokenHeader, } from "#/api/open-hands-axios"; import { setAuthTokenHeader as setGitHubAuthTokenHeader, removeAuthTokenHeader as removeGitHubAuthTokenHeader, setupAxiosInterceptors as setupGithubAxiosInterceptors, } from "#/api/github-axios-instance"; interface AuthContextType { gitHubToken: string | null; setUserId: (userId: string) => void; setGitHubToken: (token: string | null) => void; clearGitHubToken: () => void; refreshToken: () => Promise; logout: () => void; } const AuthContext = React.createContext(undefined); function AuthProvider({ children }: React.PropsWithChildren) { const [gitHubTokenState, setGitHubTokenState] = React.useState( () => localStorage.getItem("ghToken"), ); const [userIdState, setUserIdState] = React.useState( () => localStorage.getItem("userId") || "", ); const clearGitHubToken = () => { setGitHubTokenState(null); setUserIdState(""); localStorage.removeItem("ghToken"); localStorage.removeItem("userId"); removeOpenHandsGitHubTokenHeader(); removeGitHubAuthTokenHeader(); }; const setGitHubToken = (token: string | null) => { setGitHubTokenState(token); if (token) { localStorage.setItem("ghToken", token); setOpenHandsGitHubTokenHeader(token); setGitHubAuthTokenHeader(token); } else { clearGitHubToken(); } }; const setUserId = (userId: string) => { setUserIdState(userIdState); localStorage.setItem("userId", userId); }; const logout = () => { clearGitHubToken(); posthog.reset(); }; const refreshToken = async (): Promise => { const config = await OpenHands.getConfig(); if (config.APP_MODE !== "saas" || !gitHubTokenState) { return false; } const newToken = await OpenHands.refreshToken(config.APP_MODE, userIdState); if (newToken) { setGitHubToken(newToken); return true; } clearGitHubToken(); return false; }; React.useEffect(() => { const storedGitHubToken = localStorage.getItem("ghToken"); const userId = localStorage.getItem("userId") || ""; setGitHubToken(storedGitHubToken); setUserId(userId); const setupIntercepter = async () => { const config = await OpenHands.getConfig(); setupGithubAxiosInterceptors(config.APP_MODE, refreshToken, logout); }; setupIntercepter(); }, []); const value = React.useMemo( () => ({ gitHubToken: gitHubTokenState, setGitHubToken, setUserId, clearGitHubToken, refreshToken, logout, }), [gitHubTokenState], ); return {children}; } function useAuth() { const context = React.useContext(AuthContext); if (context === undefined) { throw new Error("useAuth must be used within a AuthProvider"); } return context; } export { AuthProvider, useAuth };