refac: WIP

This commit is contained in:
Timothy J. Baek 2024-09-23 14:24:50 +02:00
parent 5978e7c9a6
commit b1521cacad
7 changed files with 65 additions and 49 deletions

View File

@ -271,7 +271,7 @@
<div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center"> <div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
<div class="flex flex-col max-w-6xl px-2.5 md:px-6 w-full"> <div class="flex flex-col max-w-6xl px-2.5 md:px-6 w-full">
<div class="relative"> <div class="relative">
{#if autoScroll === false && !history?.currentId} {#if autoScroll === false && history?.currentId}
<div <div
class=" absolute -top-12 left-0 right-0 flex justify-center z-30 pointer-events-none" class=" absolute -top-12 left-0 right-0 flex justify-center z-30 pointer-events-none"
> >

View File

@ -13,7 +13,14 @@
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let chatId = ''; export let chatId = '';
export let readOnly = false; export let user = $_user;
export let prompt;
export let history = {};
export let selectedModels;
let messages = [];
export let sendPrompt: Function; export let sendPrompt: Function;
export let continueResponse: Function; export let continueResponse: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
@ -21,14 +28,24 @@
export let chatActionHandler: Function; export let chatActionHandler: Function;
export let showMessage: Function = () => {}; export let showMessage: Function = () => {};
export let user = $_user; export let readOnly = false;
export let prompt;
export let bottomPadding = false; export let bottomPadding = false;
export let autoScroll; export let autoScroll;
export let history = {};
export let messages = [];
export let selectedModels; $: if (history.currentId) {
let _messages = [];
let message = history.messages[history.currentId];
while (message) {
_messages.unshift({ ...message });
message = message.parentId !== null ? history.messages[message.parentId] : null;
}
messages = _messages;
} else {
messages = [];
}
$: if (autoScroll && bottomPadding) { $: if (autoScroll && bottomPadding) {
(async () => { (async () => {
@ -312,18 +329,19 @@
{:else} {:else}
<div class="w-full pt-2"> <div class="w-full pt-2">
{#key chatId} {#key chatId}
<!-- {JSON.stringify(history)} --> <div class="w-full">
<div class="w-full flex flex-col-reverse"> {#each messages as message, messageIdx (message.id)}
<Message <Message
h={0} {chatId}
{chatId} {history}
{history} messageId={message.id}
messageId={history.currentId} idx={messageIdx}
{user} {user}
{editMessage} {editMessage}
{deleteMessage} {deleteMessage}
{rateMessage} {rateMessage}
/> />
{/each}
</div> </div>
<div class="pb-12" /> <div class="pb-12" />
{#if bottomPadding} {#if bottomPadding}

View File

@ -226,7 +226,7 @@ __builtins__.input = input`);
} }
}; };
$: if (token.raw) { $: if (token) {
if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) { if (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {
(async () => { (async () => {
await drawMermaidDiagram(); await drawMermaidDiagram();
@ -245,6 +245,7 @@ __builtins__.input = input`);
} }
onMount(async () => { onMount(async () => {
console.log('codeblock', lang, code);
if (document.documentElement.classList.contains('dark')) { if (document.documentElement.classList.contains('dark')) {
mermaid.initialize({ mermaid.initialize({
startOnLoad: true, startOnLoad: true,

View File

@ -19,7 +19,7 @@
</script> </script>
<!-- {JSON.stringify(tokens)} --> <!-- {JSON.stringify(tokens)} -->
{#each tokens as token, tokenIdx} {#each tokens as token, tokenIdx (tokenIdx)}
{#if token.type === 'hr'} {#if token.type === 'hr'}
<hr /> <hr />
{:else if token.type === 'heading'} {:else if token.type === 'heading'}

View File

@ -12,10 +12,8 @@
import UserMessage from './UserMessage.svelte'; import UserMessage from './UserMessage.svelte';
import { updateChatById } from '$lib/apis/chats'; import { updateChatById } from '$lib/apis/chats';
// h here refers to the height of the message graph
export let h;
export let chatId; export let chatId;
export let idx = 0;
export let history; export let history;
export let messageId; export let messageId;
@ -40,12 +38,23 @@
export let readOnly = false; export let readOnly = false;
let message = JSON.parse(JSON.stringify(history.messages[messageId]));
$: if (history.messages) {
if (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {
message = JSON.parse(JSON.stringify(history.messages[messageId]));
}
}
const copyToClipboardWithToast = async (text) => { const copyToClipboardWithToast = async (text) => {
const res = await copyToClipboard(text); const res = await copyToClipboard(text);
if (res) { if (res) {
toast.success($i18n.t('Copying to clipboard was successful!')); toast.success($i18n.t('Copying to clipboard was successful!'));
} }
}; };
onMount(() => {
console.log('message', idx);
});
</script> </script>
<div <div
@ -53,13 +62,12 @@
? 'max-w-full' ? 'max-w-full'
: 'max-w-5xl'} mx-auto rounded-lg group" : 'max-w-5xl'} mx-auto rounded-lg group"
> >
{#if history.messages[messageId]} {#if message}
{@const message = history.messages[messageId]}
{#if message.role === 'user'} {#if message.role === 'user'}
<UserMessage <UserMessage
{user} {user}
{message} {message}
isFirstMessage={h === 0} isFirstMessage={idx === 0}
siblings={message.parentId !== null siblings={message.parentId !== null
? (history.messages[message.parentId]?.childrenIds ?? []) ? (history.messages[message.parentId]?.childrenIds ?? [])
: (Object.values(history.messages) : (Object.values(history.messages)
@ -152,24 +160,3 @@
{/if} {/if}
{/if} {/if}
</div> </div>
{#if history.messages[messageId]?.parentId !== null}
<svelte:self
h={h + 1}
{chatId}
{history}
messageId={history.messages[messageId]?.parentId}
{user}
{scrollToBottom}
{chatActionHandler}
{showPreviousMessage}
{showNextMessage}
{editMessage}
{deleteMessage}
{rateMessage}
{regenerateResponse}
{continueResponse}
{mergeResponses}
{readOnly}
></svelte:self>
{/if}

View File

@ -316,6 +316,8 @@
} }
onMount(async () => { onMount(async () => {
console.log('ResponseMessage mounted');
await tick(); await tick();
}); });
</script> </script>

View File

@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { toast } from 'svelte-sonner'; import { toast } from 'svelte-sonner';
import { tick, createEventDispatcher, getContext } from 'svelte'; import { tick, createEventDispatcher, getContext, onMount } from 'svelte';
import { models, settings } from '$lib/stores'; import { models, settings } from '$lib/stores';
import { user as _user } from '$lib/stores'; import { user as _user } from '$lib/stores';
@ -37,6 +37,10 @@
let editedContent = ''; let editedContent = '';
let messageEditTextAreaElement: HTMLTextAreaElement; let messageEditTextAreaElement: HTMLTextAreaElement;
$: if (message) {
console.log('message', message);
}
const copyToClipboard = async (text) => { const copyToClipboard = async (text) => {
const res = await _copyToClipboard(text); const res = await _copyToClipboard(text);
if (res) { if (res) {
@ -71,6 +75,10 @@
const deleteMessageHandler = async () => { const deleteMessageHandler = async () => {
dispatch('delete', message.id); dispatch('delete', message.id);
}; };
onMount(() => {
console.log('UserMessage mounted');
});
</script> </script>
<div class=" flex w-full user-message" dir={$settings.chatDirection} id="message-{message.id}"> <div class=" flex w-full user-message" dir={$settings.chatDirection} id="message-{message.id}">