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, hasBusinessApproverRole, hasFinanceRole } 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"; import { MOBILE_PURCHASE_PERMISSIONS } from "../features/mobile/navigation"; 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 canAccessAdmin = hasAnyPermission(permissions, [ "*", "system.settings", "system.users", "masterdata.manage", "notification.channel.manage", "integration.manage", ]); 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 canAccessPurchase = hasAnyPermission(permissions, [...MOBILE_PURCHASE_PERMISSIONS]); const canAccessApprovals = hasBusinessApproverRole(me?.roleCodes, permissions); const canAccessFinance = hasFinanceRole(me?.roleCodes, permissions); 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}
{canAccessPurchase ? : null} {canAccessFinance ? : null} {canAccessAssets ? : null} {canAccessProjects ? : null}
{canAccessAdmin ? (
) : null}

关闭后仍保留 OA 站内通知,不影响企业微信登录、绑定和工作台入口。

); }