|
@@ -1,7 +1,10 @@
|
|
|
<script lang="ts">
|
|
|
+ import toast from 'svelte-french-toast';
|
|
|
+ import fileSaver from 'file-saver';
|
|
|
+ const { saveAs } = fileSaver;
|
|
|
+
|
|
|
import { getChatById } from '$lib/apis/chats';
|
|
|
import { chatId, db, modelfiles } from '$lib/stores';
|
|
|
- import toast from 'svelte-french-toast';
|
|
|
|
|
|
export let initNewChat: Function;
|
|
|
export let title: string = 'Ollama Web UI';
|
|
@@ -33,6 +36,21 @@
|
|
|
false
|
|
|
);
|
|
|
};
|
|
|
+
|
|
|
+ const downloadChat = async () => {
|
|
|
+ const chat = (await getChatById(localStorage.token, $chatId)).chat;
|
|
|
+ console.log('download', chat);
|
|
|
+
|
|
|
+ const chatText = chat.messages.reduce((a, message, i, arr) => {
|
|
|
+ return `${a}### ${message.role.toUpperCase()}\n${message.content}\n\n`;
|
|
|
+ }, '');
|
|
|
+
|
|
|
+ let blob = new Blob([chatText], {
|
|
|
+ type: 'text/plain'
|
|
|
+ });
|
|
|
+
|
|
|
+ saveAs(blob, `chat-${chat.title}.txt`);
|
|
|
+ };
|
|
|
</script>
|
|
|
|
|
|
<nav
|
|
@@ -69,7 +87,30 @@
|
|
|
</div>
|
|
|
|
|
|
{#if shareEnabled}
|
|
|
- <div class="pl-2">
|
|
|
+ <div class="pl-2 flex space-x-1.5">
|
|
|
+ <button
|
|
|
+ class=" cursor-pointer p-2 flex dark:hover:bg-gray-700 rounded-lg transition border dark:border-gray-600"
|
|
|
+ on:click={async () => {
|
|
|
+ downloadChat();
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <div class=" m-auto self-center">
|
|
|
+ <svg
|
|
|
+ xmlns="http://www.w3.org/2000/svg"
|
|
|
+ viewBox="0 0 16 16"
|
|
|
+ fill="currentColor"
|
|
|
+ class="w-4 h-4"
|
|
|
+ >
|
|
|
+ <path
|
|
|
+ d="M8.75 2.75a.75.75 0 0 0-1.5 0v5.69L5.03 6.22a.75.75 0 0 0-1.06 1.06l3.5 3.5a.75.75 0 0 0 1.06 0l3.5-3.5a.75.75 0 0 0-1.06-1.06L8.75 8.44V2.75Z"
|
|
|
+ />
|
|
|
+ <path
|
|
|
+ d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
|
|
|
+ />
|
|
|
+ </svg>
|
|
|
+ </div>
|
|
|
+ </button>
|
|
|
+
|
|
|
<button
|
|
|
class=" cursor-pointer p-2 flex dark:hover:bg-gray-700 rounded-lg transition border dark:border-gray-600"
|
|
|
on:click={async () => {
|
|
@@ -79,15 +120,15 @@
|
|
|
<div class=" m-auto self-center">
|
|
|
<svg
|
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
|
- viewBox="0 0 20 20"
|
|
|
+ viewBox="0 0 16 16"
|
|
|
fill="currentColor"
|
|
|
class="w-4 h-4"
|
|
|
>
|
|
|
<path
|
|
|
- d="M9.25 13.25a.75.75 0 001.5 0V4.636l2.955 3.129a.75.75 0 001.09-1.03l-4.25-4.5a.75.75 0 00-1.09 0l-4.25 4.5a.75.75 0 101.09 1.03L9.25 4.636v8.614z"
|
|
|
+ d="M7.25 10.25a.75.75 0 0 0 1.5 0V4.56l2.22 2.22a.75.75 0 1 0 1.06-1.06l-3.5-3.5a.75.75 0 0 0-1.06 0l-3.5 3.5a.75.75 0 0 0 1.06 1.06l2.22-2.22v5.69Z"
|
|
|
/>
|
|
|
<path
|
|
|
- d="M3.5 12.75a.75.75 0 00-1.5 0v2.5A2.75 2.75 0 004.75 18h10.5A2.75 2.75 0 0018 15.25v-2.5a.75.75 0 00-1.5 0v2.5c0 .69-.56 1.25-1.25 1.25H4.75c-.69 0-1.25-.56-1.25-1.25v-2.5z"
|
|
|
+ d="M3.5 9.75a.75.75 0 0 0-1.5 0v1.5A2.75 2.75 0 0 0 4.75 14h6.5A2.75 2.75 0 0 0 14 11.25v-1.5a.75.75 0 0 0-1.5 0v1.5c0 .69-.56 1.25-1.25 1.25h-6.5c-.69 0-1.25-.56-1.25-1.25v-1.5Z"
|
|
|
/>
|
|
|
</svg>
|
|
|
</div>
|