|
<script lang="ts"> |
|
import { createEventDispatcher, tick } from "svelte"; |
|
import { Upload, ModifyUpload } from "@gradio/upload"; |
|
import type { FileData } from "@gradio/client"; |
|
import { BlockLabel } from "@gradio/atoms"; |
|
import { File } from "@gradio/icons"; |
|
|
|
import FilePreview from "./FilePreview.svelte"; |
|
import type { I18nFormatter } from "@gradio/utils"; |
|
|
|
export let value: null | FileData | FileData[]; |
|
|
|
export let label: string; |
|
export let show_label = true; |
|
export let file_count = "single"; |
|
export let file_types: string[] | null = null; |
|
export let selectable = false; |
|
export let root: string; |
|
export let height: number | undefined = undefined; |
|
export let i18n: I18nFormatter; |
|
|
|
async function handle_upload({ |
|
detail |
|
}: CustomEvent<FileData | FileData[]>): Promise<void> { |
|
value = detail; |
|
await tick(); |
|
dispatch("change", value); |
|
dispatch("upload", detail); |
|
} |
|
|
|
function handle_clear(): void { |
|
value = null; |
|
dispatch("change", null); |
|
dispatch("clear"); |
|
} |
|
|
|
const dispatch = createEventDispatcher<{ |
|
change: FileData[] | FileData | null; |
|
clear: undefined; |
|
drag: boolean; |
|
upload: FileData[] | FileData; |
|
load: FileData[] | FileData; |
|
error: string; |
|
}>(); |
|
|
|
let accept_file_types: string | null; |
|
if (file_types == null) { |
|
accept_file_types = null; |
|
} else { |
|
file_types = file_types.map((x) => { |
|
if (x.startsWith(".")) { |
|
return x; |
|
} |
|
return x + "/*"; |
|
}); |
|
accept_file_types = file_types.join(", "); |
|
} |
|
|
|
let dragging = false; |
|
$: dispatch("drag", dragging); |
|
</script> |
|
|
|
<BlockLabel |
|
{show_label} |
|
Icon={File} |
|
float={value === null} |
|
label={label || "File"} |
|
/> |
|
|
|
{#if value && (Array.isArray(value) ? value.length > 0 : false)} |
|
<ModifyUpload {i18n} on:clear={handle_clear} absolute /> |
|
<FilePreview {i18n} on:select {selectable} {value} {height} /> |
|
{:else} |
|
<Upload |
|
on:load={handle_upload} |
|
filetype={accept_file_types} |
|
{file_count} |
|
{root} |
|
bind:dragging |
|
> |
|
<slot /> |
|
</Upload> |
|
{/if} |
|
|