diff --git a/src/renderer/src/components/Popups/MultiSelectionPopup.tsx b/src/renderer/src/components/Popups/MultiSelectionPopup.tsx index b83fe7b9d6..2dbbed1176 100644 --- a/src/renderer/src/components/Popups/MultiSelectionPopup.tsx +++ b/src/renderer/src/components/Popups/MultiSelectionPopup.tsx @@ -1,6 +1,6 @@ -import { CloseOutlined, CopyOutlined, DeleteOutlined, SaveOutlined } from '@ant-design/icons' import { useChatContext } from '@renderer/pages/home/Messages/ChatContext' import { Button, Tooltip } from 'antd' +import { Copy, Save, Trash, X } from 'lucide-react' import { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -29,17 +29,17 @@ const MultiSelectActionPopup: FC = () => { {t('common.selectedMessages', { count: selectedMessageIds.length })} - } disabled={isActionDisabled} onClick={() => handleAction('save')} /> + } disabled={isActionDisabled} onClick={() => handleAction('save')} /> - } disabled={isActionDisabled} onClick={() => handleAction('copy')} /> + } disabled={isActionDisabled} onClick={() => handleAction('copy')} /> - } onClick={() => handleAction('delete')} /> + } onClick={() => handleAction('delete')} /> - } onClick={handleClose} /> + } onClick={handleClose} /> @@ -73,7 +73,7 @@ const ActionButton = styled(Button)` align-items: center; justify-content: center; padding: 8px 16px; - border-radius: 4px; + border-radius: 50%; .anticon { font-size: 16px; } diff --git a/src/renderer/src/hooks/useTopic.ts b/src/renderer/src/hooks/useTopic.ts index 06c5fd89ee..611ab68555 100644 --- a/src/renderer/src/hooks/useTopic.ts +++ b/src/renderer/src/hooks/useTopic.ts @@ -1,5 +1,6 @@ import db from '@renderer/databases' import i18n from '@renderer/i18n' +import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { deleteMessageFiles } from '@renderer/services/MessagesService' import store from '@renderer/store' import { updateTopic } from '@renderer/store/assistants' @@ -27,6 +28,7 @@ export function useActiveTopic(_assistant: Assistant, topic?: Topic) { useEffect(() => { if (activeTopic) { store.dispatch(loadTopicMessagesThunk(activeTopic.id)) + EventEmitter.emit(EVENT_NAMES.CHANGE_TOPIC, activeTopic) } }, [activeTopic]) diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index bdb0ee1cc8..b01ebeccbb 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -395,7 +395,7 @@ "save": "保存", "search": "搜索", "select": "选择", - "selectedMessages": "选中{{count}}条消息", + "selectedMessages": "选中 {{count}} 条消息", "topics": "话题", "warning": "警告", "you": "用户", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index f5da40ff4a..b0b9444b3a 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -395,7 +395,7 @@ "save": "儲存", "search": "搜尋", "select": "選擇", - "selectedMessages": "选中{{count}}条消息", + "selectedMessages": "选中 {{count}} 条消息", "topics": "話題", "warning": "警告", "you": "您", diff --git a/src/renderer/src/pages/home/Messages/ChatContext.tsx b/src/renderer/src/pages/home/Messages/ChatContext.tsx index 221fd22adb..13e06a0720 100644 --- a/src/renderer/src/pages/home/Messages/ChatContext.tsx +++ b/src/renderer/src/pages/home/Messages/ChatContext.tsx @@ -1,10 +1,11 @@ import { useMessageOperations } from '@renderer/hooks/useMessageOperations' +import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { RootState } from '@renderer/store' import { messageBlocksSelectors } from '@renderer/store/messageBlock' import { selectMessagesForTopic } from '@renderer/store/newMessage' import { Topic } from '@renderer/types' import { Modal } from 'antd' -import { createContext, FC, ReactNode, use, useCallback, useState } from 'react' +import { createContext, FC, ReactNode, use, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { useStore } from 'react-redux' @@ -46,6 +47,11 @@ export const ChatProvider: FC = ({ children, activeTopic }) = const store = useStore() + useEffect(() => { + const unsubscribe = EventEmitter.on(EVENT_NAMES.CHANGE_TOPIC, () => setIsMultiSelectMode(false)) + return () => unsubscribe() + }, []) + const toggleMultiSelectMode = (value: boolean) => { setIsMultiSelectMode(value) if (!value) { diff --git a/src/renderer/src/pages/home/Messages/MessageGroup.tsx b/src/renderer/src/pages/home/Messages/MessageGroup.tsx index 8f36fba285..65ac5fb6fa 100644 --- a/src/renderer/src/pages/home/Messages/MessageGroup.tsx +++ b/src/renderer/src/pages/home/Messages/MessageGroup.tsx @@ -10,7 +10,6 @@ import { Popover } from 'antd' import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import styled, { css } from 'styled-components' -import { useChatContext } from './ChatContext' import MessageItem from './Message' import MessageGroupMenuBar from './MessageGroupMenuBar' import SelectableMessage from './MessageSelect' @@ -25,8 +24,6 @@ interface Props { const MessageGroup = ({ messages, topic, hidePresetMessages, registerMessageElement }: Props) => { const { editMessage } = useMessageOperations(topic) const { multiModelMessageStyle: multiModelMessageStyleSetting, gridColumns, gridPopoverTrigger } = useSettings() - const { isMultiSelectMode, selectedMessageIds, handleSelectMessage } = useChatContext() - const selectedMessages = useMemo(() => new Set(selectedMessageIds), [selectedMessageIds]) const [multiModelMessageStyle, setMultiModelMessageStyle] = useState( messages[0].multiModelMessageStyle || multiModelMessageStyleSetting @@ -201,10 +198,6 @@ const MessageGroup = ({ messages, topic, hidePresetMessages, registerMessageElem multiModelMessageStyle, isHorizontal, selectedMessageId, - isMultiSelectMode, - selectedMessages, - registerMessageElement, - handleSelectMessage, gridPopoverTrigger ] ) diff --git a/src/renderer/src/pages/home/Messages/MessageSelect.tsx b/src/renderer/src/pages/home/Messages/MessageSelect.tsx index ab2fac4f49..3a4549d7a3 100644 --- a/src/renderer/src/pages/home/Messages/MessageSelect.tsx +++ b/src/renderer/src/pages/home/Messages/MessageSelect.tsx @@ -50,7 +50,8 @@ const Container = styled.div` ` const CheckboxWrapper = styled.div` - padding: 10px 0 10px 20px; + padding: 22px 0 10px 20px; + margin-right: -10px; display: flex; align-items: flex-start; ` diff --git a/src/renderer/src/services/EventService.ts b/src/renderer/src/services/EventService.ts index 5558d1c67a..27e552506c 100644 --- a/src/renderer/src/services/EventService.ts +++ b/src/renderer/src/services/EventService.ts @@ -28,5 +28,6 @@ export const EVENT_NAMES = { RESEND_MESSAGE: 'RESEND_MESSAGE', SHOW_MODEL_SELECTOR: 'SHOW_MODEL_SELECTOR', QUOTE_TEXT: 'QUOTE_TEXT', - EDIT_CODE_BLOCK: 'EDIT_CODE_BLOCK' + EDIT_CODE_BLOCK: 'EDIT_CODE_BLOCK', + CHANGE_TOPIC: 'CHANGE_TOPIC' }