diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index c7b97ae05a..cae4237ffd 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -1,7 +1,6 @@ import SvgSpinners180Ring from '@renderer/components/Icons/SvgSpinners180Ring' import Scrollbar from '@renderer/components/Scrollbar' import { LOAD_MORE_COUNT } from '@renderer/config/constant' -import db from '@renderer/databases' import { useAssistant } from '@renderer/hooks/useAssistant' import { useChatContext } from '@renderer/hooks/useChatContext' import { useMessageOperations, useTopicMessages } from '@renderer/hooks/useMessageOperations' @@ -12,7 +11,6 @@ import { autoRenameTopic, getTopic } from '@renderer/hooks/useTopic' import SelectionBox from '@renderer/pages/home/Messages/SelectionBox' import { getDefaultTopic } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import FileManager from '@renderer/services/FileManager' import { getContextCount, getGroupedMessages, getUserMessage } from '@renderer/services/MessagesService' import { estimateHistoryTokens } from '@renderer/services/TokenService' import store, { useAppDispatch } from '@renderer/store' @@ -104,22 +102,14 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic, o async (data: Topic) => { const defaultTopic = getDefaultTopic(assistant.id) - async function handleTopicRelatedFiles(topicId: string) { - const topicFiles = await db.files.where({ topicId }).toArray() - if (topicFiles.length > 0) { - await Promise.all(topicFiles.map((file) => FileManager.deleteFile(file.id, false))) - } - } - if (data && data.id !== topic.id) { await clearTopicMessages(data.id) - await handleTopicRelatedFiles(data.id) updateTopic({ ...data, name: defaultTopic.name } as Topic) return } await clearTopicMessages() - await handleTopicRelatedFiles(topic.id) + setDisplayMessages([]) const _topic = getTopic(assistant, topic.id) diff --git a/src/renderer/src/services/FileManager.ts b/src/renderer/src/services/FileManager.ts index c76254a74c..beda045a81 100644 --- a/src/renderer/src/services/FileManager.ts +++ b/src/renderer/src/services/FileManager.ts @@ -8,7 +8,8 @@ import dayjs from 'dayjs' class FileManager { static async selectFiles(options?: Electron.OpenDialogOptions): Promise { - return await window.api.file.select(options) + const files = await window.api.file.select(options) + return files } static async addFile(file: FileType): Promise { diff --git a/src/renderer/src/store/thunk/messageThunk.ts b/src/renderer/src/store/thunk/messageThunk.ts index 175e63c0f4..0932ff929d 100644 --- a/src/renderer/src/store/thunk/messageThunk.ts +++ b/src/renderer/src/store/thunk/messageThunk.ts @@ -2,6 +2,7 @@ import db from '@renderer/databases' import { autoRenameTopic } from '@renderer/hooks/useTopic' import { fetchChatCompletion } from '@renderer/services/ApiService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' +import FileManager from '@renderer/services/FileManager' import { NotificationService } from '@renderer/services/NotificationService' import { createStreamProcessor, type StreamProcessorCallbacks } from '@renderer/services/StreamProcessingService' import { estimateMessagesUsage } from '@renderer/services/TokenService' @@ -37,7 +38,7 @@ import { import { getTopicQueue, waitForTopicQueue } from '@renderer/utils/queue' import { isOnHomePage } from '@renderer/utils/window' import { t } from 'i18next' -import { throttle } from 'lodash' +import { isEmpty, throttle } from 'lodash' import { LRUCache } from 'lru-cache' import type { AppDispatch, RootState } from '../index' @@ -193,6 +194,19 @@ export const cleanupMultipleBlocks = (dispatch: AppDispatch, blockIds: string[]) blockIds.forEach((id) => { cancelThrottledBlockUpdate(id) }) + + const getBlocksFiles = async (blockIds: string[]) => { + const blocks = await db.message_blocks.where('id').anyOf(blockIds).toArray() + const files = blocks.filter((block) => block.type === MessageBlockType.FILE).map((block) => block.file) + return isEmpty(files) ? [] : files + } + + const cleanupFiles = async (files: FileType[]) => { + await Promise.all(files.map((file) => FileManager.deleteFile(file.id, false))) + } + + getBlocksFiles(blockIds).then(cleanupFiles) + if (blockIds.length > 0) { dispatch(removeManyBlocks(blockIds)) }