|
<script lang="ts">
|
|
import { createEventDispatcher, tick } from "svelte";
|
|
import { Upload, ModifyUpload } from "@gradio/upload";
|
|
import type { FileData, Client } 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" | "multiple" | "directory" = "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;
|
|
export let max_file_size: number | null = null;
|
|
export let upload: Client["upload"];
|
|
export let stream_handler: Client["stream"];
|
|
|
|
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 dragging = false;
|
|
$: dispatch("drag", dragging);
|
|
</script>
|
|
|
|
<BlockLabel {show_label} Icon={File} float={!value} label={label || "File"} />
|
|
|
|
{#if value && (Array.isArray(value) ? value.length > 0 : true)}
|
|
<ModifyUpload {i18n} on:clear={handle_clear} absolute />
|
|
<FilePreview
|
|
{i18n}
|
|
on:select
|
|
{selectable}
|
|
{value}
|
|
{height}
|
|
on:change
|
|
on:delete
|
|
/>
|
|
{:else}
|
|
<Upload
|
|
on:load={handle_upload}
|
|
filetype={file_types}
|
|
{file_count}
|
|
{max_file_size}
|
|
{root}
|
|
bind:dragging
|
|
on:error
|
|
{stream_handler}
|
|
{upload}
|
|
>
|
|
<slot />
|
|
</Upload>
|
|
{/if}
|
|
|