1- import React , { useState } from 'react' ;
1+ import React , { useState , useMemo } from 'react' ;
22import { useTranslation } from 'next-i18next' ;
33import { useForm } from 'react-hook-form' ;
44import {
@@ -18,21 +18,10 @@ import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
1818import MyIcon from '@fastgpt/web/components/common/Icon' ;
1919import { useUploadAvatar } from '@fastgpt/web/common/file/hooks/useUploadAvatar' ;
2020import { useRequest2 } from '@fastgpt/web/hooks/useRequest' ;
21- import {
22- postCreateDataset ,
23- getDatasetById ,
24- postCreateDatasetFileCollection
25- } from '@/web/core/dataset/api' ;
21+ import { postCreateDatasetWithFiles , getDatasetById } from '@/web/core/dataset/api' ;
2622import { getUploadAvatarPresignedUrl } from '@/web/common/file/api' ;
2723import { uploadFile2DB } from '@/web/common/file/controller' ;
2824import { useSystemStore } from '@/web/common/system/useSystemStore' ;
29- import {
30- ChunkSettingModeEnum ,
31- ChunkTriggerConfigTypeEnum ,
32- DataChunkSplitModeEnum ,
33- DatasetCollectionDataProcessModeEnum ,
34- DatasetTypeEnum
35- } from '@fastgpt/global/core/dataset/constants' ;
3625import { getWebDefaultEmbeddingModel , getWebDefaultLLMModel } from '@/web/common/system/utils' ;
3726import { BucketNameEnum } from '@fastgpt/global/common/file/constants' ;
3827import { getErrText } from '@fastgpt/global/common/error/utils' ;
@@ -66,6 +55,11 @@ const QuickCreateDatasetModal = ({
6655
6756 const [ selectFiles , setSelectFiles ] = useState < ImportSourceItemType [ ] > ( [ ] ) ;
6857
58+ const successFiles = useMemo (
59+ ( ) => selectFiles . filter ( ( item ) => item . dbFileId && ! item . errorMsg ) ,
60+ [ selectFiles ]
61+ ) ;
62+
6963 const { register, handleSubmit, watch, setValue } = useForm ( {
7064 defaultValues : {
7165 parentId,
@@ -83,103 +77,106 @@ const QuickCreateDatasetModal = ({
8377 }
8478 } ) ;
8579
86- const handleSelectFiles = ( files : SelectFileItemType [ ] ) => {
87- setSelectFiles ( ( state ) => [
88- ...state ,
89- ...files . map < ImportSourceItemType > ( ( selectFile ) => {
90- const { fileId, file } = selectFile ;
91-
92- return {
93- id : fileId ,
94- createStatus : 'waiting' ,
95- file,
96- sourceName : file . name ,
97- sourceSize : formatFileSize ( file . size ) ,
98- icon : getFileIcon ( file . name ) ,
99- uploadedFileRate : 0
100- } ;
101- } )
102- ] ) ;
103- } ;
80+ const { runAsync : handleSelectFiles , loading : uploading } = useRequest2 (
81+ async ( files : SelectFileItemType [ ] ) => {
82+ await Promise . all (
83+ files . map ( async ( { fileId, file } ) => {
84+ try {
85+ const { fileId : uploadFileId } = await uploadFile2DB ( {
86+ file,
87+ bucketName : BucketNameEnum . dataset ,
88+ data : { datasetId : '' } ,
89+ percentListen : ( percent ) => {
90+ setSelectFiles ( ( state ) =>
91+ state . map ( ( item ) =>
92+ item . id === fileId
93+ ? {
94+ ...item ,
95+ uploadedFileRate : item . uploadedFileRate
96+ ? Math . max ( percent , item . uploadedFileRate )
97+ : percent
98+ }
99+ : item
100+ )
101+ ) ;
102+ }
103+ } ) ;
104104
105- const uploadSingleFile = async ( fileItem : ImportSourceItemType , datasetId : string ) => {
106- try {
107- if ( ! fileItem . file ) return ;
108- setSelectFiles ( ( prev ) =>
109- prev . map ( ( item ) => ( item . id === fileItem . id ? { ...item , uploadedFileRate : 0 } : item ) )
105+ setSelectFiles ( ( state ) =>
106+ state . map ( ( item ) =>
107+ item . id === fileId
108+ ? {
109+ ...item ,
110+ dbFileId : uploadFileId ,
111+ isUploading : false ,
112+ uploadedFileRate : 100
113+ }
114+ : item
115+ )
116+ ) ;
117+ } catch ( error ) {
118+ setSelectFiles ( ( state ) =>
119+ state . map ( ( item ) =>
120+ item . id === fileId
121+ ? {
122+ ...item ,
123+ isUploading : false ,
124+ errorMsg : getErrText ( error )
125+ }
126+ : item
127+ )
128+ ) ;
129+ }
130+ } )
110131 ) ;
132+ } ,
133+ {
134+ manual : true ,
135+ onBefore ( [ files ] ) {
136+ setSelectFiles ( ( state ) => [
137+ ...state ,
138+ ...files . map < ImportSourceItemType > ( ( selectFile ) => {
139+ const { fileId, file } = selectFile ;
111140
112- const { fileId } = await uploadFile2DB ( {
113- file : fileItem . file ,
114- bucketName : BucketNameEnum . dataset ,
115- data : { datasetId } ,
116- percentListen : ( percent ) => {
117- setSelectFiles ( ( prev ) =>
118- prev . map ( ( item ) =>
119- item . id === fileItem . id
120- ? { ...item , uploadedFileRate : Math . max ( percent , item . uploadedFileRate || 0 ) }
121- : item
122- )
123- ) ;
124- }
125- } ) ;
126-
127- await postCreateDatasetFileCollection ( {
128- datasetId,
129- fileId,
130- trainingType : DatasetCollectionDataProcessModeEnum . chunk ,
131- chunkTriggerType : ChunkTriggerConfigTypeEnum . minSize ,
132- chunkTriggerMinSize : 1000 ,
133- chunkSettingMode : ChunkSettingModeEnum . auto ,
134- chunkSplitMode : DataChunkSplitModeEnum . paragraph ,
135- chunkSize : 1024 ,
136- indexSize : 512 ,
137- customPdfParse : false
138- } ) ;
139-
140- setSelectFiles ( ( prev ) =>
141- prev . map ( ( item ) =>
142- item . id === fileItem . id ? { ...item , dbFileId : fileId , uploadedFileRate : 100 } : item
143- )
144- ) ;
145- } catch ( error ) {
146- setSelectFiles ( ( prev ) =>
147- prev . map ( ( item ) =>
148- item . id === fileItem . id ? { ...item , errorMsg : getErrText ( error ) } : item
149- )
150- ) ;
141+ return {
142+ id : fileId ,
143+ createStatus : 'waiting' ,
144+ file,
145+ sourceName : file . name ,
146+ sourceSize : formatFileSize ( file . size ) ,
147+ icon : getFileIcon ( file . name ) ,
148+ isUploading : true ,
149+ uploadedFileRate : 0
150+ } ;
151+ } )
152+ ] ) ;
153+ }
151154 }
152- } ;
155+ ) ;
153156
154157 const { runAsync : onCreate , loading : isCreating } = useRequest2 (
155158 async ( data ) => {
156- const datasetId = await postCreateDataset ( {
157- name : data . name . trim ( ) ,
158- avatar : data . avatar ,
159- intro : '' ,
160- parentId,
161- type : DatasetTypeEnum . dataset ,
162- vectorModel : defaultVectorModel ,
163- agentModel : defaultAgentModel ,
164- vlmModel : defaultVLLM
159+ return await postCreateDatasetWithFiles ( {
160+ datasetParams : {
161+ name : data . name . trim ( ) ,
162+ avatar : data . avatar ,
163+ parentId,
164+ vectorModel : defaultVectorModel ,
165+ agentModel : defaultAgentModel ,
166+ vlmModel : defaultVLLM
167+ } ,
168+ files : selectFiles
169+ . filter ( ( item ) => item . dbFileId && ! item . errorMsg )
170+ . map ( ( item ) => ( {
171+ fileId : item . dbFileId ! ,
172+ name : item . sourceName
173+ } ) )
165174 } ) ;
166-
167- if ( selectFiles . length > 0 ) {
168- await Promise . all ( selectFiles . map ( ( file ) => uploadSingleFile ( file , datasetId ) ) ) ;
169- }
170-
171- const datasetDetail = await getDatasetById ( datasetId ) ;
172-
173- return {
174- datasetId,
175- name : datasetDetail . name ,
176- avatar : datasetDetail . avatar ,
177- vectorModel : datasetDetail . vectorModel
178- } ;
179175 } ,
180176 {
181177 manual : true ,
182178 successToast : t ( 'app:dataset_create_success' ) ,
179+ errorToast : t ( 'app:dataset_create_failed' ) ,
183180 onSuccess : ( result ) => {
184181 onSuccess ( result ) ;
185182 onClose ( ) ;
@@ -198,18 +195,19 @@ const QuickCreateDatasetModal = ({
198195 >
199196 < ModalBody py = { 6 } minH = { '500px' } >
200197 < Box mb = { 6 } >
201- < FormLabel mb = { 2 } > { t ( 'common:app_icon_and_name ' ) } </ FormLabel >
198+ < FormLabel mb = { 2 } > { t ( 'common:input_name ' ) } </ FormLabel >
202199 < Flex alignItems = { 'center' } >
203200 < MyTooltip label = { t ( 'common:set_avatar' ) } >
204- < Avatar
205- src = { avatar }
206- w = { 9 }
207- h = { 9 }
208- mr = { 4 }
209- borderRadius = { '8px' }
210- cursor = { 'pointer' }
211- onClick = { handleAvatarSelectorOpen }
212- />
201+ < Box w = { 9 } h = { 9 } mr = { 4 } >
202+ < Avatar
203+ src = { avatar }
204+ w = { 'full' }
205+ h = { 'full' }
206+ borderRadius = { '8px' }
207+ cursor = { 'pointer' }
208+ onClick = { handleAvatarSelectorOpen }
209+ />
210+ </ Box >
213211 </ MyTooltip >
214212 < FormControl flex = { 1 } >
215213 < Input
@@ -288,7 +286,7 @@ const QuickCreateDatasetModal = ({
288286 ) : null }
289287 </ Flex >
290288 < Flex w = { 1 / 5 } justifyContent = { 'end' } >
291- { ! item . uploadedFileRate && (
289+ { ! item . isUploading && (
292290 < Flex alignItems = { 'center' } justifyContent = { 'center' } w = { 6 } h = { 6 } >
293291 < MyIcon
294292 name = { 'delete' }
@@ -331,7 +329,7 @@ const QuickCreateDatasetModal = ({
331329 </ Button >
332330 < Button
333331 isLoading = { isCreating }
334- isDisabled = { selectFiles . length === 0 }
332+ isDisabled = { successFiles . length === 0 || uploading }
335333 onClick = { handleSubmit ( onCreate ) }
336334 >
337335 { t ( 'common:Create' ) }
0 commit comments