+page.svelte 3.82 KB
Newer Older
1
2
3
4
5
<script lang="ts">
	import { onMount, tick, getContext } from 'svelte';
	import { goto } from '$app/navigation';
	import { page } from '$app/stores';

Timothy J. Baek's avatar
Timothy J. Baek committed
6
7
	import dayjs from 'dayjs';

8
	import { settings, chatId, WEBUI_NAME, models } from '$lib/stores';
9
10
11
12
13
14
	import { convertMessagesToHistory } from '$lib/utils';

	import { getChatByShareId } from '$lib/apis/chats';

	import Messages from '$lib/components/chat/Messages.svelte';
	import Navbar from '$lib/components/layout/Navbar.svelte';
15
	import { getUserById } from '$lib/apis/users';
Timothy J. Baek's avatar
Timothy J. Baek committed
16
	import { error } from '@sveltejs/kit';
17
	import { getModels } from '$lib/apis';
18
19
20
21
22
23
24
25
26
27
28
29
30
31

	const i18n = getContext('i18n');

	let loaded = false;

	let autoScroll = true;
	let processing = '';
	let messagesContainerElement: HTMLDivElement;

	// let chatId = $page.params.id;
	let showModelSelector = false;
	let selectedModels = [''];

	let chat = null;
32
	let user = null;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

	let title = '';
	let files = [];

	let messages = [];
	let history = {
		messages: {},
		currentId: null
	};

	$: if (history.currentId !== null) {
		let _messages = [];

		let currentMessage = history.messages[history.currentId];
		while (currentMessage !== null) {
			_messages.unshift({ ...currentMessage });
			currentMessage =
				currentMessage.parentId !== null ? history.messages[currentMessage.parentId] : null;
		}
		messages = _messages;
	} else {
		messages = [];
	}

	$: if ($page.params.id) {
		(async () => {
			if (await loadSharedChat()) {
				await tick();
				loaded = true;
			} else {
				await goto('/');
			}
		})();
	}

	//////////////////////////
	// Web functions
	//////////////////////////

	const loadSharedChat = async () => {
73
		await models.set(await getModels(localStorage.token));
74
75
76
77
78
79
80
		await chatId.set($page.params.id);
		chat = await getChatByShareId(localStorage.token, $chatId).catch(async (error) => {
			await goto('/');
			return null;
		});

		if (chat) {
Timothy J. Baek's avatar
Timothy J. Baek committed
81
82
83
84
			user = await getUserById(localStorage.token, chat.user_id).catch((error) => {
				console.error(error);
				return null;
			});
85

86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
			const chatContent = chat.chat;

			if (chatContent) {
				console.log(chatContent);

				selectedModels =
					(chatContent?.models ?? undefined) !== undefined
						? chatContent.models
						: [chatContent.models ?? ''];
				history =
					(chatContent?.history ?? undefined) !== undefined
						? chatContent.history
						: convertMessagesToHistory(chatContent.messages);
				title = chatContent.title;

				autoScroll = true;
				await tick();

				if (messages.length > 0) {
					history.messages[messages.at(-1).id].done = true;
				}
				await tick();

				return true;
			} else {
				return null;
			}
		}
	};
</script>

<svelte:head>
	<title>
		{title
			? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} | ${$WEBUI_NAME}`
			: `${$WEBUI_NAME}`}
	</title>
</svelte:head>

{#if loaded}
126
127
128
	<div
		class="min-h-screen max-h-screen w-full flex flex-col text-gray-700 dark:text-gray-100 bg-white dark:bg-gray-900"
	>
Timothy J. Baek's avatar
Timothy J. Baek committed
129
		<div class="flex flex-col flex-auto justify-center py-8">
Timothy J. Baek's avatar
Timothy J. Baek committed
130
			<div class="px-3 w-full max-w-5xl mx-auto">
Timothy J. Baek's avatar
Timothy J. Baek committed
131
132
133
134
135
136
				<div>
					<div class=" text-3xl font-semibold line-clamp-1">
						{title}
					</div>

					<div class=" mt-1 text-gray-400">
137
						{dayjs(chat.chat.timestamp).format($i18n.t('MMMM DD, YYYY'))}
Timothy J. Baek's avatar
Timothy J. Baek committed
138
139
140
141
142
143
					</div>
				</div>

				<hr class=" dark:border-gray-800 mt-6 mb-2" />
			</div>

Timothy J. Baek's avatar
Timothy J. Baek committed
144
			<div class=" flex flex-col w-full flex-auto overflow-auto h-0" id="messages-container">
145
				<div class=" h-full w-full flex flex-col py-4">
Timothy J. Baek's avatar
Timothy J. Baek committed
146
147
					<div class="py-2">
						<Messages
148
							{user}
Timothy J. Baek's avatar
Timothy J. Baek committed
149
150
151
152
153
154
155
156
157
158
159
160
161
							chatId={$chatId}
							readOnly={true}
							{selectedModels}
							{processing}
							bind:history
							bind:messages
							bind:autoScroll
							bottomPadding={files.length > 0}
							sendPrompt={() => {}}
							continueGeneration={() => {}}
							regenerateResponse={() => {}}
						/>
					</div>
162
163
164
165
166
				</div>
			</div>
		</div>
	</div>
{/if}