From 32024b3f50bec8d78db1278f2bd9794d9b249088 Mon Sep 17 00:00:00 2001 From: icarus Date: Fri, 22 Aug 2025 17:30:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor(useFiles):=20=E7=A7=BB=E9=99=A4multipl?= =?UTF-8?q?eSelections=E5=8F=82=E6=95=B0=E5=B9=B6=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=89=E6=8B=A9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将multipleSelections从组件props移动到onSelectFile方法参数中,简化组件接口 重构文件选择逻辑,移除不必要的useMemo,提升代码可维护性 --- src/renderer/src/hooks/useFiles.ts | 88 +++++++++++++++--------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/renderer/src/hooks/useFiles.ts b/src/renderer/src/hooks/useFiles.ts index d887cdad51..c37925ed5c 100644 --- a/src/renderer/src/hooks/useFiles.ts +++ b/src/renderer/src/hooks/useFiles.ts @@ -1,66 +1,66 @@ import { FileMetadata } from '@renderer/types' import { filterSupportedFiles } from '@renderer/utils' -import { useCallback, useMemo, useState } from 'react' +import { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' type Props = { /** 支持选择的扩展名 */ extensions?: string[] - multipleSelections?: boolean } -export const useFiles = ({ extensions, multipleSelections = true }: Props) => { +export const useFiles = ({ extensions }: Props) => { const { t } = useTranslation() const [files, setFiles] = useState([]) const [selecting, setSelecting] = useState(false) - const selectProps: Electron.OpenDialogOptions['properties'] = useMemo( - () => (multipleSelections ? ['openFile', 'multiSelections'] : ['openFile']), - [multipleSelections] - ) - - const onSelectFile = useCallback(async () => { - if (selecting) { - return - } - const supportedExtensions = extensions ?? ['*'] - - // when the number of extensions is greater than 20, use *.* to avoid selecting window lag - const useAllFiles = supportedExtensions.length > 20 - - setSelecting(true) - const _files: FileMetadata[] = await window.api.file.select({ - properties: selectProps, - filters: [ - { - name: 'Files', - extensions: useAllFiles ? ['*'] : supportedExtensions.map((i) => i.replace('.', '')) - } - ] - }) - setSelecting(false) - - if (_files) { - if (!useAllFiles) { - setFiles([...files, ..._files]) + const onSelectFile = useCallback( + async (multipleSelections: boolean = true) => { + if (selecting) { return } - const supportedFiles = await filterSupportedFiles(_files, supportedExtensions) - if (supportedFiles.length > 0) { - setFiles([...files, ...supportedFiles]) - } + const supportedExtensions = extensions ?? ['*'] + const selectProps: Electron.OpenDialogOptions['properties'] = multipleSelections + ? ['openFile', 'multiSelections'] + : ['openFile'] - if (supportedFiles.length !== _files.length) { - window.message.info({ - key: 'file_not_supported', - content: t('chat.input.file_not_supported_count', { - count: _files.length - supportedFiles.length + // when the number of extensions is greater than 20, use *.* to avoid selecting window lag + const useAllFiles = supportedExtensions.length > 20 + + setSelecting(true) + const _files: FileMetadata[] = await window.api.file.select({ + properties: selectProps, + filters: [ + { + name: 'Files', + extensions: useAllFiles ? ['*'] : supportedExtensions.map((i) => i.replace('.', '')) + } + ] + }) + setSelecting(false) + + if (_files) { + if (!useAllFiles) { + setFiles([...files, ..._files]) + return + } + const supportedFiles = await filterSupportedFiles(_files, supportedExtensions) + if (supportedFiles.length > 0) { + setFiles([...files, ...supportedFiles]) + } + + if (supportedFiles.length !== _files.length) { + window.message.info({ + key: 'file_not_supported', + content: t('chat.input.file_not_supported_count', { + count: _files.length - supportedFiles.length + }) }) - }) + } } - } - }, [extensions, files, selectProps, selecting, t]) + }, + [extensions, files, selecting, t] + ) return { files,