staff_data/packages/client/src/api/hooks/useStaff.ts

115 lines
3.4 KiB
TypeScript
Executable File

import { getQueryKey } from "@trpc/react-query";
import { api } from "../trpc"; // Adjust path as necessary
import { useQueryClient } from "@tanstack/react-query";
import { ObjectType, Staff } from "@nice/common";
import { findQueryData } from "../utils";
import { CrudOperation, emitDataChange } from "../../event";
export interface CustomField {
name: string;
label?: string;
type: string;
required?: boolean;
order?: number;
options?: any;
group?: string;
}
export interface CustomFieldValue {
staffId: string;
fieldId: string;
value?: string;
}
interface StaffHookReturn {
create: ReturnType<typeof api.staff.create.useMutation>;
update: ReturnType<typeof api.staff.update.useMutation>;
softDeleteByIds: ReturnType<typeof api.staff.softDeleteByIds.useMutation>;
getStaff: (key: string) => Staff | undefined;
updateUserDomain: ReturnType<typeof api.staff.updateUserDomain.useMutation>;
addCustomField: ReturnType<typeof api.staff.addCustomField.useMutation>;
updateCustomField: ReturnType<typeof api.staff.updateCustomField.useMutation>;
deleteCustomField: ReturnType<typeof api.staff.deleteCustomField.useMutation>;
useCustomFields: () => ReturnType<typeof api.staff.getCustomFields.useQuery>;
setCustomFieldValue: ReturnType<typeof api.staff.setCustomFieldValue.useMutation>;
}
export function useStaff(): StaffHookReturn {
const queryClient = useQueryClient();
const queryKey = getQueryKey(api.staff);
const create = api.staff.create.useMutation({
onSuccess: (result) => {
queryClient.invalidateQueries({ queryKey });
emitDataChange(
ObjectType.STAFF,
result as any,
CrudOperation.CREATED
);
},
});
const updateUserDomain = api.staff.updateUserDomain.useMutation({
onSuccess: (result) => {
queryClient.invalidateQueries({ queryKey });
emitDataChange(ObjectType.STAFF, result as any, CrudOperation.UPDATED);
},
});
const update = api.staff.update.useMutation({
onSuccess: (result) => {
queryClient.invalidateQueries({ queryKey });
queryClient.invalidateQueries({ queryKey: getQueryKey(api.post) });
emitDataChange(
ObjectType.STAFF,
result as any,
CrudOperation.UPDATED
);
},
});
const softDeleteByIds = api.staff.softDeleteByIds.useMutation({
onSuccess: (result, variables) => {
queryClient.invalidateQueries({ queryKey });
},
});
const addCustomField = api.staff.addCustomField.useMutation({
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: getQueryKey(api.staff.getCustomFields) });
},
});
const updateCustomField = api.staff.updateCustomField.useMutation({
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: getQueryKey(api.staff.getCustomFields) });
},
});
const deleteCustomField = api.staff.deleteCustomField.useMutation({
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: getQueryKey(api.staff.getCustomFields) });
},
});
const useCustomFields = () => {
return api.staff.getCustomFields.useQuery(undefined, {
staleTime: 1000 * 60 * 5, // 5分钟缓存
});
};
const setCustomFieldValue = api.staff.setCustomFieldValue.useMutation({
onSuccess: (result) => {
queryClient.invalidateQueries({ queryKey });
},
});
const getStaff = (key: string) => {
return findQueryData<Staff>(queryClient, api.staff, key);
};
return {
create,
update,
softDeleteByIds,
getStaff,
updateUserDomain,
addCustomField,
updateCustomField,
deleteCustomField,
useCustomFields,
setCustomFieldValue,
};
}