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)
},
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),
delete: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Delete, fileId),
deleteDir: (dirPath: string) => ipcRenderer.invoke(IpcChannel.File_DeleteDir, dirPath),

View File

@ -22,26 +22,36 @@ export const useFiles = (props?: Props) => {
}
}, [props?.extensions])
/**
*
* @param multipleSelections - true
* @returns
* @description
* 1.
* 2.
* 3.
* 4.
*/
const onSelectFile = useCallback(
async (multipleSelections: boolean = true) => {
async (multipleSelections: boolean = true): Promise<FileMetadata[]> => {
if (selecting) {
return
return []
}
const supportedExtensions = extensions ?? ['*']
const selectProps: Electron.OpenDialogOptions['properties'] = multipleSelections
? ['openFile', 'multiSelections']
: ['openFile']
// 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)
const _files: FileMetadata[] = await window.api.file.select({
const _files = await window.api.file.select({
properties: selectProps,
filters: [
{
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 (!useAllFiles) {
setFiles([...files, ..._files])
return
return _files
}
const supportedFiles = await filterSupportedFiles(_files, supportedExtensions)
const supportedFiles = await filterSupportedFiles(_files, extensions)
if (supportedFiles.length > 0) {
setFiles([...files, ...supportedFiles])
}
@ -65,14 +75,22 @@ export const useFiles = (props?: Props) => {
})
})
}
return _files
} else {
return []
}
},
[extensions, files, selecting, t]
)
const clearFiles = useCallback(() => {
setFiles([])
}, [])
return {
files,
setFiles,
onSelectFile
onSelectFile,
clearFiles
}
}