File
A file component lets users drag and drop files or click to open a file picker for uploading.
Component preview
import * as UI from "@iyk/ui"
export default () => (
<form method="POST" className="w-full max-w-[330px] grid gap-8">
<UI.Field name="single-photo">
<UI.Label>Single Photo</UI.Label>
<UI.File
defaultValue={JSON.stringify({
url: "https://placehold.co/64x64?text=01",
name: "01_album_cover.jpg",
mimeType: "image/jpeg",
})}
handleFile={async (handler) => {
handler.progress = 5
await new Promise((resolve) => setTimeout(resolve, 700))
handler.progress = 50
await new Promise((resolve) => setTimeout(resolve, 600))
handler.progress = 98
await new Promise((resolve) => setTimeout(resolve, 400))
handler.progress = 100
}}
/>
</UI.Field>
<UI.Field name="photos">
<UI.Label>Multiple Photos</UI.Label>
<UI.File
multiple
sortable
defaultValue={[
JSON.stringify({
url: "https://placehold.co/64x64?text=01",
name: "01_album_cover.jpg",
mimeType: "image/jpeg",
}),
JSON.stringify({
url: "https://placehold.co/64x64?text=02",
name: "02_single_cover.jpg",
mimeType: "image/jpeg",
}),
JSON.stringify({
url: "https://placehold.co/64x64?text=03",
name: "03_album_cover.jpg",
mimeType: "image/jpeg",
}),
JSON.stringify({
url: "https://placehold.co/64x64?text=04",
name: "04_next_cover.jpg",
mimeType: "image/jpeg",
}),
]}
types={[
{
description: "Images",
accept: {
"image/avif": [".avif", ".avifs"],
"image/jpeg": [".jpeg", ".jpg"],
"image/png": [".png"],
"image/gif": [".gif"],
"image/webp": [".webp"],
},
},
]}
handleFile={async (handler) => {
handler.progress = 5
await new Promise((resolve) => setTimeout(resolve, 700))
handler.progress = 50
await new Promise((resolve) => setTimeout(resolve, 600))
handler.progress = 98
await new Promise((resolve) => setTimeout(resolve, 400))
handler.progress = 100
}}
/>
</UI.Field>
<UI.Button type="submit" kind="outline" size="md">
Update
</UI.Button>
</form>
)
Props
kind
"default" | "avatarCircle" | "avatarSquare"
Used to show which kind of file should render
defaultValue
string | string[] | null | undefined
The default value of the file
multiple
boolean
Allow multiple files
sortable
boolean
Allow the files to be sorted
types
FilePickerAcceptType[]
The types of files that can be uploaded
handleFile
(handler: File.Handler) => void
The function to handle the file
Kinds
import * as UI from "@iyk/ui"
export default () => (
<form method="POST" className="w-full max-w-[330px] grid gap-8">
<UI.Field name="avatar-circle">
<UI.Label>Avatar (circle)</UI.Label>
<UI.File
kind="avatarCircle"
handleFile={async (handler) => {
handler.progress = 100
}}
/>
</UI.Field>
<UI.Field name="avatar-rounded">
<UI.Label>Avatar (square)</UI.Label>
<UI.File
kind="avatarSquare"
handleFile={async (handler) => {
handler.progress = 100
}}
/>
</UI.Field>
<UI.Button type="submit" kind="outline" size="md">
Update
</UI.Button>
</form>
)