|
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 { buildMessageListWithUuid } from '@/utils/chat'; |
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; |
|
import { message } from 'antd'; |
|
import { set } from 'lodash'; |
|
import get from 'lodash/get'; |
|
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'], |
|
upstream: [], |
|
}, |
|
}, |
|
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 your agent from scratch', |
|
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); |
|
|
|
const messageList = buildMessageListWithUuid( |
|
get(data, 'data.dsl.messages', []), |
|
); |
|
set(data, 'data.dsl.messages', messageList); |
|
|
|
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 }; |
|
}; |
|
|
|
export const useTestDbConnect = () => { |
|
const { |
|
data, |
|
isPending: loading, |
|
mutateAsync, |
|
} = useMutation({ |
|
mutationKey: ['testDbConnect'], |
|
mutationFn: async (params: any) => { |
|
const ret = await flowService.testDbConnect(params); |
|
if (ret?.data?.retcode === 0) { |
|
message.success(ret?.data?.data); |
|
} else { |
|
message.error(ret?.data?.data); |
|
} |
|
return ret; |
|
}, |
|
}); |
|
|
|
return { data, loading, testDbConnect: mutateAsync }; |
|
}; |
|
|