| import { useCallback, useEffect, useMemo, useState } from 'react' |
| import { detectRuntimeEnv } from '../utils/runtimeEnv' |
|
|
| export function useAdminAuth({ isProduction, location, t }) { |
| const [message, setMessage] = useState(null) |
| const [token, setToken] = useState(null) |
| const [authChecking, setAuthChecking] = useState(true) |
|
|
| const isAdminRoute = location.pathname.startsWith('/admin') || isProduction |
| const runtimeEnv = useMemo(() => detectRuntimeEnv(), []) |
| const isVercel = runtimeEnv.isVercel |
|
|
| const showMessage = useCallback((type, text) => { |
| setMessage({ type, text }) |
| setTimeout(() => setMessage(null), 5000) |
| }, []) |
|
|
| const handleLogout = useCallback(() => { |
| setToken(null) |
| localStorage.removeItem('ds2api_token') |
| localStorage.removeItem('ds2api_token_expires') |
| sessionStorage.removeItem('ds2api_token') |
| sessionStorage.removeItem('ds2api_token_expires') |
| }, []) |
|
|
| const handleLogin = useCallback((newToken) => { |
| setToken(newToken) |
| }, []) |
|
|
| useEffect(() => { |
| if (!isAdminRoute) { |
| setAuthChecking(false) |
| return |
| } |
|
|
| const checkAuth = async () => { |
| const storedToken = localStorage.getItem('ds2api_token') || sessionStorage.getItem('ds2api_token') |
| const expiresAt = parseInt(localStorage.getItem('ds2api_token_expires') || sessionStorage.getItem('ds2api_token_expires') || '0') |
|
|
| if (storedToken && expiresAt > Date.now()) { |
| try { |
| const res = await fetch('/admin/verify', { |
| headers: { 'Authorization': `Bearer ${storedToken}` } |
| }) |
| if (res.ok) { |
| setToken(storedToken) |
| } else { |
| handleLogout() |
| } |
| } catch { |
| setToken(storedToken) |
| } |
| } |
| setAuthChecking(false) |
| } |
|
|
| checkAuth() |
| }, [handleLogout, isAdminRoute, t]) |
|
|
| return { |
| token, |
| authChecking, |
| message, |
| isAdminRoute, |
| isVercel, |
| showMessage, |
| handleLogin, |
| handleLogout, |
| } |
| } |
|
|