2 import { Paperclip } from '@lucide/svelte';
3 import { Button } from '$lib/components/ui/button';
4 import * as DropdownMenu from '$lib/components/ui/dropdown-menu';
5 import * as Tooltip from '$lib/components/ui/tooltip';
6 import { FILE_TYPE_ICONS } from '$lib/constants/icons';
7 import { FileTypeCategory } from '$lib/enums';
12 hasAudioModality?: boolean;
13 hasVisionModality?: boolean;
14 onFileUpload?: (fileType?: FileTypeCategory) => void;
18 class: className = '',
20 hasAudioModality = false,
21 hasVisionModality = false,
25 const fileUploadTooltipText = $derived.by(() => {
26 return !hasVisionModality
27 ? 'Text files and PDFs supported. Images, audio, and video require vision models.'
31 function handleFileUpload(fileType?: FileTypeCategory) {
32 onFileUpload?.(fileType);
36 <div class="flex items-center gap-1 {className}">
38 <DropdownMenu.Trigger name="Attach files">
42 class="file-upload-button h-8 w-8 rounded-full bg-transparent p-0 text-muted-foreground hover:bg-foreground/10 hover:text-foreground"
46 <span class="sr-only">Attach files</span>
48 <Paperclip class="h-4 w-4" />
53 <p>{fileUploadTooltipText}</p>
56 </DropdownMenu.Trigger>
58 <DropdownMenu.Content align="start" class="w-48">
60 <Tooltip.Trigger class="w-full">
62 class="images-button flex cursor-pointer items-center gap-2"
63 disabled={!hasVisionModality}
64 onclick={() => handleFileUpload(FileTypeCategory.IMAGE)}
66 <FILE_TYPE_ICONS.image class="h-4 w-4" />
72 {#if !hasVisionModality}
74 <p>Images require vision models to be processed</p>
80 <Tooltip.Trigger class="w-full">
82 class="audio-button flex cursor-pointer items-center gap-2"
83 disabled={!hasAudioModality}
84 onclick={() => handleFileUpload(FileTypeCategory.AUDIO)}
86 <FILE_TYPE_ICONS.audio class="h-4 w-4" />
88 <span>Audio Files</span>
92 {#if !hasAudioModality}
94 <p>Audio files require audio models to be processed</p>
100 class="flex cursor-pointer items-center gap-2"
101 onclick={() => handleFileUpload(FileTypeCategory.TEXT)}
103 <FILE_TYPE_ICONS.text class="h-4 w-4" />
105 <span>Text Files</span>
109 <Tooltip.Trigger class="w-full">
111 class="flex cursor-pointer items-center gap-2"
112 onclick={() => handleFileUpload(FileTypeCategory.PDF)}
114 <FILE_TYPE_ICONS.pdf class="h-4 w-4" />
116 <span>PDF Files</span>
120 {#if !hasVisionModality}
122 <p>PDFs will be converted to text. Image-based PDFs may not work properly.</p>
126 </DropdownMenu.Content>