ai / src /lib /components /chat /BulkMessageModal.svelte
github-actions[bot]
GitHub deploy: 704cb86591d6800bb05a9dc753d51c3f3f1188a8
90fa015
<script lang="ts">
import { createEventDispatcher} from 'svelte';
import Modal from '../common/Modal.svelte';
import { toast } from 'svelte-sonner';
const dispatch = createEventDispatcher();
export let show = false;
let textInput = '';
const basicTemplate = "### USER\n\n\n### ASSISTANT\n";
function parseMessages(text: string) {
const messages = [];
const sections = text.split(/(?=### (?:USER|ASSISTANT))/);
for (const section of sections) {
if (!section.trim()) continue;
const match = section.match(/### (USER|ASSISTANT)\s*([\s\S]*?)(?=(?:### (?:USER|ASSISTANT))|$)/);
if (match) {
const [_, role, content] = match;
messages.push({
role: role.toLowerCase(),
content: content.trim()
});
}
}
return messages;
}
function handleSubmit() {
const messages = parseMessages(textInput);
if (messages.length === 0) {
toast.error('No valid messages found');
return;
}
dispatch('submit', { messages });
show = false;
textInput = '';
}
function insertTemplate() {
textInput = textInput ? `${textInput}\n\n${basicTemplate}` : basicTemplate;
}
$: if (show) {
textInput = '';
}
</script>
<Modal bind:show size="md">
<div class="text-gray-700 dark:text-gray-100">
<div class="flex justify-between dark:text-gray-300 px-5 pt-4 pb-1">
<div class="text-lg font-medium self-center">Import Messages</div>
<div class="flex gap-2">
<button
class="text-sm px-3 py-1.5 text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded border border-gray-300 dark:border-gray-600"
on:click={insertTemplate}
>
Insert Template
</button>
<button
class="self-center"
on:click={() => {
show = false;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-5 h-5"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
</div>
<div class="p-4">
<textarea
class="w-full h-64 p-3 border rounded-lg bg-white dark:bg-gray-800 dark:border-gray-700 dark:text-gray-100"
placeholder={"### USER\nHello\n\n### ASSISTANT\nHello! How can I help you today?"}
bind:value={textInput}
/>
<div class="flex justify-end gap-2 mt-4">
<button
class="px-4 py-2 text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded"
on:click={() => show = false}
>
Cancel
</button>
<button
class="px-4 py-2 text-white bg-gray-900 dark:bg-gray-700 rounded hover:bg-gray-800 dark:hover:bg-gray-600"
on:click={handleSubmit}
>
Import
</button>
</div>
</div>
</div>
</Modal>