enh: make large text as file toggleable

This commit is contained in:
Timothy Jaeryang Baek 2024-11-18 20:58:18 -08:00
parent 11e78eac91
commit 9ea1c45641
3 changed files with 62 additions and 23 deletions

View File

@ -91,7 +91,7 @@
}); });
}; };
const uploadFileHandler = async (file) => { const uploadFileHandler = async (file, fullContext: boolean = false) => {
if ($_user?.role !== 'admin' && !($_user?.permissions?.chat?.file_upload ?? true)) { if ($_user?.role !== 'admin' && !($_user?.permissions?.chat?.file_upload ?? true)) {
toast.error($i18n.t('You do not have permission to upload files.')); toast.error($i18n.t('You do not have permission to upload files.'));
return null; return null;
@ -110,7 +110,8 @@
status: 'uploading', status: 'uploading',
size: file.size, size: file.size,
error: '', error: '',
itemId: tempItemId itemId: tempItemId,
...(fullContext ? { context: 'full' } : {})
}; };
if (fileItem.size == 0) { if (fileItem.size == 0) {
@ -619,6 +620,7 @@
id="chat-input" id="chat-input"
trim={true} trim={true}
placeholder={placeholder ? placeholder : $i18n.t('Send a Message')} placeholder={placeholder ? placeholder : $i18n.t('Send a Message')}
largeTextAsFile={$settings?.largeTextAsFile ?? false}
bind:value={prompt} bind:value={prompt}
shiftEnter={!$mobile || shiftEnter={!$mobile ||
!( !(
@ -773,16 +775,18 @@
reader.readAsDataURL(blob); reader.readAsDataURL(blob);
} else if (item.type === 'text/plain') { } else if (item.type === 'text/plain') {
e.preventDefault(); if ($settings?.largeTextAsFile ?? false) {
const text = await clipboardData.getData('text/plain'); e.preventDefault();
const text = await clipboardData.getData('text/plain');
if (text.length > PASTED_TEXT_CHARACTER_LIMIT) { if (text.length > PASTED_TEXT_CHARACTER_LIMIT) {
const blob = new Blob([text], { type: 'text/plain' }); const blob = new Blob([text], { type: 'text/plain' });
const file = new File([blob], `Pasted_Text_${Date.now()}.txt`, { const file = new File([blob], `Pasted_Text_${Date.now()}.txt`, {
type: 'text/plain' type: 'text/plain'
}); });
await uploadFileHandler(file); await uploadFileHandler(file, true);
}
} }
} }
} }
@ -961,16 +965,18 @@
reader.readAsDataURL(blob); reader.readAsDataURL(blob);
} else if (item.type === 'text/plain') { } else if (item.type === 'text/plain') {
e.preventDefault(); if ($settings?.largeTextAsFile ?? false) {
const text = await clipboardData.getData('text/plain'); e.preventDefault();
const text = await clipboardData.getData('text/plain');
if (text.length > PASTED_TEXT_CHARACTER_LIMIT) { if (text.length > PASTED_TEXT_CHARACTER_LIMIT) {
const blob = new Blob([text], { type: 'text/plain' }); const blob = new Blob([text], { type: 'text/plain' });
const file = new File([blob], `Pasted_Text_${Date.now()}.txt`, { const file = new File([blob], `Pasted_Text_${Date.now()}.txt`, {
type: 'text/plain' type: 'text/plain'
}); });
await uploadFileHandler(file); await uploadFileHandler(file, true);
}
} }
} }
} }

View File

@ -31,6 +31,7 @@
let defaultModelId = ''; let defaultModelId = '';
let showUsername = false; let showUsername = false;
let richTextInput = true; let richTextInput = true;
let largeTextAsFile = false;
let landingPageMode = ''; let landingPageMode = '';
let chatBubble = true; let chatBubble = true;
@ -139,6 +140,11 @@
saveSettings({ richTextInput }); saveSettings({ richTextInput });
}; };
const toggleLargeTextAsFile = async () => {
largeTextAsFile = !largeTextAsFile;
saveSettings({ largeTextAsFile });
};
const toggleResponseAutoCopy = async () => { const toggleResponseAutoCopy = async () => {
const permission = await navigator.clipboard const permission = await navigator.clipboard
.readText() .readText()
@ -188,6 +194,8 @@
voiceInterruption = $settings.voiceInterruption ?? false; voiceInterruption = $settings.voiceInterruption ?? false;
richTextInput = $settings.richTextInput ?? true; richTextInput = $settings.richTextInput ?? true;
largeTextAsFile = $settings.largeTextAsFile ?? false;
landingPageMode = $settings.landingPageMode ?? ''; landingPageMode = $settings.landingPageMode ?? '';
chatBubble = $settings.chatBubble ?? true; chatBubble = $settings.chatBubble ?? true;
widescreenMode = $settings.widescreenMode ?? false; widescreenMode = $settings.widescreenMode ?? false;
@ -480,6 +488,28 @@
</div> </div>
</div> </div>
<div>
<div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs">
{$i18n.t('Paste Large Text as File')}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
on:click={() => {
toggleLargeTextAsFile();
}}
type="button"
>
{#if largeTextAsFile === true}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
{/if}
</button>
</div>
</div>
<div> <div>
<div class=" py-0.5 flex w-full justify-between"> <div class=" py-0.5 flex w-full justify-between">
<div class=" self-center text-xs"> <div class=" self-center text-xs">

View File

@ -27,6 +27,7 @@
export let className = 'input-prose'; export let className = 'input-prose';
export let shiftEnter = false; export let shiftEnter = false;
export let largeTextAsFile = false;
export let id = ''; export let id = '';
export let value = ''; export let value = '';
@ -413,11 +414,13 @@
// Extract plain text from clipboard and paste it without formatting // Extract plain text from clipboard and paste it without formatting
const plainText = event.clipboardData.getData('text/plain'); const plainText = event.clipboardData.getData('text/plain');
if (plainText) { if (plainText) {
if (plainText.length > PASTED_TEXT_CHARACTER_LIMIT) { if (largeTextAsFile) {
// Dispatch paste event to parent component if (plainText.length > PASTED_TEXT_CHARACTER_LIMIT) {
eventDispatch('paste', { event }); // Dispatch paste event to parent component
event.preventDefault(); eventDispatch('paste', { event });
return true; event.preventDefault();
return true;
}
} }
const modifiedText = handleTabIndentation(plainText); const modifiedText = handleTabIndentation(plainText);