mirror of
https://github.com/snowykami/neo-blog.git
synced 2025-09-26 11:06:23 +00:00
feat: 实现用户认证上下文,重构相关组件以支持用户状态管理
This commit is contained in:
@ -7,29 +7,22 @@ import {
|
||||
} from "@/components/ui/sidebar"
|
||||
|
||||
import { useToLogin } from "@/hooks/use-route"
|
||||
import { useEffect, useState } from "react"
|
||||
import { User } from "@/models/user"
|
||||
import { getLoginUser } from "@/api/user"
|
||||
import { useEffect } from "react"
|
||||
import { useAuth } from "@/contexts/auth-context"
|
||||
|
||||
export default function ConsoleLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
const [user, setUser] = useState<User | null>(null);
|
||||
const { user } = useAuth();
|
||||
const toLogin = useToLogin();
|
||||
|
||||
useEffect(() => {
|
||||
getLoginUser().then(res => {
|
||||
setUser(res.data);
|
||||
}).catch(() => {
|
||||
setUser(null);
|
||||
if (!user) {
|
||||
toLogin();
|
||||
});
|
||||
}, [toLogin]);
|
||||
if (user === null) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}, [user, toLogin]);
|
||||
|
||||
return (
|
||||
<SidebarProvider
|
||||
|
@ -1,12 +1,14 @@
|
||||
import type { Metadata } from "next";
|
||||
import { cookies } from "next/headers";
|
||||
import { Geist, Geist_Mono } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import { DeviceProvider } from "@/contexts/device-context";
|
||||
import { NextIntlClientProvider } from 'next-intl';
|
||||
import { AuthProvider } from "@/contexts/auth-context";
|
||||
import config from "@/config";
|
||||
import { getFirstLocale } from '@/i18n/request';
|
||||
import { Toaster } from "@/components/ui/sonner"
|
||||
|
||||
import { getLoginUser } from "@/api/user";
|
||||
import "./globals.css";
|
||||
const geistSans = Geist({
|
||||
variable: "--font-geist-sans",
|
||||
subsets: ["latin"],
|
||||
@ -27,6 +29,10 @@ export default async function RootLayout({
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
const token = (await cookies()).get("token")?.value || "";
|
||||
const refreshToken = (await cookies()).get("refresh_token")?.value || "";
|
||||
const user = await getLoginUser({token, refreshToken}).then(res => res.data).catch(() => null);
|
||||
|
||||
return (
|
||||
<html lang={await getFirstLocale() || "en"} className="h-full">
|
||||
<body
|
||||
@ -34,9 +40,11 @@ export default async function RootLayout({
|
||||
>
|
||||
<Toaster richColors position="top-center" offset={80} />
|
||||
<DeviceProvider>
|
||||
<NextIntlClientProvider>
|
||||
<NextIntlClientProvider>
|
||||
<AuthProvider initialUser={user}>
|
||||
{children}
|
||||
</NextIntlClientProvider>
|
||||
</AuthProvider>
|
||||
</NextIntlClientProvider>
|
||||
</DeviceProvider>
|
||||
</body>
|
||||
</html>
|
||||
|
Reference in New Issue
Block a user