Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
inference-widgets
/
packages
/widgets
/src
/lib
/components
/InferenceWidget
/shared
/WidgetFileInput
/WidgetFileInput.svelte
<script lang="ts"> | |
import IconSpin from "$lib/components/Icons/IconSpin.svelte"; | |
import IconFile from "$lib/components/Icons/IconFile.svelte"; | |
export let accept: string | undefined; | |
export let classNames = ""; | |
export let isLoading = false; | |
export let isDisabled = false; | |
export let label = "Browse for file"; | |
export let onSelectFile: (file: File | Blob) => void; | |
let fileInput: HTMLInputElement; | |
let isDragging = false; | |
function onChange() { | |
const file = fileInput.files?.[0]; | |
if (file) { | |
onSelectFile(file); | |
} | |
} | |
</script> | |
{#if !isDisabled} | |
<div | |
class={classNames} | |
on:dragenter={() => { | |
isDragging = true; | |
}} | |
on:dragover|preventDefault | |
on:dragleave={() => { | |
isDragging = false; | |
}} | |
on:drop|preventDefault={(e) => { | |
isDragging = false; | |
fileInput.files = e.dataTransfer?.files ?? null; | |
onChange(); | |
}} | |
> | |
<label class="btn-widget {isDragging ? 'ring' : ''} {isLoading ? 'text-gray-600' : ''}"> | |
{#if isLoading} | |
<IconSpin classNames="-ml-1 mr-1.5 text-gray-600 animate-spin" /> | |
{:else} | |
<IconFile classNames="-ml-1 mr-1.5" /> | |
{/if} | |
<input | |
{accept} | |
bind:this={fileInput} | |
on:change={onChange} | |
disabled={isLoading || isDisabled} | |
style="display: none;" | |
type="file" | |
/> | |
{label} | |
</label> | |
</div> | |
{/if} | |