feat: manually mirror opencoze's code from bytedance

Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
fanlv
2025-07-20 17:36:12 +08:00
commit 890153324f
14811 changed files with 1923430 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
/* stylelint-disable declaration-no-important */
.create-knowledge-modal {
:global {
.semi-modal-content {
max-height: calc(100vh - 100px) !important;
}
}
}
.import-unit-type-label {
display: block;
margin-bottom: 8px;
font-size: 14px;
font-weight: bold;
line-height: 20px;
}
.create-form {
:global {
.semi-form-field {
padding-top: 0;
padding-bottom: 24px !important;
}
.semi-form-field-label {
margin-bottom: 0;
padding: 0 8px 6px;
font-size: 12px;
font-weight: 500;
font-style: normal;
line-height: 16px; /* 133.333% */
color: var(--coz-fg-secondary);
}
}
}
.upload-avatar-container {
width: auto;
}

View File

@@ -0,0 +1,139 @@
/*
* 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 { useRef, useState } from 'react';
import { useDataModalWithCoze } from '@coze-data/utils';
import { useDataNavigate } from '@coze-data/knowledge-stores';
import { UnitType } from '@coze-data/knowledge-resource-processor-core';
import {
CozeKnowledgeAddTypeContent,
type CozeKnowledgeAddTypeContentFormData,
} from '@coze-data/knowledge-modal-base/create-knowledge-modal-v2';
import { KnowledgeE2e } from '@coze-data/e2e';
import { I18n } from '@coze-arch/i18n';
import { Button, Form, LoadingButton } from '@coze-arch/coze-design';
import { useSpaceStore } from '@coze-arch/bot-studio-store';
import { FormatType } from '@coze-arch/bot-api/memory';
import { KnowledgeApi } from '@coze-arch/bot-api';
import styles from './index.module.less';
export interface UseCreateKnowledgeModalParams {
projectID?: string;
onFinish?: (datasetId: string, type: UnitType, shouldUpload: boolean) => void;
beforeCreate?: (shouldUpload: boolean) => void;
}
export const useCreateKnowledgeModalV2 = (
params: UseCreateKnowledgeModalParams = {},
) => {
const { onFinish, beforeCreate, projectID } = params;
const formRef = useRef<Form<CozeKnowledgeAddTypeContentFormData>>(null);
// 使用 useState 保证能重新渲染
const [currentFormatType, setCurrentFormatType] = useState(FormatType.Text);
const spaceId = useSpaceStore(store => store.getSpaceId());
const resourceNavigate = useDataNavigate();
const [unitType, setUnitType] = useState<UnitType>(UnitType.TEXT_DOC);
const createDataset = async () => {
await formRef.current?.formApi.validate();
const { dataset_id: datasetId } = await KnowledgeApi.CreateDataset({
project_id: projectID || undefined,
name: formRef.current?.formApi.getValue('name'),
format_type: currentFormatType,
description: formRef.current?.formApi.getValue('description'),
icon_uri: formRef.current?.formApi.getValue('icon_uri')?.[0].uid,
space_id: spaceId || undefined,
});
return datasetId;
};
const { open, close, modal } = useDataModalWithCoze({
title: (
<div data-testid={KnowledgeE2e.CreateKnowledgeModalTitle}>
{I18n.t('datasets_model_create_title')}
</div>
),
centered: true,
className: styles['create-knowledge-modal'],
onCancel: () => {
close();
},
footer: (
<div className="flex w-full justify-end">
<Button
color="primary"
onClick={() => {
close();
}}
>
{I18n.t('cancel')}
</Button>
<LoadingButton
color="primary"
onClick={async () => {
beforeCreate?.(false);
const datasetId = await createDataset();
if (onFinish) {
onFinish(datasetId || '', unitType, false);
} else {
resourceNavigate.toResource?.('knowledge', datasetId);
}
}}
>
{I18n.t('kl_write_108')}
</LoadingButton>
<LoadingButton
data-testid={KnowledgeE2e.CreateKnowledgeModalSubmitAndImportButton}
color="primary"
onClick={async () => {
beforeCreate?.(true);
const datasetId = await createDataset();
if (onFinish) {
onFinish(datasetId || '', unitType, true);
} else {
resourceNavigate.upload?.({ type: unitType });
}
}}
>
{I18n.t('kl_write_109')}
</LoadingButton>
</div>
),
});
return {
modal: modal(
<Form<CozeKnowledgeAddTypeContentFormData>
ref={formRef}
showValidateIcon={false}
className={styles['create-form']}
>
<CozeKnowledgeAddTypeContent
onImportKnowledgeTypeChange={setUnitType}
onSelectFormatTypeChange={setCurrentFormatType}
/>
</Form>,
),
open: () => {
setCurrentFormatType(FormatType.Text);
open();
},
close,
};
};