|
@@ -6,27 +6,22 @@
|
|
|
|
|
|
import { goto, invalidateAll } from '$app/navigation';
|
|
import { goto, invalidateAll } from '$app/navigation';
|
|
import { page } from '$app/stores';
|
|
import { page } from '$app/stores';
|
|
- import { user, db, chats, showSettings, chatId } from '$lib/stores';
|
|
|
|
|
|
+ import { user, chats, showSettings, chatId } from '$lib/stores';
|
|
import { onMount } from 'svelte';
|
|
import { onMount } from 'svelte';
|
|
import { deleteChatById, getChatList, updateChatById } from '$lib/apis/chats';
|
|
import { deleteChatById, getChatList, updateChatById } from '$lib/apis/chats';
|
|
|
|
|
|
let show = false;
|
|
let show = false;
|
|
let navElement;
|
|
let navElement;
|
|
- let importFileInputElement;
|
|
|
|
- let importFiles;
|
|
|
|
|
|
|
|
let title: string = 'Ollama Web UI';
|
|
let title: string = 'Ollama Web UI';
|
|
let search = '';
|
|
let search = '';
|
|
|
|
|
|
let chatDeleteId = null;
|
|
let chatDeleteId = null;
|
|
-
|
|
|
|
let chatTitleEditId = null;
|
|
let chatTitleEditId = null;
|
|
let chatTitle = '';
|
|
let chatTitle = '';
|
|
|
|
|
|
let showDropdown = false;
|
|
let showDropdown = false;
|
|
|
|
|
|
- let showDeleteHistoryConfirm = false;
|
|
|
|
-
|
|
|
|
onMount(async () => {
|
|
onMount(async () => {
|
|
if (window.innerWidth > 1280) {
|
|
if (window.innerWidth > 1280) {
|
|
show = true;
|
|
show = true;
|
|
@@ -57,29 +52,12 @@
|
|
|
|
|
|
// const deleteChatHistory = async () => {
|
|
// const deleteChatHistory = async () => {
|
|
// await $db.deleteAllChat();
|
|
// await $db.deleteAllChat();
|
|
- // };
|
|
|
|
|
|
|
|
- // const importChats = async (chatHistory) => {
|
|
|
|
- // await $db.importChats(chatHistory);
|
|
|
|
- // };
|
|
|
|
|
|
+ // const tx = this.db.transaction('chats', 'readwrite');
|
|
|
|
+ // await Promise.all([tx.store.clear(), tx.done]);
|
|
|
|
|
|
- // const exportChats = async () => {
|
|
|
|
- // let blob = new Blob([JSON.stringify(await $db.exportChats())], { type: 'application/json' });
|
|
|
|
- // saveAs(blob, `chat-export-${Date.now()}.json`);
|
|
|
|
|
|
+ // await chats.set(await this.getChats());
|
|
// };
|
|
// };
|
|
-
|
|
|
|
- // $: if (importFiles) {
|
|
|
|
- // console.log(importFiles);
|
|
|
|
-
|
|
|
|
- // let reader = new FileReader();
|
|
|
|
- // reader.onload = (event) => {
|
|
|
|
- // let chats = JSON.parse(event.target.result);
|
|
|
|
- // console.log(chats);
|
|
|
|
- // importChats(chats);
|
|
|
|
- // };
|
|
|
|
-
|
|
|
|
- // reader.readAsText(importFiles[0]);
|
|
|
|
- // }
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<div
|
|
<div
|
|
@@ -405,145 +383,6 @@
|
|
<hr class=" border-gray-900 mb-1 w-full" />
|
|
<hr class=" border-gray-900 mb-1 w-full" />
|
|
|
|
|
|
<div class="flex flex-col">
|
|
<div class="flex flex-col">
|
|
- <!-- <div class="flex">
|
|
|
|
- <input bind:this={importFileInputElement} bind:files={importFiles} type="file" hidden />
|
|
|
|
- <button
|
|
|
|
- class=" flex rounded-md py-3 px-3.5 w-full hover:bg-gray-900 transition"
|
|
|
|
- on:click={() => {
|
|
|
|
- importFileInputElement.click();
|
|
|
|
- // importChats();
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <div class=" self-center mr-3">
|
|
|
|
- <svg
|
|
|
|
- xmlns="http://www.w3.org/2000/svg"
|
|
|
|
- fill="none"
|
|
|
|
- viewBox="0 0 24 24"
|
|
|
|
- stroke-width="1.5"
|
|
|
|
- stroke="currentColor"
|
|
|
|
- class="w-5 h-5"
|
|
|
|
- >
|
|
|
|
- <path
|
|
|
|
- stroke-linecap="round"
|
|
|
|
- stroke-linejoin="round"
|
|
|
|
- d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m6.75 12l-3-3m0 0l-3 3m3-3v6m-1.5-15H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"
|
|
|
|
- />
|
|
|
|
- </svg>
|
|
|
|
- </div>
|
|
|
|
- <div class=" self-center">Import</div>
|
|
|
|
- </button>
|
|
|
|
- <button
|
|
|
|
- class=" flex rounded-md py-3 px-3.5 w-full hover:bg-gray-900 transition"
|
|
|
|
- on:click={() => {
|
|
|
|
- exportChats();
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <div class=" self-center mr-3">
|
|
|
|
- <svg
|
|
|
|
- xmlns="http://www.w3.org/2000/svg"
|
|
|
|
- fill="none"
|
|
|
|
- viewBox="0 0 24 24"
|
|
|
|
- stroke-width="1.5"
|
|
|
|
- stroke="currentColor"
|
|
|
|
- class="w-5 h-5"
|
|
|
|
- >
|
|
|
|
- <path
|
|
|
|
- stroke-linecap="round"
|
|
|
|
- stroke-linejoin="round"
|
|
|
|
- d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m.75 12l3 3m0 0l3-3m-3 3v-6m-1.5-9H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"
|
|
|
|
- />
|
|
|
|
- </svg>
|
|
|
|
- </div>
|
|
|
|
- <div class=" self-center">Export</div>
|
|
|
|
- </button>
|
|
|
|
- </div>
|
|
|
|
- {#if showDeleteHistoryConfirm}
|
|
|
|
- <div class="flex justify-between rounded-md items-center py-3 px-3.5 w-full transition">
|
|
|
|
- <div class="flex items-center">
|
|
|
|
- <svg
|
|
|
|
- xmlns="http://www.w3.org/2000/svg"
|
|
|
|
- fill="none"
|
|
|
|
- viewBox="0 0 24 24"
|
|
|
|
- stroke-width="1.5"
|
|
|
|
- stroke="currentColor"
|
|
|
|
- class="w-5 h-5 mr-3"
|
|
|
|
- >
|
|
|
|
- <path
|
|
|
|
- stroke-linecap="round"
|
|
|
|
- stroke-linejoin="round"
|
|
|
|
- d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
|
|
|
|
- />
|
|
|
|
- </svg>
|
|
|
|
- <span>Are you sure?</span>
|
|
|
|
- </div>
|
|
|
|
-
|
|
|
|
- <div class="flex space-x-1.5 items-center">
|
|
|
|
- <button
|
|
|
|
- class="hover:text-white transition"
|
|
|
|
- on:click={() => {
|
|
|
|
- deleteChatHistory();
|
|
|
|
- showDeleteHistoryConfirm = false;
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <svg
|
|
|
|
- xmlns="http://www.w3.org/2000/svg"
|
|
|
|
- viewBox="0 0 20 20"
|
|
|
|
- fill="currentColor"
|
|
|
|
- class="w-4 h-4"
|
|
|
|
- >
|
|
|
|
- <path
|
|
|
|
- fill-rule="evenodd"
|
|
|
|
- d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z"
|
|
|
|
- clip-rule="evenodd"
|
|
|
|
- />
|
|
|
|
- </svg>
|
|
|
|
- </button>
|
|
|
|
- <button
|
|
|
|
- class="hover:text-white transition"
|
|
|
|
- on:click={() => {
|
|
|
|
- showDeleteHistoryConfirm = false;
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <svg
|
|
|
|
- xmlns="http://www.w3.org/2000/svg"
|
|
|
|
- viewBox="0 0 20 20"
|
|
|
|
- fill="currentColor"
|
|
|
|
- class="w-4 h-4"
|
|
|
|
- >
|
|
|
|
- <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>
|
|
|
|
- {:else}
|
|
|
|
- <button
|
|
|
|
- class=" flex rounded-md py-3 px-3.5 w-full hover:bg-gray-900 transition"
|
|
|
|
- on:click={() => {
|
|
|
|
- showDeleteHistoryConfirm = true;
|
|
|
|
- }}
|
|
|
|
- >
|
|
|
|
- <div class="mr-3">
|
|
|
|
- <svg
|
|
|
|
- xmlns="http://www.w3.org/2000/svg"
|
|
|
|
- fill="none"
|
|
|
|
- viewBox="0 0 24 24"
|
|
|
|
- stroke-width="1.5"
|
|
|
|
- stroke="currentColor"
|
|
|
|
- class="w-5 h-5"
|
|
|
|
- >
|
|
|
|
- <path
|
|
|
|
- stroke-linecap="round"
|
|
|
|
- stroke-linejoin="round"
|
|
|
|
- d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
|
|
|
|
- />
|
|
|
|
- </svg>
|
|
|
|
- </div>
|
|
|
|
- <span>Clear conversations</span>
|
|
|
|
- </button>
|
|
|
|
- {/if} -->
|
|
|
|
-
|
|
|
|
{#if $user !== undefined}
|
|
{#if $user !== undefined}
|
|
<button
|
|
<button
|
|
class=" flex rounded-md py-3 px-3.5 w-full hover:bg-gray-900 transition"
|
|
class=" flex rounded-md py-3 px-3.5 w-full hover:bg-gray-900 transition"
|