mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-06 01:15:29 +08:00
71 lines
2.2 KiB
JavaScript
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,
|
|
}
|
|
}
|