forked from open-webui/open-webui
		
	feat: unarchive
This commit is contained in:
		
							parent
							
								
									4c221eabef
								
							
						
					
					
						commit
						45ecaaf392
					
				
					 2 changed files with 115 additions and 7 deletions
				
			
		|  | @ -150,7 +150,12 @@ | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} /> | <ShareChatModal bind:show={showShareChatModal} chatId={shareChatId} /> | ||||||
| <ArchivedChatsModal bind:show={showArchivedChatsModal} /> | <ArchivedChatsModal | ||||||
|  | 	bind:show={showArchivedChatsModal} | ||||||
|  | 	on:change={async () => { | ||||||
|  | 		await chats.set(await getChatList(localStorage.token)); | ||||||
|  | 	}} | ||||||
|  | /> | ||||||
| 
 | 
 | ||||||
| <div | <div | ||||||
| 	bind:this={navElement} | 	bind:this={navElement} | ||||||
|  |  | ||||||
|  | @ -1,10 +1,13 @@ | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
| 	import { toast } from 'svelte-sonner'; | 	import { toast } from 'svelte-sonner'; | ||||||
| 	import dayjs from 'dayjs'; | 	import dayjs from 'dayjs'; | ||||||
| 	import { onMount, getContext } from 'svelte'; | 	import { getContext, createEventDispatcher } from 'svelte'; | ||||||
|  | 
 | ||||||
|  | 	const dispatch = createEventDispatcher(); | ||||||
| 
 | 
 | ||||||
| 	import Modal from '$lib/components/common/Modal.svelte'; | 	import Modal from '$lib/components/common/Modal.svelte'; | ||||||
| 	import { getArchivedChatList } from '$lib/apis/chats'; | 	import { archiveChatById, deleteChatById, getArchivedChatList } from '$lib/apis/chats'; | ||||||
|  | 	import Tooltip from '$lib/components/common/Tooltip.svelte'; | ||||||
| 
 | 
 | ||||||
| 	const i18n = getContext('i18n'); | 	const i18n = getContext('i18n'); | ||||||
| 
 | 
 | ||||||
|  | @ -12,9 +15,29 @@ | ||||||
| 
 | 
 | ||||||
| 	let chats = []; | 	let chats = []; | ||||||
| 
 | 
 | ||||||
| 	onMount(async () => { | 	const unarchiveChatHandler = async (chatId) => { | ||||||
|  | 		const res = await archiveChatById(localStorage.token, chatId).catch((error) => { | ||||||
|  | 			toast.error(error); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
| 		chats = await getArchivedChatList(localStorage.token); | 		chats = await getArchivedChatList(localStorage.token); | ||||||
| 	}); | 
 | ||||||
|  | 		dispatch('change'); | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	const deleteChatHandler = async (chatId) => { | ||||||
|  | 		const res = await deleteChatById(localStorage.token, chatId).catch((error) => { | ||||||
|  | 			toast.error(error); | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		chats = await getArchivedChatList(localStorage.token); | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	$: if (show) { | ||||||
|  | 		(async () => { | ||||||
|  | 			chats = await getArchivedChatList(localStorage.token); | ||||||
|  | 		})(); | ||||||
|  | 	} | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <Modal size="lg" bind:show> | <Modal size="lg" bind:show> | ||||||
|  | @ -45,11 +68,91 @@ | ||||||
| 			<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> | 			<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6"> | ||||||
| 				{#if chats.length > 0} | 				{#if chats.length > 0} | ||||||
| 					<div class="text-left text-sm w-full mb-8"> | 					<div class="text-left text-sm w-full mb-8"> | ||||||
| 						{#each chats as chat} | 						<div class="relative overflow-x-auto"> | ||||||
|  | 							<table class="w-full text-sm text-left text-gray-500 dark:text-gray-400 table-auto"> | ||||||
|  | 								<thead | ||||||
|  | 									class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 border-gray-800" | ||||||
|  | 								> | ||||||
|  | 									<tr> | ||||||
|  | 										<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th> | ||||||
|  | 										<th scope="col" class="px-3 py-2"> {$i18n.t('Created At')} </th> | ||||||
|  | 										<th scope="col" class="px-3 py-2 text-right" /> | ||||||
|  | 									</tr> | ||||||
|  | 								</thead> | ||||||
|  | 								<tbody> | ||||||
|  | 									{#each chats as chat} | ||||||
|  | 										<tr class="bg-white border-b dark:bg-gray-900 dark:border-gray-850 text-xs"> | ||||||
|  | 											<td class="px-3 py-1 w-2/3"> | ||||||
|  | 												<div class=" line-clamp-1"> | ||||||
|  | 													{chat.title} | ||||||
|  | 												</div> | ||||||
|  | 											</td> | ||||||
|  | 
 | ||||||
|  | 											<td class=" px-3 py-1"> | ||||||
|  | 												{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))} | ||||||
|  | 											</td> | ||||||
|  | 
 | ||||||
|  | 											<td class="px-3 py-1 text-right"> | ||||||
|  | 												<div class="flex justify-end w-full"> | ||||||
|  | 													<Tooltip content="Unarchive Chat"> | ||||||
|  | 														<button | ||||||
|  | 															class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" | ||||||
|  | 															on:click={async () => { | ||||||
|  | 																unarchiveChatHandler(chat.id); | ||||||
|  | 															}} | ||||||
|  | 														> | ||||||
|  | 															<svg | ||||||
|  | 																xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 																fill="none" | ||||||
|  | 																viewBox="0 0 24 24" | ||||||
|  | 																stroke-width="1.5" | ||||||
|  | 																stroke="currentColor" | ||||||
|  | 																class="size-4" | ||||||
|  | 															> | ||||||
|  | 																<path | ||||||
|  | 																	stroke-linecap="round" | ||||||
|  | 																	stroke-linejoin="round" | ||||||
|  | 																	d="M9 8.25H7.5a2.25 2.25 0 0 0-2.25 2.25v9a2.25 2.25 0 0 0 2.25 2.25h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25H15m0-3-3-3m0 0-3 3m3-3V15" | ||||||
|  | 																/> | ||||||
|  | 															</svg> | ||||||
|  | 														</button> | ||||||
|  | 													</Tooltip> | ||||||
|  | 
 | ||||||
|  | 													<Tooltip content="Delete Chat"> | ||||||
|  | 														<button | ||||||
|  | 															class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl" | ||||||
|  | 															on:click={async () => { | ||||||
|  | 																deleteChatHandler(chat.id); | ||||||
|  | 															}} | ||||||
|  | 														> | ||||||
|  | 															<svg | ||||||
|  | 																xmlns="http://www.w3.org/2000/svg" | ||||||
|  | 																fill="none" | ||||||
|  | 																viewBox="0 0 24 24" | ||||||
|  | 																stroke-width="1.5" | ||||||
|  | 																stroke="currentColor" | ||||||
|  | 																class="w-4 h-4" | ||||||
|  | 															> | ||||||
|  | 																<path | ||||||
|  | 																	stroke-linecap="round" | ||||||
|  | 																	stroke-linejoin="round" | ||||||
|  | 																	d="m14.74 9-.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 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" | ||||||
|  | 																/> | ||||||
|  | 															</svg> | ||||||
|  | 														</button> | ||||||
|  | 													</Tooltip> | ||||||
|  | 												</div> | ||||||
|  | 											</td> | ||||||
|  | 										</tr> | ||||||
|  | 									{/each} | ||||||
|  | 								</tbody> | ||||||
|  | 							</table> | ||||||
|  | 						</div> | ||||||
|  | 						<!-- {#each chats as chat} | ||||||
| 							<div> | 							<div> | ||||||
| 								{JSON.stringify(chat)} | 								{JSON.stringify(chat)} | ||||||
| 							</div> | 							</div> | ||||||
| 						{/each} | 						{/each} --> | ||||||
| 					</div> | 					</div> | ||||||
| 				{:else} | 				{:else} | ||||||
| 					<div class="text-left text-sm w-full mb-8">You have no archived conversations.</div> | 					<div class="text-left text-sm w-full mb-8">You have no archived conversations.</div> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek