import { ResponseType } from '@/interfaces/database/base'; import { DSL, IFlow, IFlowTemplate } from '@/interfaces/database/flow'; import i18n from '@/locales/config'; import flowService from '@/services/flow-service'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { message } from 'antd'; import { useParams } from 'umi'; import { v4 as uuid } from 'uuid'; export const EmptyDsl = { graph: { nodes: [ { id: 'begin', type: 'beginNode', position: { x: 50, y: 200, }, data: { label: 'Begin', name: 'begin', }, sourcePosition: 'left', targetPosition: 'right', }, ], edges: [], }, components: { begin: { obj: { component_name: 'Begin', params: {}, }, downstream: ['Answer:China'], // other edge target is downstream, edge source is current node id upstream: [], // edge source is upstream, edge target is current node id }, }, messages: [], reference: [], history: [], path: [], answer: [], }; export const useFetchFlowTemplates = (): ResponseType => { const { data } = useQuery({ queryKey: ['fetchFlowTemplates'], initialData: [], queryFn: async () => { const { data } = await flowService.listTemplates(); if (Array.isArray(data?.data)) { data.data.unshift({ id: uuid(), title: 'Blank', description: 'Create from nothing', dsl: EmptyDsl, }); } return data; }, }); return data; }; export const useFetchFlowList = (): { data: IFlow[]; loading: boolean } => { const { data, isFetching: loading } = useQuery({ queryKey: ['fetchFlowList'], initialData: [], gcTime: 0, queryFn: async () => { const { data } = await flowService.listCanvas(); return data?.data ?? []; }, }); return { data, loading }; }; export const useFetchFlow = (): { data: IFlow; loading: boolean; refetch: () => void; } => { const { id } = useParams(); const { data, isFetching: loading, refetch, } = useQuery({ queryKey: ['flowDetail'], initialData: {} as IFlow, refetchOnReconnect: false, refetchOnMount: false, refetchOnWindowFocus: false, gcTime: 0, queryFn: async () => { const { data } = await flowService.getCanvas({}, id); return data?.data ?? {}; }, }); return { data, loading, refetch }; }; export const useSetFlow = () => { const queryClient = useQueryClient(); const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['setFlow'], mutationFn: async (params: { id?: string; title?: string; dsl?: DSL; avatar?: string; }) => { const { data = {} } = await flowService.setCanvas(params); if (data.retcode === 0) { message.success( i18n.t(`message.${params?.id ? 'modified' : 'created'}`), ); queryClient.invalidateQueries({ queryKey: ['fetchFlowList'] }); } return data; }, }); return { data, loading, setFlow: mutateAsync }; }; export const useDeleteFlow = () => { const queryClient = useQueryClient(); const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['deleteFlow'], mutationFn: async (canvasIds: string[]) => { const { data } = await flowService.removeCanvas({ canvasIds }); if (data.retcode === 0) { queryClient.invalidateQueries({ queryKey: ['fetchFlowList'] }); } return data?.data ?? []; }, }); return { data, loading, deleteFlow: mutateAsync }; }; export const useRunFlow = () => { const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['runFlow'], mutationFn: async (params: { id: string; dsl: DSL }) => { const { data } = await flowService.runCanvas(params); if (data.retcode === 0) { message.success(i18n.t(`message.modified`)); } return data?.data ?? {}; }, }); return { data, loading, runFlow: mutateAsync }; }; export const useResetFlow = () => { const { id } = useParams(); const { data, isPending: loading, mutateAsync, } = useMutation({ mutationKey: ['resetFlow'], mutationFn: async () => { const { data } = await flowService.resetCanvas({ id }); return data; }, }); return { data, loading, resetFlow: mutateAsync }; };