use wasm_bindgen::UnwrapThrowExt;
use web_sys::{File as SysFile, HtmlInputElement};
use yew::prelude::*;
use crate::{Alignment, Size};
#[derive(Clone, Debug, Properties, PartialEq)]
pub struct FileProps {
pub name: String,
pub files: Vec<SysFile>,
pub update: Callback<Vec<SysFile>>,
#[prop_or_else(|| "Choose a file...".into())]
pub selector_label: String,
#[prop_or_default]
pub selector_icon: Html,
#[prop_or_default]
pub classes: Classes,
#[prop_or_default]
pub has_name: Option<String>,
#[prop_or_default]
pub right: bool,
#[prop_or_default]
pub fullwidth: bool,
#[prop_or_default]
pub boxed: bool,
#[prop_or_default]
pub multiple: bool,
#[prop_or_default]
pub size: Option<Size>,
#[prop_or_default]
pub alignment: Option<Alignment>,
}
#[function_component(File)]
pub fn file(props: &FileProps) -> Html {
let class = classes!(
"file",
props.classes.clone(),
props.has_name.is_some().then_some("has-name"),
props.right.then_some("is-right"),
props.fullwidth.then_some("is-fullwidth"),
props.boxed.then_some("is-boxed"),
props.size.as_ref().map(|size| size.to_string()),
props.alignment.as_ref().map(|alignment| alignment.to_string()),
);
let filenames = props
.files
.iter()
.map(|file| html! {<span class="file-name">{file.name()}</span>})
.collect::<Vec<_>>();
let onchange = props.update.reform(|ev: web_sys::Event| {
let input: HtmlInputElement = ev.target_dyn_into().expect_throw("event target should be an input");
let list = input.files().expect_throw("input should have a file list");
(0..list.length())
.into_iter()
.filter_map(|idx| list.item(idx))
.collect::<Vec<_>>()
});
html! {
<div {class}>
<label class="file-label">
<input
type="file"
class="file-input"
name={props.name.clone()}
multiple={props.multiple}
{onchange}
/>
<span class="file-cta">
<span class="file-icon">
{props.selector_icon.clone()}
</span>
<span class="file-label">
{props.selector_label.clone()}
</span>
</span>
{filenames}
</label>
</div>
}
}