File size: 3,331 Bytes
dd5d9ad
 
d433b55
dd5d9ad
 
 
 
 
 
df3243b
dd5d9ad
a1a6daf
 
 
dd5d9ad
a1a6daf
 
 
dd5d9ad
 
 
 
 
 
 
 
 
a1a6daf
dd5d9ad
 
 
06feee8
d433b55
dd5d9ad
 
 
df3243b
dd5d9ad
df3243b
 
9d36148
df3243b
9d36148
df3243b
797e348
df3243b
 
 
 
797e348
a1a6daf
df3243b
 
 
dd5d9ad
 
 
 
3076857
 
 
 
a1a6daf
 
 
 
3076857
 
 
dd5d9ad
 
 
 
a1a6daf
 
f7f8a0a
 
 
dd5d9ad
 
 
 
 
 
 
 
a1a6daf
 
dd5d9ad
 
 
 
 
 
 
 
 
 
 
 
a1a6daf
 
dd5d9ad
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
73
74
75
76
77
78
79
80
81
82
83
84
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
<script lang="ts">
	import { base } from "$app/paths";
	import { page } from "$app/state";
	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 type { ConvSidebar } from "$lib/types/ConvSidebar";

	interface Props {
		conv: ConvSidebar;
	}

	let { conv }: Props = $props();

	let confirmDelete = $state(false);

	const dispatch = createEventDispatcher<{
		deleteConversation: string;
		editConversationTitle: { id: string; title: string };
	}>();
</script>

<a
	data-sveltekit-noscroll
	onmouseleave={() => {
		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 sm:h-[2.35rem] {conv.id ===
	page.params.id
		? 'bg-gray-100 dark:bg-gray-700'
		: ''}"
>
	<div class="flex flex-1 items-center truncate">
		{#if confirmDelete}
			<span class="mr-1 font-semibold"> Delete </span>
		{/if}
		{#if conv.avatarUrl}
			<img
				src="{base}{conv.avatarUrl}"
				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"
			></div>
			{conv.title.replace(/\p{Emoji}/gu, "")}
		{:else}
			{conv.title}
		{/if}
	</div>

	{#if confirmDelete}
		<button
			type="button"
			class="flex h-5 w-5 items-center justify-center rounded md:hidden md:group-hover:flex"
			title="Cancel delete action"
			onclick={(e) => {
				e.preventDefault();
				confirmDelete = false;
			}}
		>
			<CarbonClose 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="Confirm delete action"
			onclick={(e) => {
				e.preventDefault();
				confirmDelete = false;
				dispatch("deleteConversation", conv.id);
			}}
		>
			<CarbonCheckmark 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"
			onclick={(e) => {
				e.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"
			onclick={(event) => {
				event.preventDefault();
				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>