fix: quick assistant bugs
This commit is contained in:
parent
9c55b4516c
commit
88cc783a95
@ -305,7 +305,9 @@ export class WindowService {
|
||||
if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
|
||||
this.miniWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + '#/mini')
|
||||
} else {
|
||||
this.miniWindow.loadFile(join(__dirname, '../renderer/index.html') + '#/mini')
|
||||
this.miniWindow.loadFile(join(__dirname, '../renderer/index.html'), {
|
||||
hash: '#/mini'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@ export function useSettings() {
|
||||
},
|
||||
setTray(isActive: boolean) {
|
||||
dispatch(setTray(isActive))
|
||||
window.api.setTray(isActive)
|
||||
},
|
||||
setTheme(theme: ThemeMode) {
|
||||
dispatch(setTheme(theme))
|
||||
|
||||
@ -14,7 +14,7 @@ import { SettingContainer, SettingDivider, SettingGroup, SettingRow, SettingRowT
|
||||
const QuickAssistantSettings: FC = () => {
|
||||
const { t } = useTranslation()
|
||||
const { theme } = useTheme()
|
||||
const { enableQuickAssistant, clickTrayToShowQuickAssistant, setTray } = useSettings()
|
||||
const { enableQuickAssistant, clickTrayToShowQuickAssistant, tray, setTray } = useSettings()
|
||||
const dispatch = useAppDispatch()
|
||||
|
||||
const handleEnableQuickAssistant = async (enable: boolean) => {
|
||||
@ -32,15 +32,16 @@ const QuickAssistantSettings: FC = () => {
|
||||
key: 'quick-assistant-info'
|
||||
})
|
||||
}
|
||||
|
||||
if (enable && clickTrayToShowQuickAssistant) {
|
||||
setTray(true)
|
||||
}
|
||||
}
|
||||
|
||||
const handleClickTrayToShowQuickAssistant = async (checked: boolean) => {
|
||||
dispatch(setClickTrayToShowQuickAssistant(checked))
|
||||
await window.api.config.set('clickTrayToShowQuickAssistant', checked)
|
||||
if (checked) {
|
||||
setTray(true)
|
||||
window.api.setTray(true)
|
||||
}
|
||||
checked && setTray(true)
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@ -847,6 +847,7 @@ const migrateConfig = {
|
||||
})
|
||||
|
||||
state.settings.enableQuickAssistant = false
|
||||
state.settings.clickTrayToShowQuickAssistant = true
|
||||
|
||||
return state
|
||||
}
|
||||
|
||||
@ -12,7 +12,7 @@ import styled from 'styled-components'
|
||||
interface Props {
|
||||
message: Message
|
||||
index?: number
|
||||
total?: number
|
||||
total: number
|
||||
route: string
|
||||
onGetMessages?: () => Message[]
|
||||
onSetMessages?: Dispatch<SetStateAction<Message[]>>
|
||||
@ -36,6 +36,8 @@ const MessageItem: FC<Props> = ({ message: _message, index, total, route, onSetM
|
||||
|
||||
const messageBackground = getMessageBackground(true, isAssistantMessage)
|
||||
|
||||
const maxWidth = window.location.hash === '#/mini' ? '480px' : '100%'
|
||||
|
||||
useEffect(() => {
|
||||
if (onGetMessages && onSetMessages) {
|
||||
if (message.status === 'sending') {
|
||||
@ -70,7 +72,7 @@ const MessageItem: FC<Props> = ({ message: _message, index, total, route, onSetM
|
||||
<MessageContainer
|
||||
key={message.id}
|
||||
ref={messageContainerRef}
|
||||
style={{ ...(isBubbleStyle ? { alignItems: isAssistantMessage ? 'start' : 'end' } : {}) }}>
|
||||
style={{ ...(isBubbleStyle ? { alignItems: isAssistantMessage ? 'start' : 'end' } : {}), maxWidth }}>
|
||||
<MessageContentContainer
|
||||
className="message-content-container"
|
||||
style={{
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
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 { useTranslation } from 'react-i18next'
|
||||
import styled from 'styled-components'
|
||||
|
||||
import MessageItem from './Message'
|
||||
@ -22,6 +25,8 @@ const Messages: FC<Props> = ({ assistant, route }) => {
|
||||
const containerRef = useRef<HTMLDivElement>(null)
|
||||
const messagesRef = useRef(messages)
|
||||
|
||||
const { t } = useTranslation()
|
||||
|
||||
messagesRef.current = messages
|
||||
|
||||
const onSendMessage = useCallback(
|
||||
@ -44,6 +49,14 @@ const Messages: FC<Props> = ({ assistant, route }) => {
|
||||
return () => unsubscribes.forEach((unsub) => unsub())
|
||||
}, [assistant.id, onSendMessage])
|
||||
|
||||
useShortcut('copy_last_message', () => {
|
||||
const lastMessage = last(messages)
|
||||
if (lastMessage) {
|
||||
navigator.clipboard.writeText(lastMessage.content)
|
||||
window.message.success(t('message.copy.success'))
|
||||
}
|
||||
})
|
||||
|
||||
return (
|
||||
<Container id="messages" key={assistant.id} ref={containerRef}>
|
||||
{[...messages].reverse().map((message, index) => (
|
||||
|
||||
@ -30,9 +30,9 @@ const HomeWindow: FC = () => {
|
||||
const { t } = useTranslation()
|
||||
const textRef = useRef(text)
|
||||
|
||||
const referenceText = selectedText || clipboardText
|
||||
const referenceText = selectedText || clipboardText || text
|
||||
|
||||
textRef.current = `${referenceText}\n\n${text}`
|
||||
textRef.current = referenceText === text ? text : `${referenceText}\n\n${text}`
|
||||
|
||||
const onReadClipboard = useCallback(async () => {
|
||||
const text = await navigator.clipboard.readText()
|
||||
@ -58,6 +58,7 @@ const HomeWindow: FC = () => {
|
||||
}
|
||||
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault()
|
||||
if (text.trim() === '') {
|
||||
return
|
||||
}
|
||||
@ -69,11 +70,12 @@ const HomeWindow: FC = () => {
|
||||
|
||||
const onSendMessage = useCallback(
|
||||
async (prompt?: string) => {
|
||||
const text = textRef.current.trim()
|
||||
setTimeout(() => {
|
||||
const message = {
|
||||
id: uuid(),
|
||||
role: 'user',
|
||||
content: prompt ? `${prompt}\n\n${textRef.current}` : textRef.current,
|
||||
content: prompt ? `${prompt}\n\n${text}` : text,
|
||||
assistantId: defaultAssistant.id,
|
||||
topicId: defaultAssistant.topics[0].id || uuid(),
|
||||
createdAt: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
||||
|
||||
@ -24,7 +24,7 @@ const InputBar: FC<InputBarProps> = ({ text, model, placeholder, handleKeyDown,
|
||||
bordered={false}
|
||||
autoFocus
|
||||
onKeyDown={handleKeyDown}
|
||||
onChange={(e) => setText(e.target.value)}
|
||||
onChange={(e) => setText(e.target.value.trim())}
|
||||
disabled={generating}
|
||||
/>
|
||||
</InputWrapper>
|
||||
|
||||
@ -9,7 +9,7 @@ import { Assistant, Message } from '@renderer/types'
|
||||
import { runAsyncFunction, uuid } from '@renderer/utils'
|
||||
import { Select, Space } from 'antd'
|
||||
import { isEmpty } from 'lodash'
|
||||
import { FC, useCallback, useEffect, useState } from 'react'
|
||||
import { FC, useCallback, useEffect, useRef, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import styled from 'styled-components'
|
||||
|
||||
@ -24,13 +24,20 @@ const Translate: FC<Props> = ({ text }) => {
|
||||
const [targetLanguage, setTargetLanguage] = useState(_targetLanguage)
|
||||
const { translateModel } = useDefaultModel()
|
||||
const { t } = useTranslation()
|
||||
const translatingRef = useRef(false)
|
||||
|
||||
_targetLanguage = targetLanguage
|
||||
|
||||
const translate = useCallback(async () => {
|
||||
if (!text.trim() || !translateModel) return
|
||||
|
||||
const assistant: Assistant = getDefaultTranslateAssistant(targetLanguage, text)
|
||||
if (translatingRef.current) return
|
||||
|
||||
try {
|
||||
translatingRef.current = true
|
||||
|
||||
const targetLang = await db.settings.get({ id: 'translate:target:language' })
|
||||
const assistant: Assistant = getDefaultTranslateAssistant(targetLang?.value || targetLanguage, text)
|
||||
const message: Message = {
|
||||
id: uuid(),
|
||||
role: 'user',
|
||||
@ -44,6 +51,13 @@ const Translate: FC<Props> = ({ text }) => {
|
||||
}
|
||||
|
||||
await fetchTranslate({ message, assistant, onResponse: setResult })
|
||||
|
||||
translatingRef.current = false
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
} finally {
|
||||
translatingRef.current = false
|
||||
}
|
||||
}, [text, targetLanguage, translateModel])
|
||||
|
||||
useEffect(() => {
|
||||
@ -75,9 +89,9 @@ const Translate: FC<Props> = ({ text }) => {
|
||||
style={{ width: 200 }}
|
||||
optionFilterProp="label"
|
||||
options={TranslateLanguageOptions}
|
||||
onChange={(value) => {
|
||||
onChange={async (value) => {
|
||||
await db.settings.put({ id: 'translate:target:language', value })
|
||||
setTargetLanguage(value)
|
||||
db.settings.put({ id: 'translate:target:language', value })
|
||||
}}
|
||||
optionRender={(option) => (
|
||||
<Space>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user