import React, { useState, useEffect } from "react"; import { toast } from "react-hot-toast"; import { useNavigate } from "react-router-dom"; import { Card, CardBody } from "@/shadcn-bridge/heroui/card"; import { Button } from "@/shadcn-bridge/heroui/button"; import { Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, useDisclosure, } from "@/shadcn-bridge/heroui/modal"; import { Input } from "@/shadcn-bridge/heroui/input"; import { isWebViewFunc } from "@/utils/panel"; import { siteConfig } from "@/config/site"; import { VersionFooter } from "@/components/version-footer"; import { updatePassword } from "@/api"; import { safeLogout } from "@/utils/logout"; import { getAdminFlag, getSessionName } from "@/utils/session"; interface PasswordForm { newUsername: string; currentPassword: string; newPassword: string; confirmPassword: string; } interface MenuItem { path: string; label: string; icon: React.ReactNode; color: string; description: string; } export default function ProfilePage() { const navigate = useNavigate(); const { isOpen, onOpen, onOpenChange } = useDisclosure(); const [username, setUsername] = useState(""); const [isAdmin, setIsAdmin] = useState(false); const [passwordLoading, setPasswordLoading] = useState(false); const [passwordForm, setPasswordForm] = useState({ newUsername: "", currentPassword: "", newPassword: "", confirmPassword: "", }); useEffect(() => { // 获取用户信息 setUsername(getSessionName() || "Admin"); setIsAdmin(getAdminFlag()); }, []); // 管理员菜单项 const adminMenuItems: MenuItem[] = [ { path: "/limit", label: "限速管理", icon: ( ), color: "bg-orange-100 dark:bg-orange-500/20 text-orange-600 dark:text-orange-400", description: "管理用户限速策略", }, { path: "/panel-sharing", label: "面板共享", icon: ( ), color: "bg-indigo-100 dark:bg-indigo-500/20 text-indigo-600 dark:text-indigo-400", description: "与其他面板进行联邦共享", }, { path: "/group", label: "分组管理", icon: ( ), color: "bg-green-100 dark:bg-green-500/20 text-green-600 dark:text-green-400", description: "管理用户和隧道分组", }, { path: "/user", label: "用户管理", icon: ( ), color: "bg-blue-100 dark:bg-blue-500/20 text-blue-600 dark:text-blue-400", description: "管理系统用户", }, { path: "/config", label: "网站配置", icon: ( ), color: "bg-purple-100 dark:bg-purple-500/20 text-purple-600 dark:text-purple-400", description: "配置网站设置", }, ]; // 退出登录 const handleLogout = () => { safeLogout(); navigate("/", { replace: true }); }; // 密码表单验证 const validatePasswordForm = (): boolean => { if (!passwordForm.newUsername.trim()) { toast.error("请输入新用户名"); return false; } if (passwordForm.newUsername.length < 3) { toast.error("用户名长度至少3位"); return false; } if (!passwordForm.currentPassword) { toast.error("请输入当前密码"); return false; } if (!passwordForm.newPassword) { toast.error("请输入新密码"); return false; } if (passwordForm.newPassword.length < 6) { toast.error("新密码长度不能少于6位"); return false; } if (passwordForm.newPassword !== passwordForm.confirmPassword) { toast.error("两次输入密码不一致"); return false; } return true; }; // 提交密码修改 const handlePasswordSubmit = async () => { if (!validatePasswordForm()) return; setPasswordLoading(true); try { const response = await updatePassword(passwordForm); if (response.code === 0) { toast.success("密码修改成功,请重新登录"); onOpenChange(); handleLogout(); } else { toast.error(response.msg || "密码修改失败"); } } catch { toast.error("修改密码时发生错误"); } finally { setPasswordLoading(false); } }; // 重置密码表单 const resetPasswordForm = () => { setPasswordForm({ newUsername: "", currentPassword: "", newPassword: "", confirmPassword: "", }); }; return (
{/* 用户信息卡片 */}

{username}

{isAdmin ? "管理员" : "普通用户"} {new Date().toLocaleDateString("zh-CN")}
{/* 功能网格 */}
{/* 管理员功能 */} {isAdmin && adminMenuItems.map((item) => ( ))} {/* 修改密码 */} {/* 退出登录 */}
{/* 修改密码弹窗 */} { onOpenChange(); resetPasswordForm(); }} > {(onClose: () => void) => ( <> 修改密码
) => setPasswordForm((prev) => ({ ...prev, newUsername: e.target.value, })) } /> ) => setPasswordForm((prev) => ({ ...prev, currentPassword: e.target.value, })) } /> ) => setPasswordForm((prev) => ({ ...prev, newPassword: e.target.value, })) } /> ) => setPasswordForm((prev) => ({ ...prev, confirmPassword: e.target.value, })) } />
)}
); }