File size: 2,169 Bytes
15c3607
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>