Spaces:
Sleeping
Sleeping
| "use client"; | |
| import { useEffect, useState } from "react"; | |
| import { usePathname, useRouter } from "next/navigation"; | |
| export default function AuthCheck({ children }: { children: React.ReactNode }) { | |
| const [isAuthorized, setIsAuthorized] = useState(false); | |
| const [isLoading, setIsLoading] = useState(true); | |
| const router = useRouter(); | |
| const pathname = usePathname(); | |
| useEffect(() => { | |
| const initDb = async () => { | |
| try { | |
| await fetch("/api/init"); | |
| } catch (error) { | |
| console.error("初始化数据库失败:", error); | |
| } | |
| }; | |
| initDb(); | |
| }, []); | |
| useEffect(() => { | |
| const checkAuth = async () => { | |
| if (pathname === "/token") { | |
| setIsLoading(false); | |
| setIsAuthorized(true); | |
| return; | |
| } | |
| const token = localStorage.getItem("access_token"); | |
| if (!token) { | |
| router.push("/token"); | |
| return; | |
| } | |
| try { | |
| const res = await fetch("/api/v1/config", { | |
| headers: { | |
| Authorization: `Bearer ${token}`, | |
| }, | |
| }); | |
| if (!res.ok) { | |
| localStorage.removeItem("access_token"); | |
| router.push("/token"); | |
| return; | |
| } | |
| setIsAuthorized(true); | |
| } catch (error) { | |
| localStorage.removeItem("access_token"); | |
| router.push("/token"); | |
| } finally { | |
| setIsLoading(false); | |
| } | |
| }; | |
| checkAuth(); | |
| }, [router, pathname]); | |
| if (isLoading || !isAuthorized) { | |
| return null; | |
| } | |
| return <>{children}</>; | |
| } | |