diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 36bfa02f..34af3c75 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -667,7 +667,8 @@ "footer": { "esc": "Press ESC {{action}}", "esc_close": "close the window", - "esc_back": "back" + "esc_back": "back", + "copy_last_message": "Press C to copy" } } } diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 464c86e7..d3cb3b94 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -652,7 +652,8 @@ "footer": { "esc": "ESC キーを押して{{action}}", "esc_close": "ウィンドウを閉じる", - "esc_back": "戻る" + "esc_back": "戻る", + "copy_last_message": "C キーを押してコピー" } } } diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index c6f8e54e..d00468b2 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -666,7 +666,8 @@ "footer": { "esc": "Нажмите ESC {{action}}", "esc_close": "закрытия окна", - "esc_back": "возвращения" + "esc_back": "возвращения", + "copy_last_message": "Нажмите C для копирования" } } } diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 383e07ad..cd79aaf3 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -655,7 +655,8 @@ "footer": { "esc": "按 ESC {{action}}", "esc_close": "关闭窗口", - "esc_back": "返回" + "esc_back": "返回", + "copy_last_message": "按 C 键复制" } } } diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 9b6c9473..3922eed7 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -654,7 +654,8 @@ "footer": { "esc": "按 ESC {{action}}", "esc_close": "關閉窗口", - "esc_back": "返回" + "esc_back": "返回", + "copy_last_message": "按 C 鍵複製" } } } diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 2af74530..a730b6b6 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -133,6 +133,7 @@ const settingsSlice = createSlice({ }, setLanguage: (state, action: PayloadAction) => { state.language = action.payload + window.electron.ipcRenderer.send('miniwindow-reload') }, setProxyMode: (state, action: PayloadAction<'system' | 'custom' | 'none'>) => { state.proxyMode = action.payload diff --git a/src/renderer/src/windows/mini/chat/components/Messages.tsx b/src/renderer/src/windows/mini/chat/components/Messages.tsx index 52baf2ea..a41583db 100644 --- a/src/renderer/src/windows/mini/chat/components/Messages.tsx +++ b/src/renderer/src/windows/mini/chat/components/Messages.tsx @@ -1,10 +1,10 @@ import Scrollbar from '@renderer/components/Scrollbar' -import { useShortcut } from '@renderer/hooks/useShortcuts' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' import { getAssistantMessage } from '@renderer/services/MessagesService' import { Assistant, Message } from '@renderer/types' import { last } from 'lodash' import { FC, useCallback, useEffect, useRef, useState } from 'react' +import { useHotkeys } from 'react-hotkeys-hook' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -49,7 +49,7 @@ const Messages: FC = ({ assistant, route }) => { return () => unsubscribes.forEach((unsub) => unsub()) }, [assistant.id, onSendMessage]) - useShortcut('copy_last_message', () => { + useHotkeys('c', () => { const lastMessage = last(messages) if (lastMessage) { navigator.clipboard.writeText(lastMessage.content) diff --git a/src/renderer/src/windows/mini/home/HomeWindow.tsx b/src/renderer/src/windows/mini/home/HomeWindow.tsx index fec0c6e4..1daff314 100644 --- a/src/renderer/src/windows/mini/home/HomeWindow.tsx +++ b/src/renderer/src/windows/mini/home/HomeWindow.tsx @@ -7,7 +7,8 @@ import { EventEmitter } from '@renderer/services/EventService' import { uuid } from '@renderer/utils' import { Divider } from 'antd' import dayjs from 'dayjs' -import { FC, useCallback, useEffect, useRef, useState } from 'react' +import { isEmpty } from 'lodash' +import { FC, useCallback, useEffect, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -28,11 +29,10 @@ const HomeWindow: FC = () => { const { defaultModel: model } = useDefaultModel() const { language } = useSettings() const { t } = useTranslation() - const textRef = useRef(text) const referenceText = selectedText || clipboardText || text - textRef.current = referenceText === text ? text : `${referenceText}\n\n${text}` + const content = (referenceText === text ? text : `${referenceText}\n\n${text}`).trim() const onReadClipboard = useCallback(async () => { const text = await navigator.clipboard.readText() @@ -59,23 +59,25 @@ const HomeWindow: FC = () => { if (e.key === 'Enter') { e.preventDefault() - if (textRef.current.trim() === '') { - return + if (content) { + setRoute('chat') + onSendMessage() + setTimeout(() => setText(''), 100) } - setRoute('chat') - onSendMessage() - setTimeout(() => setText(''), 100) } } const onSendMessage = useCallback( async (prompt?: string) => { - const text = textRef.current.trim() + if (isEmpty(content)) { + return + } + setTimeout(() => { const message = { id: uuid(), role: 'user', - content: prompt ? `${prompt}\n\n${text}` : text, + content: prompt ? `${prompt}\n\n${content}` : content, assistantId: defaultAssistant.id, topicId: defaultAssistant.topics[0].id || uuid(), createdAt: dayjs().format('YYYY-MM-DD HH:mm:ss'), @@ -85,7 +87,7 @@ const HomeWindow: FC = () => { EventEmitter.emit(EVENT_NAMES.SEND_MESSAGE, message) }, 0) }, - [defaultAssistant] + [content, defaultAssistant.id, defaultAssistant.topics] ) const clearClipboard = () => { @@ -104,12 +106,8 @@ const HomeWindow: FC = () => { }) useEffect(() => { - window.electron.ipcRenderer.on('show-mini-window', () => { - onReadClipboard() - }) - + window.electron.ipcRenderer.on('show-mini-window', onReadClipboard) window.electron.ipcRenderer.on('selection-action', (_, { action, selectedText }) => { - console.debug('[HomeWindow] selection-action', action, selectedText) selectedText && setSelectedText(selectedText) action && setRoute(action) action === 'chat' && onSendMessage() @@ -176,7 +174,7 @@ const HomeWindow: FC = () => {
- +