feat(文件选择): 增强文件选择功能并添加清除文件方法

- 为文件选择API添加返回类型声明
- 完善文件选择回调函数的文档注释
- 修改文件选择逻辑以返回选中的文件数组
- 添加清除文件列表的方法
This commit is contained in:
icarus 2025-08-22 17:42:44 +08:00
parent 100dc4e500
commit 64ab5ce017
2 changed files with 29 additions and 10 deletions

View File

@ -134,7 +134,8 @@ const api = {
checkS3Connection: (s3Config: S3Config) => ipcRenderer.invoke(IpcChannel.Backup_CheckS3Connection, s3Config) checkS3Connection: (s3Config: S3Config) => ipcRenderer.invoke(IpcChannel.Backup_CheckS3Connection, s3Config)
}, },
file: { file: {
select: (options?: OpenDialogOptions) => ipcRenderer.invoke(IpcChannel.File_Select, options), select: (options?: OpenDialogOptions): Promise<FileMetadata[] | null> =>
ipcRenderer.invoke(IpcChannel.File_Select, options),
upload: (file: FileMetadata) => ipcRenderer.invoke(IpcChannel.File_Upload, file), upload: (file: FileMetadata) => ipcRenderer.invoke(IpcChannel.File_Upload, file),
delete: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Delete, fileId), delete: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Delete, fileId),
deleteDir: (dirPath: string) => ipcRenderer.invoke(IpcChannel.File_DeleteDir, dirPath), deleteDir: (dirPath: string) => ipcRenderer.invoke(IpcChannel.File_DeleteDir, dirPath),

View File

@ -22,26 +22,36 @@ export const useFiles = (props?: Props) => {
} }
}, [props?.extensions]) }, [props?.extensions])
/**
*
* @param multipleSelections - true
* @returns
* @description
* 1.
* 2.
* 3.
* 4.
*/
const onSelectFile = useCallback( const onSelectFile = useCallback(
async (multipleSelections: boolean = true) => { async (multipleSelections: boolean = true): Promise<FileMetadata[]> => {
if (selecting) { if (selecting) {
return return []
} }
const supportedExtensions = extensions ?? ['*']
const selectProps: Electron.OpenDialogOptions['properties'] = multipleSelections const selectProps: Electron.OpenDialogOptions['properties'] = multipleSelections
? ['openFile', 'multiSelections'] ? ['openFile', 'multiSelections']
: ['openFile'] : ['openFile']
// when the number of extensions is greater than 20, use *.* to avoid selecting window lag // when the number of extensions is greater than 20, use *.* to avoid selecting window lag
const useAllFiles = supportedExtensions.length > 20 const useAllFiles = extensions.length > 20
setSelecting(true) setSelecting(true)
const _files: FileMetadata[] = await window.api.file.select({ const _files = await window.api.file.select({
properties: selectProps, properties: selectProps,
filters: [ filters: [
{ {
name: 'Files', name: 'Files',
extensions: useAllFiles ? ['*'] : supportedExtensions.map((i) => i.replace('.', '')) extensions: useAllFiles ? ['*'] : extensions.map((i) => i.replace('.', ''))
} }
] ]
}) })
@ -50,9 +60,9 @@ export const useFiles = (props?: Props) => {
if (_files) { if (_files) {
if (!useAllFiles) { if (!useAllFiles) {
setFiles([...files, ..._files]) setFiles([...files, ..._files])
return return _files
} }
const supportedFiles = await filterSupportedFiles(_files, supportedExtensions) const supportedFiles = await filterSupportedFiles(_files, extensions)
if (supportedFiles.length > 0) { if (supportedFiles.length > 0) {
setFiles([...files, ...supportedFiles]) setFiles([...files, ...supportedFiles])
} }
@ -65,14 +75,22 @@ export const useFiles = (props?: Props) => {
}) })
}) })
} }
return _files
} else {
return []
} }
}, },
[extensions, files, selecting, t] [extensions, files, selecting, t]
) )
const clearFiles = useCallback(() => {
setFiles([])
}, [])
return { return {
files, files,
setFiles, setFiles,
onSelectFile onSelectFile,
clearFiles
} }
} }