File size: 2,257 Bytes
6b9d0d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
<script lang="ts">

	import { Dialog } from 'bits-ui';

	import { X } from '@lucide/svelte';

	import * as DialogUI from '$lib/components/ui/dialog';

	import { ChatAttachmentsPreview } from '$lib/components/app';

	import { KeyboardKey } from '$lib/enums';



	interface Props {

		open: boolean;

		uploadedFiles?: ChatUploadedFile[];

		attachments?: DatabaseMessageExtra[];

		activeModelId?: string;

		previewFocusIndex?: number;

	}



	let {

		open = $bindable(false),

		uploadedFiles = [],

		attachments = [],

		activeModelId,

		previewFocusIndex = 0

	}: Props = $props();



	function handleClose() {

		open = false;

	}



	$effect(() => {

		if (!open) return;



		function handleKeyDown(event: KeyboardEvent) {

			const target = event.target as HTMLElement;



			if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') return;



			switch (event.key) {

				case KeyboardKey.ARROW_LEFT:

					event.preventDefault();

					event.stopPropagation();



					document.dispatchEvent(new CustomEvent('chat-attachments-nav', { detail: -1 }));



					break;

				case KeyboardKey.ARROW_RIGHT:

					event.preventDefault();

					event.stopPropagation();



					document.dispatchEvent(new CustomEvent('chat-attachments-nav', { detail: 1 }));



					break;

				case KeyboardKey.SPACE:

					event.preventDefault();

					event.stopPropagation();



					document.dispatchEvent(new CustomEvent('chat-attachments-nav', { detail: 1 }));



					break;

			}

		}



		document.addEventListener('keydown', handleKeyDown);

		return () => document.removeEventListener('keydown', handleKeyDown);

	});

</script>

<Dialog.Root bind:open>
	<Dialog.Portal>
		<DialogUI.Overlay class="bg-black/85" style="z-index: 1000" />

		<Dialog.Content class="fixed inset-0 z-[1000] flex flex-col bg-transparent outline-none">
			<Dialog.Close

				class="absolute top-4 right-4 z-10 cursor-pointer text-white hover:text-gray-400"

				onclick={handleClose}

				aria-label="Close"

			>
				<X class="size-4" />
			</Dialog.Close>

			<ChatAttachmentsPreview

				{uploadedFiles}

				{attachments}

				{activeModelId}

				{previewFocusIndex}

				class="min-h-0 flex-1"

			/>
		</Dialog.Content>
	</Dialog.Portal>
</Dialog.Root>