This commit is contained in:
Timothy Jaeryang Baek 2026-08-11 00:06:21 -06:00
parent 79382d1b19
commit 9122c24ea2
3 changed files with 44 additions and 36 deletions

View file

@ -518,6 +518,7 @@
return true;
});
};
const withSelectedText = (text: string) =>
embedded && selectedText?.trim()
? `${text}\n\nSelected note text for replace_note_content operations:\n${selectedText.trim()}`
@ -620,8 +621,7 @@
await setDefaults();
}
const chatInput = document.getElementById('chat-input');
chatInput?.focus();
messageInput?.focus({ preventScroll: true });
} else if (!embedded) {
await goto('/');
} else {
@ -670,7 +670,7 @@
await setDefaults();
loading = false;
await tick();
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
};
const onSelect = async (e) => {
@ -1212,7 +1212,7 @@
if (inputElement) {
messageInput?.setText(event.data.text);
inputElement.focus();
messageInput?.focus({ preventScroll: true });
}
}
@ -1389,8 +1389,7 @@
} catch (e) {}
}
const chatInput = document.getElementById('chat-input');
chatInput?.focus();
messageInput?.focus({ preventScroll: true });
};
init();
@ -2002,8 +2001,8 @@
$models.map((m) => m.id).includes(modelId) ? modelId : ''
);
const chatInput = document.getElementById('chat-input');
setTimeout(() => chatInput?.focus(), 0);
await tick();
messageInput?.focus({ preventScroll: true });
};
const loadChat = async () => {
@ -2643,8 +2642,7 @@
// focus on chat input (skip during voice call to avoid triggering mobile keyboard)
if (!$showCallOverlay) {
const chatInput = document.getElementById('chat-input');
chatInput?.focus();
messageInput?.focus({ preventScroll: true });
}
saveSessionSelectedModels();
@ -2699,13 +2697,13 @@
const message = error?.detail ?? error?.message ?? $i18n.t('Context compaction failed');
toast.error(message, { id: toastId });
} finally {
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
}
};
const handleStatusCommand = () => {
messageInput?.showStatus();
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
};
const handleModelCommand = (modelId = '') => {
@ -2720,7 +2718,7 @@
);
messageInput?.setText('');
prompt = '';
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
return;
}
@ -2729,7 +2727,7 @@
toast.error(`Model not found: ${modelId}`);
messageInput?.setText('');
prompt = '';
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
return;
}
@ -2739,7 +2737,7 @@
toast.success(`Model switched to: ${model.id}`);
messageInput?.setText('');
prompt = '';
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
};
const handleForkChat = async (messageId: string | null = null) => {
@ -2783,7 +2781,7 @@
} catch (error) {
toast.error(`${error}`, { id: toastId });
} finally {
document.getElementById('chat-input')?.focus();
messageInput?.focus({ preventScroll: true });
}
};
@ -4205,7 +4203,10 @@
</div>
</div>
{/if}
<div id={embedded ? messageInputDropzoneId : undefined} class="pb-2 z-10">
<div
id={embedded ? messageInputDropzoneId : undefined}
class="pb-2 z-10"
>
<MessageInput
bind:this={messageInput}
{history}

View file

@ -357,10 +357,14 @@
if (chatInput) {
chatInputElement.replaceVariables(variables);
chatInputElement.focus();
focus();
}
};
export const focus = (options: FocusOptions = {}) => {
chatInputElement?.focus(options);
};
export const setText = async (text?: string, cb?: (text: string) => void) => {
const chatInput = document.getElementById('chat-input');
@ -371,7 +375,7 @@
chatInputElement?.setText(text);
if (!$showCallOverlay) {
chatInputElement?.focus();
focus();
}
if (text !== '') {
@ -386,7 +390,7 @@
export const showStatus = async () => {
showStatusPanel = true;
await tick();
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
};
const formatTokenCount = (value: number) => {
@ -536,7 +540,7 @@
await tick();
if (chatInput) {
chatInput.focus();
focus({ preventScroll: true });
chatInput.dispatchEvent(new Event('input'));
const words = extractCurlyBraceWords(prompt);
@ -604,7 +608,7 @@
await tick();
await inputVariableHandler(text);
await tick();
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
};
let command = '';
@ -1220,7 +1224,7 @@
atSelectedModel = data;
}
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
},
insertTextHandler: insertTextAtCursor,
@ -1293,7 +1297,7 @@
atSelectedModel = data;
}
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
},
insertTextHandler: insertTextAtCursor,
@ -1331,7 +1335,7 @@
atSelectedModel = data;
}
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
},
insertTextHandler: insertTextAtCursor,
@ -1363,7 +1367,7 @@
render: getSuggestionRenderer(CommandSuggestionList, {
i18n,
onSelect: (e) => {
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
},
insertTextHandler: insertTextAtCursor,
@ -1382,7 +1386,7 @@
render: getSuggestionRenderer(CommandSuggestionList, {
i18n,
onSelect: (e) => {
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
},
insertTextHandler: insertTextAtCursor,
@ -1468,7 +1472,7 @@
}}
onClose={async () => {
await tick();
chatInputElement?.focus();
focus();
}}
/>
@ -1544,7 +1548,7 @@
recording = false;
await tick();
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
}}
onConfirm={async (data) => {
const { text, filename } = data;
@ -1554,7 +1558,7 @@
await tick();
await insertTextAtCursor(`${text}`);
await tick();
document.getElementById('chat-input')?.focus();
focus({ preventScroll: true });
if ($settings?.speechAutoSend ?? false) {
dispatch('submit', prompt);
@ -1565,7 +1569,6 @@
<form
class="w-full flex flex-col gap-1.5 {recording ? 'hidden' : ''}"
on:submit|preventDefault={() => {
// check if selectedModels support image input
dispatch('submit', prompt);
}}
>
@ -2424,7 +2427,7 @@
{/if}
{/if}
{#if prompt === '' && files.length === 0 && ($_user?.role === 'admin' || ($_user?.permissions?.chat?.call ?? true))}
{#if !embedded && prompt === '' && files.length === 0 && ($_user?.role === 'admin' || ($_user?.permissions?.chat?.call ?? true))}
<div class=" flex items-center">
<!-- {$i18n.t('Call')} -->
<Tooltip content={$i18n.t('Voice mode')}>

View file

@ -576,7 +576,7 @@
}
};
export const focus = () => {
export const focus = (options: FocusOptions = {}) => {
if (editor && editor.view) {
// Check if the editor is destroyed
if (editor.isDestroyed) {
@ -584,9 +584,13 @@
}
try {
editor.view.focus();
// Scroll to the current selection
editor.view.dispatch(editor.view.state.tr.scrollIntoView());
if (options.preventScroll && editor.view.dom instanceof HTMLElement) {
editor.view.dom.focus(options);
} else {
editor.view.focus();
// Scroll to the current selection
editor.view.dispatch(editor.view.state.tr.scrollIntoView());
}
} catch (e) {
// sometimes focusing throws an error, ignore
console.warn('Error focusing editor', e);