feat: manually mirror opencoze's code from bytedance
Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* 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 { type FC, type ReactNode } from 'react';
|
||||
|
||||
import { useShallow } from 'zustand/react/shallow';
|
||||
import copy from 'copy-to-clipboard';
|
||||
import { ToolItem, ToolItemList } from '@coze-agent-ide/tool';
|
||||
import { REPORT_EVENTS as ReportEventNames } from '@coze-arch/report-events';
|
||||
import { I18n } from '@coze-arch/i18n';
|
||||
import { type BotPageFromEnum } from '@coze-arch/bot-typings/common';
|
||||
import { useSpaceStore } from '@coze-arch/bot-studio-store';
|
||||
import { type WorkFlowItemType } from '@coze-studio/bot-detail-store';
|
||||
import { SceneType } from '@coze-arch/bot-hooks';
|
||||
import { CustomError } from '@coze-arch/bot-error';
|
||||
import { getApiUniqueId } from '@coze-agent-ide/plugin-shared';
|
||||
import { useNavigateWorkflowEditPage } from '@coze-agent-ide/navigate';
|
||||
import { Toast } from '@coze-arch/coze-design';
|
||||
|
||||
import { useNavigateWorkflowOrBlockwise } from '../../hooks/use-navigate-workflow';
|
||||
import { Actions } from './workflow-item-actions';
|
||||
|
||||
export type RenderSlotParameters = WorkFlowItemType & {
|
||||
apiUniqueId: string;
|
||||
};
|
||||
|
||||
export interface ActionsCallback {
|
||||
handleCopy: (text: string) => void;
|
||||
}
|
||||
|
||||
export interface WorkflowItemProps {
|
||||
list: Array<WorkFlowItemType | undefined>;
|
||||
removeWorkFlow: (index: number) => void;
|
||||
isReadonly?: boolean;
|
||||
pageFrom?: BotPageFromEnum;
|
||||
size?: 'default' | 'large';
|
||||
sceneType?: SceneType;
|
||||
renderToolItemIcon?: (parameters: RenderSlotParameters) => ReactNode;
|
||||
renderActionSlot?: (
|
||||
parameters: RenderSlotParameters & ActionsCallback,
|
||||
) => ReactNode;
|
||||
}
|
||||
|
||||
export const WorkFlowItemCozeDesign: FC<WorkflowItemProps> = ({
|
||||
list,
|
||||
removeWorkFlow,
|
||||
isReadonly,
|
||||
size = 'default',
|
||||
sceneType = SceneType.BOT__VIEW__WORKFLOW,
|
||||
renderActionSlot,
|
||||
renderToolItemIcon,
|
||||
}) => {
|
||||
const handleCopy = (text: string) => {
|
||||
try {
|
||||
const res = copy(text);
|
||||
if (!res) {
|
||||
throw new CustomError(
|
||||
ReportEventNames.parmasValidation,
|
||||
'empty content',
|
||||
);
|
||||
}
|
||||
Toast.success({
|
||||
content: I18n.t('copy_success'),
|
||||
showClose: false,
|
||||
id: 'workflow_copy_id',
|
||||
});
|
||||
} catch {
|
||||
Toast.warning({
|
||||
content: I18n.t('copy_failed'),
|
||||
showClose: false,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const { spaceID } = useSpaceStore(
|
||||
useShallow(state => ({
|
||||
spaceID: state.space.id,
|
||||
})),
|
||||
);
|
||||
|
||||
const navigateParams = { newWindow: true, spaceID };
|
||||
const onNavigate2Edit = useNavigateWorkflowEditPage(
|
||||
navigateParams,
|
||||
sceneType,
|
||||
);
|
||||
const { navigateToWorkflow } = useNavigateWorkflowOrBlockwise({
|
||||
onNavigate2Edit,
|
||||
spaceID,
|
||||
});
|
||||
|
||||
return (
|
||||
<ToolItemList>
|
||||
{list
|
||||
.filter((p): p is WorkFlowItemType => Boolean(p))
|
||||
.map((item, index) => {
|
||||
const apiUniqueId = getApiUniqueId({ apiInfo: item });
|
||||
|
||||
return (
|
||||
<ToolItem
|
||||
title={item?.name ?? ''}
|
||||
description={item?.desc ?? ''}
|
||||
avatar={item?.plugin_icon ?? ''}
|
||||
icons={renderToolItemIcon?.({
|
||||
...item,
|
||||
apiUniqueId,
|
||||
})}
|
||||
actions={
|
||||
<Actions
|
||||
index={index}
|
||||
item={item}
|
||||
removeWorkFlow={removeWorkFlow}
|
||||
isReadonly={isReadonly}
|
||||
slot={renderActionSlot?.({
|
||||
...item,
|
||||
apiUniqueId,
|
||||
handleCopy,
|
||||
})}
|
||||
/>
|
||||
}
|
||||
onClick={() => navigateToWorkflow(item?.workflow_id)}
|
||||
size={size}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</ToolItemList>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* 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 { type FC, type ReactNode } from 'react';
|
||||
|
||||
import {
|
||||
useToolItemContext,
|
||||
ToolItemIconInfo,
|
||||
ToolItemActionDelete,
|
||||
} from '@coze-agent-ide/tool';
|
||||
import { ParametersPopover } from '@coze-studio/components/parameters-popover';
|
||||
import { type WorkFlowItemType } from '@coze-studio/bot-detail-store';
|
||||
import { I18n } from '@coze-arch/i18n';
|
||||
|
||||
interface ActionsProps {
|
||||
index: number;
|
||||
item: WorkFlowItemType | undefined;
|
||||
removeWorkFlow: (index: number) => void;
|
||||
isReadonly?: boolean;
|
||||
slot?: ReactNode;
|
||||
}
|
||||
|
||||
const Actions: FC<ActionsProps> = ({
|
||||
item,
|
||||
removeWorkFlow,
|
||||
index,
|
||||
isReadonly,
|
||||
slot,
|
||||
}) => {
|
||||
const { setIsForceShowAction } = useToolItemContext();
|
||||
const handleVisibleChange = (visible: boolean) => {
|
||||
setIsForceShowAction(visible);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<ParametersPopover
|
||||
position="bottom"
|
||||
pluginApi={{
|
||||
name: item?.name,
|
||||
desc: item?.desc,
|
||||
parameters: item?.parameters,
|
||||
}}
|
||||
onVisibleChange={handleVisibleChange}
|
||||
>
|
||||
<ToolItemIconInfo />
|
||||
</ParametersPopover>
|
||||
{slot}
|
||||
|
||||
{!isReadonly ? (
|
||||
<ToolItemActionDelete
|
||||
tooltips={I18n.t('bot_edit_remove_workflow')}
|
||||
onClick={() => {
|
||||
removeWorkFlow(index);
|
||||
}}
|
||||
data-testid={'bot.editor.tool.workflow.delete-button'}
|
||||
/>
|
||||
) : null}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export { Actions };
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { I18n } from '@coze-arch/i18n';
|
||||
import { Toast } from '@coze-arch/coze-design';
|
||||
|
||||
export function useNavigateWorkflowOrBlockwise({
|
||||
spaceID,
|
||||
onNavigate2Edit,
|
||||
}: Record<string, any>) {
|
||||
const navigateToWorkflow = useCallback(
|
||||
(workflowId?: string) => {
|
||||
if (!workflowId || workflowId === '0') {
|
||||
// 表示是脏数据,提示一下并阻止点击事件
|
||||
Toast.warning({
|
||||
content: I18n.t('workflow_error_jump_tip'),
|
||||
showClose: false,
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
onNavigate2Edit(workflowId);
|
||||
}
|
||||
},
|
||||
[spaceID],
|
||||
);
|
||||
|
||||
return {
|
||||
navigateToWorkflow,
|
||||
};
|
||||
}
|
||||
20
frontend/packages/agent-ide/workflow-item/src/index.ts
Normal file
20
frontend/packages/agent-ide/workflow-item/src/index.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
export {
|
||||
WorkFlowItemCozeDesign,
|
||||
type WorkflowItemProps,
|
||||
} from './components/workflow-item';
|
||||
17
frontend/packages/agent-ide/workflow-item/src/typings.d.ts
vendored
Normal file
17
frontend/packages/agent-ide/workflow-item/src/typings.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/// <reference types='@coze-arch/bot-typings' />
|
||||
Reference in New Issue
Block a user