diff --git a/apps/frontend/app/console/(with-menu)/layout.tsx b/apps/frontend/app/console/(with-menu)/layout.tsx index 8774155..b90ecaf 100644 --- a/apps/frontend/app/console/(with-menu)/layout.tsx +++ b/apps/frontend/app/console/(with-menu)/layout.tsx @@ -12,37 +12,23 @@ import { SidebarProvider, SidebarTrigger, } from "@/components/ui/sidebar" -import { useUserMe } from "@/hooks/user/use-user-me"; -import { UserApi } from "@/lib/api"; -import { useRouter } from "next/navigation"; -import { toast } from "sonner"; +import { useUserStore } from "@/store/useUserStore"; +// import { useUserMe } from "@/hooks/user/use-user-me"; +// import { useRouter } from "next/navigation"; +// import { toast } from "sonner"; export default function ConsoleMenuLayout({ children, }: { children: React.ReactNode }) { - const router = useRouter(); + // const router = useRouter(); - const { user, isLoading, error } = useUserMe({ - onError: (e) => { - if (e.statusCode === 401) { - toast.info('登录凭证已失效,请重新登录'); - router.replace('/console/login'); - } - } - }); - - if (!isLoading && !error && !user) { - router.replace('/console/login'); - localStorage.removeItem('token'); - localStorage.removeItem(UserApi.USER_ME_CACHE_KEY); - toast.error('账户状态异常,请重新登录'); - } + const user = useUserStore().user; return ( - +
diff --git a/apps/frontend/app/console/login/components/types.ts b/apps/frontend/app/console/login/components/types.ts deleted file mode 100644 index 8a8a754..0000000 --- a/apps/frontend/app/console/login/components/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type SubmitMode = 'password' | 'phone' | 'email'; -export type LoginFormData = { - type: SubmitMode; - account?: string; - password?: string; - phone?: string; - email?: string; - code?: string; -} - -export type SendCodeMode = 'phone' | 'email'; -export type SendCodeFormData = { - type: SendCodeMode; - phone?: string; - email?: string; -} \ No newline at end of file diff --git a/apps/frontend/app/console/login/page.tsx b/apps/frontend/app/console/login/page.tsx index 9e9e854..f77b1b9 100644 --- a/apps/frontend/app/console/login/page.tsx +++ b/apps/frontend/app/console/login/page.tsx @@ -1,5 +1,4 @@ 'use client'; -// import { authApi, verificationApi } from "@/lib/api"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import Header from "@/components/Header"; @@ -11,58 +10,18 @@ import { KeyRound, Phone, FileKey2 } from "lucide-react"; import EmailLoginMode from "./components/EmailLoginMode"; import PasswordLoginMode from "./components/PasswordLoginMode"; import PhoneLoginMode from "./components/PhoneLoginMode"; -import { LoginFormData, SendCodeFormData, SubmitMode } from "./components/types"; -import { useCallback, useState } from "react"; +import { useState } from "react"; import LoginBG from './components/login-bg.jpg'; import Image from "next/image"; import { handleAPIError } from "@/lib/api/common"; -// import { ApiError } from "@/lib/api/fetcher"; +import { useUserStore } from "@/store/useUserStore"; + +export type SubmitMode = 'password' | 'phone' | 'passkey'; export default function Login() { const router = useRouter(); const [loginMode, setLoginMode] = useState('password'); - // const handleSendCode = async (data: SendCodeFormData) => { - // try { - // const res = await verificationApi.send({ - // type: 'login', - // targetType: data.type, - // phone: data.phone, - // email: data.email, - // }) - - // if (res) { - // toast.success('验证码已发送,请注意查收'); - // return true; - // } else { - // throw new Error(); - // } - // } catch (error) { - // toast.error((error as ApiError).message || '验证码发送失败,请稍后再试'); - // return false; - // } - // } - - // const handleSubmit = async (data: LoginFormData) => { - // try { - // const res = await authApi.login({ - // ...data, - // }); - - // if (res.token) { - // toast.success('登录成功'); - // localStorage.setItem('token', res.token); - // router.replace('/console'); - // return true; - // } else { - // throw new Error(); - // } - // } catch (error) { - // toast.error((error as ApiError).message || '登录失败,请稍后再试'); - // return false; - // } - // } - return ( <>
@@ -84,9 +43,10 @@ export default function Login() { return toast.error('登陆状态异常'); } - handler(formData).then((user) => { - localStorage.setItem('user_profile', JSON.stringify(user)); + handler(formData).then((data) => { + useUserStore.getState().setUser(data.user); // to main page + router.replace('/console'); }, (e) => { handleAPIError(e, ({ message }) => toast.error(message)) }) @@ -103,15 +63,13 @@ export default function Login() {
- - - + { + ([['password', KeyRound], ['phone', Phone], ['passkey', FileKey2]] as const).map(([mode, Icon]) => ( + + )) + }
diff --git a/apps/frontend/components/app-sidebar.tsx b/apps/frontend/components/app-sidebar.tsx index 60820b6..eca817c 100644 --- a/apps/frontend/components/app-sidebar.tsx +++ b/apps/frontend/components/app-sidebar.tsx @@ -28,7 +28,7 @@ import Link from "next/link" import { User } from "@/lib/types/user" import { Role } from "@/lib/types/role" -export function AppSidebar({ user, isUserLoading, ...props }: React.ComponentProps & { user: User | undefined, isUserLoading: boolean }) { +export function AppSidebar({ user, ...props }: React.ComponentProps & { user: User | null }) { const data = { user: { name: "shadcn", @@ -49,76 +49,74 @@ export function AppSidebar({ user, isUserLoading, ...props }: React.ComponentPro }[], } - if (!isUserLoading) { - data.navMain = [ - { - title: "网站管理", - url: "/console/web", - icon: SquareTerminal, - isHidden: !user?.roles.includes(Role.Admin), - items: [ - { - title: "资源", - url: "/console/web/resource", - }, - { - title: "博客", - url: "/console/web/blog", - }, - ], - }, - { - title: "用户管理", - url: "/console/user/list", - icon: UsersRound, - isHidden: !user?.roles.includes(Role.Admin), - }, - { - title: "邮件系统", - url: "/console/mail", - icon: Mail, - items: [ - { - title: "收件箱", - url: "/console/mail/inbox", - }, - { - title: "已发送", - url: "/console/mail/sent", - }, - { - title: "发送邮件", - url: "/console/mail/send", - }, - { - title: "邮件管理", - url: "/console/mail/manage", - isHidden: !user?.roles.includes(Role.Admin), - }, - ], - }, - { - title: "文件存储", - url: "/console/storage", - icon: CloudUpload, - }, - { - title: "虚拟云空间", - url: "/console/vspace", - icon: Inbox, - }, - { - title: "虚拟主机", - url: "/console/vserver", - icon: Server, - }, - { - title: "前往首页", - url: "/", - icon: Undo2, - }, - ] - } + data.navMain = [ + { + title: "网站管理", + url: "/console/web", + icon: SquareTerminal, + isHidden: !user?.roles.includes(Role.Admin), + items: [ + { + title: "资源", + url: "/console/web/resource", + }, + { + title: "博客", + url: "/console/web/blog", + }, + ], + }, + { + title: "用户管理", + url: "/console/user/list", + icon: UsersRound, + isHidden: !user?.roles.includes(Role.Admin), + }, + { + title: "邮件系统", + url: "/console/mail", + icon: Mail, + items: [ + { + title: "收件箱", + url: "/console/mail/inbox", + }, + { + title: "已发送", + url: "/console/mail/sent", + }, + { + title: "发送邮件", + url: "/console/mail/send", + }, + { + title: "邮件管理", + url: "/console/mail/manage", + isHidden: !user?.roles.includes(Role.Admin), + }, + ], + }, + { + title: "文件存储", + url: "/console/storage", + icon: CloudUpload, + }, + { + title: "虚拟云空间", + url: "/console/vspace", + icon: Inbox, + }, + { + title: "虚拟主机", + url: "/console/vserver", + icon: Server, + }, + { + title: "前往首页", + url: "/", + icon: Undo2, + }, + ] return ( @@ -145,7 +143,7 @@ export function AppSidebar({ user, isUserLoading, ...props }: React.ComponentPro - + diff --git a/apps/frontend/components/nav-user.tsx b/apps/frontend/components/nav-user.tsx index 6299382..ba90568 100644 --- a/apps/frontend/components/nav-user.tsx +++ b/apps/frontend/components/nav-user.tsx @@ -26,7 +26,6 @@ import { SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar" -import { authApi, UserApi } from "@/lib/api" import { Skeleton } from "./ui/skeleton" import { toast } from "sonner" import { useRouter } from "next/navigation" @@ -35,20 +34,20 @@ import { useState } from "react" import { User } from "@/lib/types/user" import UserProfile from "./nav-user/UserProfile" -export function NavUser({ user, isUserLoading }: { user: User | undefined, isUserLoading: boolean }) { +export function NavUser({ user }: { user: User | null }) { const { isMobile } = useSidebar(); const router = useRouter(); async function logout() { - try { - await authApi.logout(); - localStorage.removeItem('token'); - localStorage.removeItem(UserApi.USER_ME_CACHE_KEY) - toast.success('登出成功'); - router.replace('/console/login'); - } catch { - toast.error('登出失败,请稍后再试'); - } + // try { + // await authApi.logout(); + // localStorage.removeItem('token'); + // localStorage.removeItem(UserApi.USER_ME_CACHE_KEY) + // toast.success('登出成功'); + // router.replace('/console/login'); + // } catch { + // toast.error('登出失败,请稍后再试'); + // } } const [userProfileOpen, setUserProfileOpen] = useState(false); @@ -65,25 +64,24 @@ export function NavUser({ user, isUserLoading }: { user: User | undefined, isUse className="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" > { - user && <> - - - U - -
- {user.nickname} - {user.username} + user ? + <> + + + U + +
+ {user.nickname} + {user.username} +
+ : +
+ +
+ + +
- - } - { - isUserLoading &&
- -
- - -
-
} @@ -96,26 +94,24 @@ export function NavUser({ user, isUserLoading }: { user: User | undefined, isUse > { - user && -
- - - U - -
- {user.nickname} - {user.username} + user ? +
+ + + U + +
+ {user.nickname} + {user.username} +
+
: +
+ +
+ + +
-
- } - { - isUserLoading &&
- -
- - -
-
} diff --git a/apps/frontend/components/nav-user/SetPassword.tsx b/apps/frontend/components/nav-user/SetPassword.tsx index 8f3cdb3..5442e68 100644 --- a/apps/frontend/components/nav-user/SetPassword.tsx +++ b/apps/frontend/components/nav-user/SetPassword.tsx @@ -14,7 +14,6 @@ import { Label } from "@/components/ui/label" import { FC } from "react"; import { DialogProps } from "@radix-ui/react-dialog"; import { toast } from "sonner"; -import { UserApi } from "@/lib/api"; import { ApiError } from "next/dist/server/api-utils"; export default function SetPassword({ onOpenChange, ...props }: React.ComponentProps>) { @@ -24,13 +23,13 @@ export default function SetPassword({ onOpenChange, ...props }: React.ComponentP return; } - try { - await UserApi.updatePassword(password); - toast.success('新密码设置成功'); - onOpenChange?.(false); - } catch (error) { - toast.error((error as ApiError).message || '新密码设置失败'); - } + // try { + // await UserApi.updatePassword(password); + // toast.success('新密码设置成功'); + // onOpenChange?.(false); + // } catch (error) { + // toast.error((error as ApiError).message || '新密码设置失败'); + // } } return (