Spaces:
Paused
Paused
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<IFlowTemplate[]> => { | |
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 }; | |
}; | |