casualroom/apps/fenghuo/web/components/profile/profile-provider.tsx

220 lines
5.6 KiB
TypeScript
Raw Permalink Normal View History

2025-07-28 07:50:50 +08:00
'use client';
import { createContext, useContext, ReactNode, useState, useEffect, useRef } from 'react';
import { ProfileDetail, SystemPermission } from '@fenghuo/common';
import { useProfile as useProfileMutations, useTRPC } from '@fenghuo/client';
import { toast } from '@nice/ui/components/sonner';
import { useQuery } from '@tanstack/react-query';
import { useAuth } from '@/components/providers/auth-provider';
interface ProfileContextType {
// 状态
isSheetOpen: boolean;
setIsSheetOpen: (open: boolean) => void;
editingProfile: ProfileDetail | null;
sheetMode: 'create' | 'edit';
// 处理函数
handleAddEmployee: () => void;
handleViewDetail: (profileId: string) => void;
handleDeleteEmployee: (profileId: string, refetch?: () => void) => void;
handleSubmitEmployee: (formData: any) => void;
// 注册refetch函数
registerRefetch: (refetch: () => void) => void;
}
const ProfileContext = createContext<ProfileContextType | null>(null);
interface ProfileProviderProps {
children: ReactNode;
}
export function ProfileProvider({ children }: ProfileProviderProps) {
const [isSheetOpen, setIsSheetOpen] = useState(false);
const [editingProfile, setEditingProfile] = useState<ProfileDetail | null>(null);
const [sheetMode, setSheetMode] = useState<'create' | 'edit'>('create');
const [selectedProfileId, setSelectedProfileId] = useState<string | null>(null);
const { hasPermission } = useAuth();
// 使用ref存储refetch函数
const refetchRef = useRef<(() => void) | null>(null);
const { create, update, softDeleteByIds } = useProfileMutations();
const trpc = useTRPC();
// 查询单个profile详情用于编辑
const { data: profileDetail, isLoading: profileDetailLoading } = useQuery({
...trpc.profile.findFirst.queryOptions({
where: {
id: selectedProfileId || '',
},
include: {
organization: {
include: {
children: true,
parent: true,
terms: {
include: {
taxonomy: true,
}
}
},
},
},
}),
enabled: !!selectedProfileId && sheetMode === 'edit',
});
// 当查询到profile详情时设置编辑数据
useEffect(() => {
if (profileDetail && sheetMode === 'edit') {
setEditingProfile(profileDetail);
}
}, [profileDetail, sheetMode]);
const registerRefetch = (refetch: () => void) => {
refetchRef.current = refetch;
};
const handleAddEmployee = () => {
setEditingProfile(null);
setSelectedProfileId(null);
setSheetMode('create');
setIsSheetOpen(true);
};
const handleViewDetail = (profileId: string) => {
setSelectedProfileId(profileId);
setSheetMode('edit');
setIsSheetOpen(true);
};
const handleDeleteEmployee = (profileId: string, refetch?: () => void) => {
if (!hasPermission(SystemPermission.PROFILE_DELETE)) {
toast.error('您没有权限删除员工信息');
return;
}
softDeleteByIds.mutate(
{ ids: [profileId] },
{
onSuccess: () => {
toast.success('员工删除成功!');
refetch?.();
},
onError: (error) => {
toast.error(`删除失败: ${error.message}`);
},
}
);
};
const handleSubmitEmployee = (formData: any) => {
const profileData = {
name: formData.name,
gender: formData.gender,
idNum: formData.idNum,
paperId: formData.paperId,
avatar: formData.avatar,
hireDate: formData.hireDate,
birthday: formData.birthday,
relativeHireDate: formData.relativeHireDate,
identity: formData.identity,
level: formData.level,
levelDate: formData.levelDate,
dutyCode: formData.dutyCode,
dutyLevel: formData.dutyLevel === '' || formData.dutyLevel === undefined || formData.dutyLevel === null ? 0 : Number(formData.dutyLevel),
dutyName: formData.dutyName,
command: formData.command,
};
const profileMetadata = formData.metadata || {};
if (sheetMode === 'create') {
if (!hasPermission(SystemPermission.PROFILE_CREATE)) {
toast.error('您没有权限创建员工信息');
return;
}
const createData = {
data: {
...profileData,
metadata: profileMetadata,
organization: {
connect: {
id: formData.organizationId,
},
},
},
};
create.mutate(createData, {
onSuccess: (data) => {
toast.success('员工信息保存成功!');
setIsSheetOpen(false);
refetchRef.current?.();
},
onError: (error) => {
toast.error(`员工信息保存失败: ${error.message}`);
},
});
} else if (sheetMode === 'edit' && editingProfile) {
if (!hasPermission(SystemPermission.PROFILE_EDIT)) {
toast.error('您没有权限更新员工信息');
return;
}
const updateData = {
where: {
id: editingProfile.id,
},
data: {
...profileData,
metadata: profileMetadata,
organization: {
connect: {
id: formData.organizationId,
},
},
},
};
update.mutate(updateData, {
onSuccess: (data) => {
toast.success('员工信息更新成功!');
setIsSheetOpen(false);
refetchRef.current?.();
},
onError: (error) => {
toast.error(`员工信息更新失败: ${error.message}`);
},
});
}
};
const value: ProfileContextType = {
// 状态
isSheetOpen,
setIsSheetOpen,
editingProfile,
sheetMode,
// 处理函数
handleAddEmployee,
handleViewDetail,
handleDeleteEmployee,
handleSubmitEmployee,
registerRefetch,
};
return (
<ProfileContext.Provider value={value}>
{children}
</ProfileContext.Provider>
);
}
export function useProfile() {
const context = useContext(ProfileContext);
if (!context) {
throw new Error('useProfile must be used within a ProfileProvider');
}
return context;
}