mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-24 22:03:54 +00:00
perf: onpublish app (#2498)
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import React, { useCallback, useMemo, useState } from 'react';
|
||||
import {
|
||||
Box,
|
||||
Flex,
|
||||
@@ -39,14 +39,20 @@ const Header = () => {
|
||||
const router = useRouter();
|
||||
const { toast } = useToast();
|
||||
|
||||
const { appDetail, onPublish, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||
const { appDetail, onSaveApp, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||
const isV2Workflow = appDetail?.version === 'v2';
|
||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||
|
||||
const {
|
||||
isOpen: isOpenBackConfirm,
|
||||
onOpen: onOpenBackConfirm,
|
||||
onClose: onCloseBackConfirm
|
||||
} = useDisclosure();
|
||||
const {
|
||||
isOpen: isSaveAndPublishModalOpen,
|
||||
onOpen: onSaveAndPublishModalOpen,
|
||||
onClose: onSaveAndPublishModalClose
|
||||
} = useDisclosure();
|
||||
|
||||
const [isSave, setIsSave] = useState(false);
|
||||
|
||||
const {
|
||||
@@ -94,7 +100,7 @@ const Header = () => {
|
||||
const data = flowData2StoreData();
|
||||
|
||||
if (data) {
|
||||
await onPublish({
|
||||
await onSaveApp({
|
||||
...data,
|
||||
isPublish,
|
||||
versionName,
|
||||
@@ -157,34 +163,9 @@ const Header = () => {
|
||||
name={'common/leftArrowLight'}
|
||||
w={'1.75rem'}
|
||||
cursor={'pointer'}
|
||||
onClick={isPublished ? onBack : onOpen}
|
||||
onClick={isPublished ? onBack : onOpenBackConfirm}
|
||||
/>
|
||||
<MyModal
|
||||
isOpen={isOpen}
|
||||
onClose={onClose}
|
||||
iconSrc="common/warn"
|
||||
title={t('common:common.Exit')}
|
||||
w={'400px'}
|
||||
>
|
||||
<ModalBody>
|
||||
<Box>{t('workflow:workflow.exit_tips')}</Box>
|
||||
</ModalBody>
|
||||
<ModalFooter gap={3}>
|
||||
<Button variant={'whiteDanger'} onClick={onBack}>
|
||||
{t('common:common.Exit Directly')}
|
||||
</Button>
|
||||
<Button
|
||||
isLoading={loading}
|
||||
onClick={async () => {
|
||||
await onClickSave({});
|
||||
onClose();
|
||||
onBack();
|
||||
}}
|
||||
>
|
||||
{t('common:common.Save_and_exit')}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</MyModal>
|
||||
|
||||
{/* app info */}
|
||||
<Box ml={1}>
|
||||
<AppCard isPublished={isPublished} showSaveStatus={isV2Workflow} />
|
||||
@@ -313,6 +294,32 @@ const Header = () => {
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<MyModal
|
||||
isOpen={isOpenBackConfirm}
|
||||
onClose={onCloseBackConfirm}
|
||||
iconSrc="common/warn"
|
||||
title={t('common:common.Exit')}
|
||||
w={'400px'}
|
||||
>
|
||||
<ModalBody>
|
||||
<Box>{t('workflow:workflow.exit_tips')}</Box>
|
||||
</ModalBody>
|
||||
<ModalFooter gap={3}>
|
||||
<Button variant={'whiteDanger'} onClick={onBack}>
|
||||
{t('common:common.Exit Directly')}
|
||||
</Button>
|
||||
<Button
|
||||
isLoading={loading}
|
||||
onClick={async () => {
|
||||
await onClickSave({});
|
||||
onCloseBackConfirm();
|
||||
onBack();
|
||||
}}
|
||||
>
|
||||
{t('common:common.Save_and_exit')}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</MyModal>
|
||||
</>
|
||||
);
|
||||
}, [
|
||||
@@ -320,9 +327,9 @@ const Header = () => {
|
||||
currentTab,
|
||||
isPublished,
|
||||
onBack,
|
||||
onOpen,
|
||||
isOpen,
|
||||
onClose,
|
||||
isOpenBackConfirm,
|
||||
onOpenBackConfirm,
|
||||
onCloseBackConfirm,
|
||||
t,
|
||||
loading,
|
||||
isV2Workflow,
|
||||
|
@@ -22,6 +22,7 @@ import { publishStatusStyle } from '../constants';
|
||||
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
|
||||
import { useSystem } from '@fastgpt/web/hooks/useSystem';
|
||||
import { useToast } from '@fastgpt/web/hooks/useToast';
|
||||
import { formatTime2YMDHMS } from '@fastgpt/global/common/string/time';
|
||||
|
||||
const Header = ({
|
||||
appForm,
|
||||
@@ -34,7 +35,7 @@ const Header = ({
|
||||
const { isPc } = useSystem();
|
||||
const router = useRouter();
|
||||
const { toast } = useToast();
|
||||
const { appId, appDetail, onPublish, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||
const { appId, appDetail, onSaveApp, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||
|
||||
const { data: paths = [] } = useRequest2(() => getAppFolderPath(appId), {
|
||||
manual: false,
|
||||
@@ -71,18 +72,20 @@ const Header = ({
|
||||
const onSubmitPublish = useCallback(
|
||||
async (data: AppSimpleEditFormType) => {
|
||||
const { nodes, edges } = form2AppWorkflow(data, t);
|
||||
await onPublish({
|
||||
await onSaveApp({
|
||||
nodes,
|
||||
edges,
|
||||
chatConfig: data.chatConfig,
|
||||
type: AppTypeEnum.simple
|
||||
type: AppTypeEnum.simple,
|
||||
isPublish: true,
|
||||
versionName: formatTime2YMDHMS(new Date())
|
||||
});
|
||||
toast({
|
||||
status: 'success',
|
||||
title: t('app:publish_success')
|
||||
});
|
||||
},
|
||||
[onPublish, t, toast]
|
||||
[onSaveApp, t, toast]
|
||||
);
|
||||
|
||||
const [historiesDefaultData, setHistoriesDefaultData] = useState<InitProps>();
|
||||
|
@@ -39,9 +39,13 @@ const Header = () => {
|
||||
const router = useRouter();
|
||||
const { toast } = useToast();
|
||||
|
||||
const { appDetail, onPublish, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||
const { appDetail, onSaveApp, currentTab } = useContextSelector(AppContext, (v) => v);
|
||||
const isV2Workflow = appDetail?.version === 'v2';
|
||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||
const {
|
||||
isOpen: isOpenBackConfirm,
|
||||
onOpen: onOpenBackConfirm,
|
||||
onClose: onCloseBackConfirm
|
||||
} = useDisclosure();
|
||||
const {
|
||||
isOpen: isSaveAndPublishModalOpen,
|
||||
onOpen: onSaveAndPublishModalOpen,
|
||||
@@ -94,7 +98,7 @@ const Header = () => {
|
||||
const data = flowData2StoreData();
|
||||
|
||||
if (data) {
|
||||
await onPublish({
|
||||
await onSaveApp({
|
||||
...data,
|
||||
isPublish,
|
||||
versionName,
|
||||
@@ -157,34 +161,9 @@ const Header = () => {
|
||||
name={'common/leftArrowLight'}
|
||||
w={'1.75rem'}
|
||||
cursor={'pointer'}
|
||||
onClick={isPublished ? onBack : onOpen}
|
||||
onClick={isPublished ? onBack : onOpenBackConfirm}
|
||||
/>
|
||||
<MyModal
|
||||
isOpen={isOpen}
|
||||
onClose={onClose}
|
||||
iconSrc="common/warn"
|
||||
title={t('common:common.Exit')}
|
||||
w={'400px'}
|
||||
>
|
||||
<ModalBody>
|
||||
<Box>{t('workflow:workflow.exit_tips')}</Box>
|
||||
</ModalBody>
|
||||
<ModalFooter gap={3}>
|
||||
<Button variant={'whiteDanger'} onClick={onBack}>
|
||||
{t('common:common.Exit Directly')}
|
||||
</Button>
|
||||
<Button
|
||||
isLoading={loading}
|
||||
onClick={async () => {
|
||||
await onClickSave({});
|
||||
onClose();
|
||||
onBack();
|
||||
}}
|
||||
>
|
||||
{t('common:common.Save_and_exit')}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</MyModal>
|
||||
|
||||
{/* app info */}
|
||||
<Box ml={1}>
|
||||
<AppCard isPublished={isPublished} showSaveStatus={isV2Workflow} />
|
||||
@@ -313,6 +292,36 @@ const Header = () => {
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<MyModal
|
||||
isOpen={isOpenBackConfirm}
|
||||
onClose={onCloseBackConfirm}
|
||||
iconSrc="common/warn"
|
||||
title={t('common:common.Exit')}
|
||||
w={'400px'}
|
||||
>
|
||||
<ModalBody>
|
||||
<Box>{t('workflow:workflow.exit_tips')}</Box>
|
||||
</ModalBody>
|
||||
<ModalFooter gap={3}>
|
||||
<Button variant={'whiteDanger'} onClick={onBack}>
|
||||
{t('common:common.Exit Directly')}
|
||||
</Button>
|
||||
<Button
|
||||
isLoading={loading}
|
||||
onClick={async () => {
|
||||
await onClickSave({});
|
||||
onCloseBackConfirm();
|
||||
onBack();
|
||||
toast({
|
||||
status: 'success',
|
||||
title: t('app:saved_success')
|
||||
});
|
||||
}}
|
||||
>
|
||||
{t('common:common.Save_and_exit')}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</MyModal>
|
||||
</>
|
||||
);
|
||||
}, [
|
||||
@@ -320,9 +329,9 @@ const Header = () => {
|
||||
currentTab,
|
||||
isPublished,
|
||||
onBack,
|
||||
onOpen,
|
||||
isOpen,
|
||||
onClose,
|
||||
isOpenBackConfirm,
|
||||
onOpenBackConfirm,
|
||||
onCloseBackConfirm,
|
||||
t,
|
||||
loading,
|
||||
isV2Workflow,
|
||||
|
@@ -28,13 +28,11 @@ import { versionListResponse } from '@/pages/api/core/app/version/listWorkflow';
|
||||
const WorkflowPublishHistoriesSlider = ({ onClose }: { onClose: () => void }) => {
|
||||
const { t } = useTranslation();
|
||||
const [currentTab, setCurrentTab] = useState<'myEdit' | 'teamCloud'>('myEdit');
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
<CustomRightDrawer
|
||||
onClose={() => onClose()}
|
||||
isLoading={isLoading}
|
||||
title={
|
||||
(
|
||||
<>
|
||||
@@ -58,7 +56,7 @@ const WorkflowPublishHistoriesSlider = ({ onClose }: { onClose: () => void }) =>
|
||||
showMask={false}
|
||||
overflow={'unset'}
|
||||
>
|
||||
{currentTab === 'myEdit' ? <MyEdit /> : <TeamCloud setIsLoading={setIsLoading} />}
|
||||
{currentTab === 'myEdit' ? <MyEdit /> : <TeamCloud />}
|
||||
</CustomRightDrawer>
|
||||
</>
|
||||
);
|
||||
@@ -81,14 +79,17 @@ const MyEdit = () => {
|
||||
h={'30px'}
|
||||
onClick={async () => {
|
||||
const initialSnapshot = past[past.length - 1];
|
||||
|
||||
const res = await saveSnapshot({
|
||||
pastNodes: initialSnapshot.nodes,
|
||||
pastEdges: initialSnapshot.edges,
|
||||
chatConfig: initialSnapshot.chatConfig,
|
||||
customTitle: t(`app:app.version_initial_copy`)
|
||||
});
|
||||
if (!res) return;
|
||||
resetSnapshot(initialSnapshot);
|
||||
if (res) {
|
||||
resetSnapshot(initialSnapshot);
|
||||
}
|
||||
|
||||
toast({
|
||||
title: t('workflow:workflow.Switch_success'),
|
||||
status: 'success'
|
||||
@@ -120,8 +121,9 @@ const MyEdit = () => {
|
||||
chatConfig: item.chatConfig,
|
||||
customTitle: `${t('app:app.version_copy')}-${item.title}`
|
||||
});
|
||||
if (!res) return;
|
||||
resetSnapshot(item);
|
||||
if (res) {
|
||||
resetSnapshot(item);
|
||||
}
|
||||
toast({
|
||||
title: t('workflow:workflow.Switch_success'),
|
||||
status: 'success'
|
||||
@@ -169,7 +171,7 @@ const MyEdit = () => {
|
||||
);
|
||||
};
|
||||
|
||||
const TeamCloud = ({ setIsLoading }: { setIsLoading: (value: boolean) => void }) => {
|
||||
const TeamCloud = () => {
|
||||
const { t } = useTranslation();
|
||||
const { appDetail } = useContextSelector(AppContext, (v) => v);
|
||||
const { saveSnapshot, resetSnapshot } = useContextSelector(WorkflowContext, (v) => v);
|
||||
@@ -194,39 +196,36 @@ const TeamCloud = ({ setIsLoading }: { setIsLoading: (value: boolean) => void })
|
||||
const [isEditing, setIsEditing] = useState(false);
|
||||
const { toast } = useToast();
|
||||
|
||||
const onChangeVersion = async (versionItem: versionListResponse) => {
|
||||
setIsLoading(true);
|
||||
const versionDetail = await getAppVersionDetail(versionItem._id, versionItem.appId);
|
||||
setIsLoading(false);
|
||||
if (!versionDetail) return;
|
||||
const state = {
|
||||
nodes: versionDetail.nodes?.map((item) => storeNode2FlowNode({ item })),
|
||||
edges: versionDetail.edges?.map((item) => storeEdgesRenderEdge({ edge: item })),
|
||||
title: versionItem.versionName,
|
||||
chatConfig: versionDetail.chatConfig
|
||||
};
|
||||
const { runAsync: onChangeVersion, loading: isLoadingVersion } = useRequest2(
|
||||
async (versionItem: versionListResponse) => {
|
||||
const versionDetail = await getAppVersionDetail(versionItem._id, versionItem.appId);
|
||||
|
||||
const res = await saveSnapshot({
|
||||
pastNodes: state.nodes,
|
||||
pastEdges: state.edges,
|
||||
chatConfig: state.chatConfig,
|
||||
customTitle: `${t('app:app.version_copy')}-${state.title}`
|
||||
});
|
||||
if (!versionDetail) return;
|
||||
|
||||
if (!res) {
|
||||
return toast({
|
||||
title: t('workflow:workflow.Switch_failed'),
|
||||
status: 'warning'
|
||||
const state = {
|
||||
nodes: versionDetail.nodes?.map((item) => storeNode2FlowNode({ item })),
|
||||
edges: versionDetail.edges?.map((item) => storeEdgesRenderEdge({ edge: item })),
|
||||
title: versionItem.versionName,
|
||||
chatConfig: versionDetail.chatConfig
|
||||
};
|
||||
|
||||
await saveSnapshot({
|
||||
pastNodes: state.nodes,
|
||||
pastEdges: state.edges,
|
||||
chatConfig: state.chatConfig,
|
||||
customTitle: `${t('app:app.version_copy')}-${state.title}`
|
||||
});
|
||||
|
||||
resetSnapshot(state);
|
||||
toast({
|
||||
title: t('workflow:workflow.Switch_success'),
|
||||
status: 'success'
|
||||
});
|
||||
}
|
||||
resetSnapshot(state);
|
||||
toast({
|
||||
title: t('workflow:workflow.Switch_success'),
|
||||
status: 'success'
|
||||
});
|
||||
};
|
||||
);
|
||||
|
||||
return (
|
||||
<ScrollList isLoading={isLoading} flex={'1 0 0'} px={5}>
|
||||
<ScrollList isLoading={isLoading || isLoadingVersion} flex={'1 0 0'} px={5}>
|
||||
{list.map((data, index) => {
|
||||
const item = data.data;
|
||||
const firstPublishedIndex = list.findIndex((data) => data.data.isPublish);
|
||||
|
@@ -35,7 +35,7 @@ type AppContextType = {
|
||||
onOpenInfoEdit: () => void;
|
||||
onOpenTeamTagModal: () => void;
|
||||
onDelApp: () => void;
|
||||
onPublish: (data: PostPublishAppProps) => Promise<void>;
|
||||
onSaveApp: (data: PostPublishAppProps) => Promise<void>;
|
||||
appLatestVersion:
|
||||
| {
|
||||
nodes: StoreNodeItemType[];
|
||||
@@ -70,7 +70,7 @@ export const AppContext = createContext<AppContextType>({
|
||||
onDelApp: function (): void {
|
||||
throw new Error('Function not implemented.');
|
||||
},
|
||||
onPublish: function (data: PostPublishAppProps): Promise<void> {
|
||||
onSaveApp: function (data: PostPublishAppProps): Promise<void> {
|
||||
throw new Error('Function not implemented.');
|
||||
},
|
||||
appLatestVersion: undefined,
|
||||
@@ -150,7 +150,7 @@ const AppContextProvider = ({ children }: { children: ReactNode }) => {
|
||||
}));
|
||||
});
|
||||
|
||||
const { runAsync: onPublish } = useRequest2(async (data: PostPublishAppProps) => {
|
||||
const { runAsync: onSaveApp } = useRequest2(async (data: PostPublishAppProps) => {
|
||||
await postPublishApp(appId, data);
|
||||
setAppDetail((state) => ({
|
||||
...state,
|
||||
@@ -190,7 +190,7 @@ const AppContextProvider = ({ children }: { children: ReactNode }) => {
|
||||
onOpenInfoEdit,
|
||||
onOpenTeamTagModal,
|
||||
onDelApp,
|
||||
onPublish,
|
||||
onSaveApp,
|
||||
appLatestVersion,
|
||||
reloadAppLatestVersion,
|
||||
reloadApp
|
||||
|
Reference in New Issue
Block a user