import { Link } from "react-router-dom"; import { useMutation, useQuery } from "@tanstack/react-query"; import { toast } from "sonner"; import { updateNotificationPreferences } from "../api/auth"; import { fetchEmployeeProfile } from "../api/employees"; import { mapApiErrorMessage } from "../api/errorMessages"; import { isApiError } from "../api/types"; import { useAuth } from "../auth/AuthContext"; import { hasAnyPermission } from "../auth/permissions"; import { EmployeeAvatar } from "../components/common/EmployeeAvatar"; import { PageHeader } from "../components/common/PageHeader"; import { MobileIcon } from "../components/mobile/MobileIcon"; import { PageScaffold } from "../components/patterns/PageScaffold"; import { SectionPanel } from "../components/patterns/SectionPanel"; import { Button } from "../components/ui/button"; function resolveErrorMessage(error: unknown) { if (isApiError(error)) { return `${error.code}: ${mapApiErrorMessage(error.code, error.details, error.message)}`; } if (error instanceof Error) { return error.message; } return "请求失败,请稍后重试。"; } function MobileActionLink({ to, label, description, icon, }: { to: string; label: string; description?: string; icon: string; }) { return ( {label} {description ? {description} : null} ); } export function MobileMePage() { const { me, permissions, refreshMe, logout } = useAuth(); const canAccessApprovals = hasAnyPermission(permissions, ["expense.approve", "leave.approve", "procurement.approve", "travel.approve"]); const canAccessAdmin = hasAnyPermission(permissions, ["*", "system.settings", "system.users", "report.dashboard.view"]); const canAccessAssets = hasAnyPermission(permissions, ["asset.view_own", "asset.view_all", "asset.manage", "asset.transfer", "asset.inventory"]); const canAccessProjects = hasAnyPermission(permissions, ["project.view_own", "project.view_all", "project.manage"]); const profileQuery = useQuery({ enabled: Boolean(me?.id), queryKey: ["mobile", "me", "profile", me?.id], queryFn: () => fetchEmployeeProfile(me!.id), }); const notificationPreferenceMutation = useMutation({ mutationFn: (notificationPushEnabled: boolean) => updateNotificationPreferences({ notificationPushEnabled }), onSuccess: async () => { await refreshMe(); toast.success("外部推送偏好已更新"); }, onError: (error) => { toast.error(resolveErrorMessage(error)); }, }); const profile = profileQuery.data?.employee; const departmentName = profile?.department?.name ?? (me?.departmentId ? "已关联组织" : "待管理员维护"); return (
{me?.name ?? "-"}
{departmentName}
{me?.employeeNo ?
员工号:{me.employeeNo}
: null}
{profileQuery.isLoading ?

加载档案信息中...

: null} {profileQuery.isError ? (

{resolveErrorMessage(profileQuery.error)}

) : null}
{me?.id ? ( ) : null}
{canAccessApprovals ? : null} {canAccessAssets ? : null} {canAccessProjects ? : null}
{canAccessAdmin ? (
) : null}
); }