From 1bf147fa6a026aca153e4a8059bd3f88eeda6a2e Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 2 Jan 2025 16:39:30 +0800 Subject: [PATCH] refactor: improve model generation and handling functionality --- src/renderer/src/components/app/Sidebar.tsx | 10 ++---- src/renderer/src/hooks/useRuntime.ts | 14 ++++++++- .../src/pages/home/Inputbar/Inputbar.tsx | 13 +++----- .../pages/home/Messages/MessageMenubar.tsx | 11 +++++-- .../src/pages/home/Tabs/AssistantsTab.tsx | 12 +++---- .../src/pages/home/Tabs/TopicsTab.tsx | 31 +++++++------------ 6 files changed, 43 insertions(+), 48 deletions(-) diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index f181505a..80751ec6 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -3,7 +3,7 @@ import { isMac } from '@renderer/config/constant' import { isLocalAi, UserAvatar } from '@renderer/config/env' import { useTheme } from '@renderer/context/ThemeProvider' import useAvatar from '@renderer/hooks/useAvatar' -import { useRuntime } from '@renderer/hooks/useRuntime' +import { modelGenerating, useRuntime } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { Tooltip } from 'antd' import { Avatar } from 'antd' @@ -19,7 +19,6 @@ const Sidebar: FC = () => { const { pathname } = useLocation() const avatar = useAvatar() const { minappShow } = useRuntime() - const { generating } = useRuntime() const { t } = useTranslation() const navigate = useNavigate() const { windowStyle, showMinappIcon, showFilesIcon } = useSettings() @@ -33,11 +32,8 @@ const Sidebar: FC = () => { const macTransparentWindow = isMac && windowStyle === 'transparent' const sidebarBgColor = macTransparentWindow ? 'transparent' : 'var(--navbar-background)' - const to = (path: string) => { - if (generating) { - window.message.warning({ content: t('message.switch.disabled'), key: 'switch-assistant' }) - return - } + const to = async (path: string) => { + await modelGenerating() navigate(path) } diff --git a/src/renderer/src/hooks/useRuntime.ts b/src/renderer/src/hooks/useRuntime.ts index d7ed75bf..c82d8152 100644 --- a/src/renderer/src/hooks/useRuntime.ts +++ b/src/renderer/src/hooks/useRuntime.ts @@ -1,5 +1,17 @@ -import { useAppSelector } from '@renderer/store' +import i18n from '@renderer/i18n' +import store, { useAppSelector } from '@renderer/store' export function useRuntime() { return useAppSelector((state) => state.runtime) } + +export function modelGenerating() { + const generating = store.getState().runtime.generating + + if (generating) { + window.message.warning({ content: i18n.t('message.switch.disabled'), key: 'model-generating' }) + return Promise.reject() + } + + return Promise.resolve() +} diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index 87e9394e..940e49ac 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -13,7 +13,7 @@ import TranslateButton from '@renderer/components/TranslateButton' import { isVisionModel, isWebSearchModel } from '@renderer/config/models' import db from '@renderer/databases' import { useAssistant } from '@renderer/hooks/useAssistant' -import { useRuntime } from '@renderer/hooks/useRuntime' +import { modelGenerating, useRuntime } from '@renderer/hooks/useRuntime' import { useMessageStyle, useSettings } from '@renderer/hooks/useSettings' import { useShortcut, useShortcutDisplay } from '@renderer/hooks/useShortcuts' import { useShowTopics } from '@renderer/hooks/useStore' @@ -97,9 +97,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { _base = selectedKnowledgeBase const sendMessage = useCallback(async () => { - if (generating) { - return - } + await modelGenerating() if (inputEmpty) { return @@ -207,10 +205,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { } const addNewTopic = useCallback(async () => { - if (generating) { - window.message.warning({ content: t('message.switch.disabled'), key: 'generating' }) - return - } + await modelGenerating() const topic = getDefaultTopic(assistant.id) @@ -226,7 +221,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { setActiveTopic(topic) clickAssistantToShowTopic && setTimeout(() => EventEmitter.emit(EVENT_NAMES.SHOW_TOPIC_SIDEBAR), 0) - }, [addTopic, assistant, clickAssistantToShowTopic, generating, setActiveTopic, setModel, t]) + }, [addTopic, assistant, clickAssistantToShowTopic, setActiveTopic, setModel]) const clearTopic = async () => { if (generating) { diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 03d1beab..40a94e15 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -11,6 +11,7 @@ import { } from '@ant-design/icons' import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup' import TextEditPopup from '@renderer/components/Popups/TextEditPopup' +import { modelGenerating } from '@renderer/hooks/useRuntime' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { translateText } from '@renderer/services/TranslateService' import { Message, Model } from '@renderer/types' @@ -69,7 +70,8 @@ const MessageMenubar: FC = (props) => { [setModel] ) - const onNewBranch = useCallback(() => { + const onNewBranch = useCallback(async () => { + await modelGenerating() EventEmitter.emit(EVENT_NAMES.NEW_BRANCH, index) window.message.success({ content: t('chat.message.new.branch.created'), @@ -77,7 +79,8 @@ const MessageMenubar: FC = (props) => { }) }, [index, t]) - const onResend = useCallback(() => { + const onResend = useCallback(async () => { + await modelGenerating() const _messages = onGetMessages?.() || [] const index = _messages.findIndex((m) => m.id === message.id) const nextIndex = index + 1 @@ -173,11 +176,13 @@ const MessageMenubar: FC = (props) => { ) const onAtModelRegenerate = async () => { + await modelGenerating() const selectedModel = await SelectModelPopup.show({ model }) selectedModel && onRegenerate(selectedModel) } - const onDeleteAndRegenerate = () => { + const onDeleteAndRegenerate = async () => { + await modelGenerating() onEditMessage?.({ ...message, content: '', diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index f33c1dd7..16737782 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -4,6 +4,7 @@ import CopyIcon from '@renderer/components/Icons/CopyIcon' import Scrollbar from '@renderer/components/Scrollbar' import { useAgents } from '@renderer/hooks/useAgents' import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant' +import { modelGenerating } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings' import { getDefaultTopic } from '@renderer/services/AssistantService' @@ -117,13 +118,8 @@ const Assistants: FC = ({ ) const onSwitchAssistant = useCallback( - (assistant: Assistant): any => { - if (generating) { - return window.message.warning({ - content: t('message.switch.disabled'), - key: 'switch-assistant' - }) - } + async (assistant: Assistant) => { + await modelGenerating() if (topicPosition === 'left' && clickAssistantToShowTopic) { EventEmitter.emit(EVENT_NAMES.SWITCH_TOPIC_SIDEBAR) @@ -131,7 +127,7 @@ const Assistants: FC = ({ setActiveAssistant(assistant) }, - [clickAssistantToShowTopic, generating, setActiveAssistant, t, topicPosition] + [clickAssistantToShowTopic, setActiveAssistant, topicPosition] ) return ( diff --git a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx index 2682ed58..2d613855 100644 --- a/src/renderer/src/pages/home/Tabs/TopicsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/TopicsTab.tsx @@ -10,11 +10,12 @@ import DragableList from '@renderer/components/DragableList' import PromptPopup from '@renderer/components/Popups/PromptPopup' import Scrollbar from '@renderer/components/Scrollbar' import { useAssistant, useAssistants } from '@renderer/hooks/useAssistant' +import { modelGenerating } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import { TopicManager } from '@renderer/hooks/useTopic' import { fetchMessagesSummary } from '@renderer/services/ApiService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import store, { useAppSelector } from '@renderer/store' +import store from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import { Assistant, Topic } from '@renderer/types' import { exportTopicAsMarkdown, topicToMarkdown } from '@renderer/utils/export' @@ -35,46 +36,36 @@ const Topics: FC = ({ assistant: _assistant, activeTopic, setActiveTopic const { assistants } = useAssistants() const { assistant, removeTopic, moveTopic, updateTopic, updateTopics } = useAssistant(_assistant.id) const { t } = useTranslation() - const generating = useAppSelector((state) => state.runtime.generating) const { showTopicTime, topicPosition } = useSettings() const borderRadius = showTopicTime ? 12 : 17 const onDeleteTopic = useCallback( - (topic: Topic) => { - if (generating) { - window.message.warning({ content: t('message.switch.disabled'), key: 'generating' }) - return - } + async (topic: Topic) => { + await modelGenerating() const index = findIndex(assistant.topics, (t) => t.id === topic.id) setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1]) removeTopic(topic) }, - [assistant.topics, generating, removeTopic, setActiveTopic, t] + [assistant.topics, removeTopic, setActiveTopic] ) const onMoveTopic = useCallback( - (topic: Topic, toAssistant: Assistant) => { - if (generating) { - window.message.warning({ content: t('message.switch.disabled'), key: 'generating' }) - return - } + async (topic: Topic, toAssistant: Assistant) => { + await modelGenerating() const index = findIndex(assistant.topics, (t) => t.id === topic.id) setActiveTopic(assistant.topics[index + 1 === assistant.topics.length ? 0 : index + 1]) moveTopic(topic, toAssistant) }, - [assistant.topics, generating, moveTopic, setActiveTopic, t] + [assistant.topics, moveTopic, setActiveTopic] ) const onSwitchTopic = useCallback( - (topic: Topic) => { - if (generating) { - window.message.warning({ content: t('message.switch.disabled'), key: 'generating' }) - return - } + async (topic: Topic) => { + await modelGenerating() setActiveTopic(topic) }, - [generating, setActiveTopic, t] + [setActiveTopic] ) const onClearMessages = useCallback(() => {