diff --git a/src/view/Ask.tsx b/src/view/Ask.tsx index f4ae0a0ab..fd20b6f4f 100644 --- a/src/view/Ask.tsx +++ b/src/view/Ask.tsx @@ -1,15 +1,36 @@ import { useState, useEffect, useRef } from 'react'; import { invoke } from '@tauri-apps/api/core'; +import { Store } from '@tauri-apps/plugin-store'; import { useHotkeys } from 'react-hotkeys-hook'; import useInfo from '~hooks/useInfo'; import SendIcon from '~icons/Send'; import debounce from 'lodash/debounce'; +// Create or load the store file once +const settingsStore = new Store('.settings.dat'); + export default function ChatInput() { const inputRef = useRef(null); const [message, setMessage] = useState(''); + const [disableEnterToSend, setDisableEnterToSend] = useState(false); const { isMac } = useInfo(); + // Load user preference from Tauri store + useEffect(() => { + (async () => { + const saved = await settingsStore.get('disableEnterToSend'); + if (typeof saved === 'boolean') setDisableEnterToSend(saved); + })(); + }, []); + + // Persist toggle changes + const handleToggle = async (checked: boolean) => { + setDisableEnterToSend(checked); + await settingsStore.set('disableEnterToSend', checked); + await settingsStore.save(); + }; + + // Sync message with backend (debounced) useEffect(() => { const syncMessage = debounce(async () => { try { @@ -17,25 +38,44 @@ export default function ChatInput() { } catch (error) { console.error('Error syncing message:', error); } - }, 300); // Debounce by 300ms + }, 300); syncMessage(); - return () => syncMessage.cancel(); // Cleanup debounce on unmount + return () => syncMessage.cancel(); }, [message]); - useHotkeys(isMac ? 'meta+enter' : 'ctrl+enter', async (event: KeyboardEvent) => { - event.preventDefault(); - await handleSend(); - }, { - enableOnFormTags: true, - }, [message]); + // Ctrl+Enter or Cmd+Enter sends message + useHotkeys( + isMac ? 'meta+enter' : 'ctrl+enter', + async (event: KeyboardEvent) => { + event.preventDefault(); + await handleSend(); + }, + { enableOnFormTags: true }, + [message] + ); const handleInput = (e: React.ChangeEvent) => { setMessage(e.target.value); }; + // Handle Enter or Shift+Enter + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + if (disableEnterToSend) { + // Insert a line break instead of sending + e.preventDefault(); + setMessage((prev) => prev + '\n'); + } else { + // Send message directly + e.preventDefault(); + handleSend(); + } + } + }; + const handleSend = async () => { - if (!message) return; + if (!message.trim()) return; try { await invoke('ask_send', { message: JSON.stringify(message) }); } catch (error) { @@ -49,22 +89,41 @@ export default function ChatInput() { }; return ( -
-