220 lines
5.6 KiB
TypeScript
220 lines
5.6 KiB
TypeScript
'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;
|
||
} |