Skip to content

Commit ddcdab0

Browse files
committed
Replace effect with proper two-way binding for files list
1 parent 6eab253 commit ddcdab0

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed
Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
<script lang="ts">
2-
import { watch } from "runed";
3-
42
type Props = {
53
label?: string;
64
required?: boolean;
@@ -9,16 +7,22 @@
97
108
let { label = "File", required = false, file = $bindable<File | undefined>(undefined) }: Props = $props();
119
12-
let files = $state<FileList | undefined>();
10+
function getFiles() {
11+
if (file) {
12+
const dataTransfer = new DataTransfer();
13+
dataTransfer.items.add(file);
14+
return dataTransfer.files;
15+
}
16+
return new DataTransfer().files;
17+
}
1318
14-
watch(
15-
() => files,
16-
(newFiles) => {
17-
if (newFiles && newFiles.length > 0) {
18-
file = newFiles[0];
19-
}
20-
},
21-
);
19+
function setFiles(files: FileList | null) {
20+
if (files && files.length > 0) {
21+
file = files[0];
22+
} else {
23+
file = undefined;
24+
}
25+
}
2226
2327
const uid = $props.id();
2428
const labelId = `${uid}-label`;
@@ -33,5 +37,5 @@
3337
<span class="font-light">{label}</span>
3438
{/if}
3539
<span class="iconify size-4 shrink-0 text-em-disabled octicon--triangle-down-16"></span>
36-
<input id={inputId} aria-labelledby={labelId} type="file" {required} bind:files class="absolute top-0 left-0 size-full opacity-0" />
40+
<input id={inputId} aria-labelledby={labelId} type="file" {required} bind:files={getFiles, setFiles} class="absolute top-0 left-0 size-full opacity-0" />
3741
</label>

0 commit comments

Comments
 (0)