Files
coze-studio/frontend/packages/studio/workspace/project-publish/src/publish-main/index.tsx
2025-07-31 23:15:48 +08:00

103 lines
3.1 KiB
TypeScript

/*
* Copyright 2025 coze-dev Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import React, { useEffect } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { useErrorHandler } from '@coze-arch/logger';
import { Form, Spin } from '@coze-arch/coze-design';
import { type DynamicParams } from '@coze-arch/bot-typings/teamspace';
import { useParams } from 'react-router-dom';
import { useProjectPublishStore } from '../store';
import {
loadProjectPublishDraft,
saveProjectPublishDraft,
} from './utils/publish-draft';
import { initPublishStore } from './utils/init-publish-store';
import { PublishTitleBar } from './publish-title-bar';
import { PublishRecord } from './publish-record';
import { PublishConnectors } from './publish-connectors';
import { PublishBasicInfo } from './publish-basic-info';
import { PublishContainer } from './components/publish-container';
import s from './index.module.less';
export function ProjectPublish(): JSX.Element {
const { project_id = '', space_id = '' } = useParams<DynamicParams>();
const {
showPublishResult,
pageLoading,
resetProjectPublishInfo,
exportDraft,
} = useProjectPublishStore(
useShallow(state => ({
showPublishResult: state.showPublishResult,
pageLoading: state.pageLoading,
resetProjectPublishInfo: state.resetProjectPublishInfo,
exportDraft: state.exportDraft,
})),
);
const errorHandle = useErrorHandler();
useEffect(() => {
const saveDraft = () => {
saveProjectPublishDraft(exportDraft(project_id));
};
window.addEventListener('beforeunload', saveDraft);
return () => {
window.removeEventListener('beforeunload', saveDraft);
};
}, [exportDraft, project_id]);
useEffect(() => {
initPublishStore(
project_id,
errorHandle,
loadProjectPublishDraft(project_id),
);
return () => {
resetProjectPublishInfo();
};
}, []);
return !pageLoading ? (
<PublishContainer>
<Form<Record<string, unknown>>
className={s.project}
showValidateIcon={false}
>
<PublishTitleBar />
{!showPublishResult ? (
<div className="flex justify-center pt-[32px] pb-[48px] coz-bg-primary">
<div className="w-[800px]">
<PublishBasicInfo />
<PublishConnectors />
</div>
</div>
) : (
<PublishRecord projectId={project_id} spaceId={space_id} />
)}
</Form>
</PublishContainer>
) : (
<Spin
spinning
wrapperClassName="flex justify-center h-full w-full items-center"
/>
);
}