|
<script lang="ts"> |
|
import { toast } from 'svelte-sonner'; |
|
|
|
import { tick, getContext, onMount, createEventDispatcher } from 'svelte'; |
|
const dispatch = createEventDispatcher(); |
|
const i18n = getContext('i18n'); |
|
|
|
import { settings } from '$lib/stores'; |
|
import { copyToClipboard } from '$lib/utils'; |
|
|
|
import MultiResponseMessages from './MultiResponseMessages.svelte'; |
|
import ResponseMessage from './ResponseMessage.svelte'; |
|
import UserMessage from './UserMessage.svelte'; |
|
|
|
export let chatId; |
|
export let idx = 0; |
|
|
|
export let history; |
|
export let messageId; |
|
|
|
export let user; |
|
|
|
export let showPreviousMessage; |
|
export let showNextMessage; |
|
|
|
export let editMessage; |
|
export let deleteMessage; |
|
export let rateMessage; |
|
|
|
export let regenerateResponse; |
|
export let continueResponse; |
|
|
|
|
|
export let mergeResponses; |
|
|
|
export let autoScroll = false; |
|
export let readOnly = false; |
|
|
|
onMount(() => { |
|
|
|
}); |
|
</script> |
|
|
|
<div |
|
class="flex flex-col justify-between px-5 mb-3 w-full {($settings?.widescreenMode ?? null) |
|
? 'max-w-full' |
|
: 'max-w-5xl'} mx-auto rounded-lg group" |
|
> |
|
{#if history.messages[messageId]} |
|
{#if history.messages[messageId].role === 'user'} |
|
<UserMessage |
|
{user} |
|
{history} |
|
{messageId} |
|
isFirstMessage={idx === 0} |
|
siblings={history.messages[messageId].parentId !== null |
|
? (history.messages[history.messages[messageId].parentId]?.childrenIds ?? []) |
|
: (Object.values(history.messages) |
|
.filter((message) => message.parentId === null) |
|
.map((message) => message.id) ?? [])} |
|
{showPreviousMessage} |
|
{showNextMessage} |
|
{editMessage} |
|
on:delete={() => deleteMessage(messageId)} |
|
{readOnly} |
|
/> |
|
{:else if (history.messages[history.messages[messageId].parentId]?.models?.length ?? 1) === 1} |
|
<ResponseMessage |
|
{chatId} |
|
{history} |
|
{messageId} |
|
isLastMessage={messageId === history.currentId} |
|
siblings={history.messages[history.messages[messageId].parentId]?.childrenIds ?? []} |
|
{showPreviousMessage} |
|
{showNextMessage} |
|
{editMessage} |
|
{rateMessage} |
|
{continueResponse} |
|
{regenerateResponse} |
|
on:submit={async (e) => { |
|
dispatch('submit', e.detail); |
|
}} |
|
on:action={async (e) => { |
|
dispatch('action', e.detail); |
|
}} |
|
on:update={async (e) => { |
|
dispatch('update'); |
|
}} |
|
on:save={async (e) => { |
|
console.log('save', e); |
|
|
|
const message = e.detail; |
|
if (message) { |
|
history.messages[message.id] = message; |
|
dispatch('update'); |
|
} else { |
|
dispatch('update'); |
|
} |
|
}} |
|
{readOnly} |
|
/> |
|
{:else} |
|
<MultiResponseMessages |
|
bind:history |
|
{chatId} |
|
{messageId} |
|
isLastMessage={messageId === history?.currentId} |
|
{rateMessage} |
|
{editMessage} |
|
{continueResponse} |
|
{regenerateResponse} |
|
{mergeResponses} |
|
on:submit={async (e) => { |
|
dispatch('submit', e.detail); |
|
}} |
|
on:action={async (e) => { |
|
dispatch('action', e.detail); |
|
}} |
|
on:update={async (e) => { |
|
dispatch('update'); |
|
}} |
|
on:save={async (e) => { |
|
console.log('save', e); |
|
const message = e.detail; |
|
if (message) { |
|
history.messages[message.id] = message; |
|
dispatch('update'); |
|
} else { |
|
dispatch('update'); |
|
} |
|
}} |
|
on:change={async () => { |
|
await tick(); |
|
dispatch('update'); |
|
dispatch('scroll'); |
|
}} |
|
{readOnly} |
|
/> |
|
{/if} |
|
{/if} |
|
</div> |
|
|