Files
ds2api/webui/src/app/useAdminAuth.js

71 lines
2.2 KiB
JavaScript

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