training_data/packages/client/src/api/hooks/useTerm.ts

72 lines
1.8 KiB
TypeScript
Executable File

import { getQueryKey } from "@trpc/react-query";
import { useQueryClient } from "@tanstack/react-query";
import { DataNode, ObjectType, TermDto, TreeDataNode } from "@nice/common";
import { api } from "../trpc";
import { findQueryData } from "../utils";
import { CrudOperation, emitDataChange } from "../../event";
export function useTerm() {
const queryClient = useQueryClient();
const queryKey = getQueryKey(api.term);
const create = api.term.create.useMutation({
onSuccess: (result) => {
queryClient.invalidateQueries({ queryKey });
emitDataChange(ObjectType.TERM, result as any, CrudOperation.CREATED)
},
});
const upsertTags = api.term.upsertTags.useMutation({
onSuccess: () => {
queryClient.invalidateQueries({ queryKey });
},
});
const update = api.term.update.useMutation({
onSuccess: (result) => {
queryClient.invalidateQueries({ queryKey });
emitDataChange(ObjectType.TERM, result as any, CrudOperation.UPDATED)
},
});
const softDeleteByIds = api.term.softDeleteByIds.useMutation({
onSuccess: (result, variables) => {
queryClient.invalidateQueries({ queryKey });
},
});
const buildTree = (
data: TermDto[],
parentId: string | null = null
): TreeDataNode[] => {
return data
.filter((term) => term.parentId === parentId)
.sort((a, b) => a.order - b.order)
.map((term) => {
const node: TreeDataNode = {
title: term.name,
key: term.id,
value: term.id,
hasChildren: !term.hasChildren,
children: term.hasChildren
? buildTree(data, term.id)
: undefined,
data: term,
};
return node;
});
};
const getTerm = (key: string) => {
return findQueryData<TermDto>(queryClient, api.term, key);
};
return {
create,
update,
softDeleteByIds,
getTerm,
upsertTags,
};
}