|
<script lang="ts"> |
|
import { base } from "$app/paths"; |
|
import { page } from "$app/stores"; |
|
import { createEventDispatcher } from "svelte"; |
|
|
|
import CarbonCheckmark from "~icons/carbon/checkmark"; |
|
import CarbonTrashCan from "~icons/carbon/trash-can"; |
|
import CarbonClose from "~icons/carbon/close"; |
|
import CarbonEdit from "~icons/carbon/edit"; |
|
import { useSettingsStore } from "$lib/stores/settings"; |
|
import type { ConvSidebar } from "$lib/types/ConvSidebar"; |
|
|
|
export let conv: ConvSidebar; |
|
|
|
let confirmDelete = false; |
|
|
|
const dispatch = createEventDispatcher<{ |
|
deleteConversation: string; |
|
editConversationTitle: { id: string; title: string }; |
|
}>(); |
|
|
|
const settings = useSettingsStore(); |
|
</script> |
|
|
|
<a |
|
data-sveltekit-noscroll |
|
on:mouseleave={() => { |
|
confirmDelete = false; |
|
}} |
|
href="{base}/conversation/{conv.id}" |
|
class="group flex h-10 flex-none items-center gap-1.5 rounded-lg pl-2.5 pr-2 text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 {conv.id === |
|
$page.params.id |
|
? 'bg-gray-100 dark:bg-gray-700' |
|
: ''}" |
|
> |
|
<div class="flex flex-1 items-center truncate"> |
|
{ |
|
<span class="mr-1 font-semibold"> Delete </span> |
|
{/if} |
|
{ |
|
<img |
|
src="{base}/settings/assistants/{conv.assistantId}/avatar?hash={conv.avatarHash}" |
|
alt="Assistant avatar" |
|
class="mr-1.5 inline size-4 flex-none rounded-full object-cover" |
|
/> |
|
{conv.title.replace(/\p{Emoji}/gu, "")} |
|
{:else if conv.assistantId} |
|
<div |
|
class="mr-1.5 flex size-4 flex-none items-center justify-center rounded-full bg-gray-300 text-xs font-bold uppercase text-gray-500" |
|
/> |
|
{conv.title.replace(/\p{Emoji}/gu, "")} |
|
{:else} |
|
{conv.title} |
|
{/if} |
|
</div> |
|
|
|
{ |
|
<button |
|
type="button" |
|
class="flex h-5 w-5 items-center justify-center rounded md:hidden md:group-hover:flex" |
|
title="Confirm delete action" |
|
on:click|preventDefault={() => { |
|
confirmDelete = false; |
|
dispatch("deleteConversation", conv.id); |
|
}} |
|
> |
|
<CarbonCheckmark class="text-xs text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" /> |
|
</button> |
|
<button |
|
type="button" |
|
class="flex h-5 w-5 items-center justify-center rounded md:hidden md:group-hover:flex" |
|
title="Cancel delete action" |
|
on:click|preventDefault={() => (confirmDelete = false)} |
|
> |
|
<CarbonClose class="text-xs text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" /> |
|
</button> |
|
{:else} |
|
<button |
|
type="button" |
|
class="flex h-5 w-5 items-center justify-center rounded md:hidden md:group-hover:flex" |
|
title="Edit conversation title" |
|
on:click|preventDefault={() => { |
|
const newTitle = prompt("Edit this conversation title:", conv.title); |
|
if (!newTitle) return; |
|
dispatch("editConversationTitle", { id: conv.id, title: newTitle }); |
|
}} |
|
> |
|
<CarbonEdit class="text-xs text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" /> |
|
</button> |
|
|
|
<button |
|
type="button" |
|
class="flex h-5 w-5 items-center justify-center rounded md:hidden md:group-hover:flex" |
|
title="Delete conversation" |
|
on:click|preventDefault={(event) => { |
|
if (event.shiftKey) { |
|
dispatch("deleteConversation", conv.id); |
|
} else { |
|
confirmDelete = true; |
|
} |
|
}} |
|
> |
|
<CarbonTrashCan class="text-xs text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" /> |
|
</button> |
|
{/if} |
|
</a> |
|
|