fix: SSR crash — QueryClient in useState, mounted guard for auth hydration

This commit is contained in:
Forge
2026-03-25 15:47:20 +08:00
parent 899188a8b7
commit 6565590eb3
4 changed files with 115 additions and 79 deletions

View File

@@ -1,6 +1,6 @@
'use client';
import { useEffect } from 'react';
import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import { useAuthStore } from '@/lib/auth-store';
import Sidebar from '@/components/layout/sidebar';
@@ -9,16 +9,22 @@ import Topbar from '@/components/layout/topbar';
export default function AppLayout({ children }: { children: React.ReactNode }) {
const router = useRouter();
const accessToken = useAuthStore((s) => s.accessToken);
// Wait for zustand to hydrate from localStorage before checking auth
const [mounted, setMounted] = useState(false);
useEffect(() => {
if (!accessToken) {
setMounted(true);
}, []);
useEffect(() => {
if (mounted && !accessToken) {
router.replace('/login');
}
}, [accessToken, router]);
}, [mounted, accessToken, router]);
if (!accessToken) {
return null;
}
// Show nothing until hydrated (prevents flash redirect)
if (!mounted) return null;
if (!accessToken) return null;
return (
<div className="flex min-h-screen" style={{ backgroundColor: '#F8FAFC' }}>