mod theme; mod upload_dragger; use crate::{mount_style, utils::add_event_listener}; use leptos::*; pub use theme::UploadTheme; pub use upload_dragger::UploadDragger; pub use web_sys::FileList; #[component] pub fn Upload( #[prop(optional, into)] accept: MaybeSignal, #[prop(optional, into)] multiple: MaybeSignal, #[prop(optional, into)] custom_request: Option>, children: Children, ) -> impl IntoView { mount_style("upload", include_str!("./upload.css")); let input_ref = create_node_ref::(); let trigger_ref = create_node_ref::(); trigger_ref.on_load(move |trigger_ref| { let handle = add_event_listener(trigger_ref.into_any(), ev::click, move |_| { if let Some(input_ref) = input_ref.get_untracked() { input_ref.click(); } }); on_cleanup(move || { handle.remove(); }); }); let on_file_addition = move |files: FileList| { if let Some(custom_request) = custom_request { custom_request.call(files); } }; let on_change = move |_| { if let Some(input_ref) = input_ref.get_untracked() { if let Some(files) = input_ref.files() { on_file_addition(files); } input_ref.set_value(""); } }; let is_trigger_dragover = create_rw_signal(false); let on_trigger_drop = move |event: ev::DragEvent| { event.prevent_default(); if let Some(data) = event.data_transfer() { if let Some(files) = data.files() { on_file_addition(files); } } is_trigger_dragover.set(false); }; let on_trigger_dragover = move |event: ev::DragEvent| { event.prevent_default(); is_trigger_dragover.set(true); }; let on_trigger_dragenter = move |event: ev::DragEvent| { event.prevent_default(); }; let on_trigger_dragleave = move |event: ev::DragEvent| { event.prevent_default(); is_trigger_dragover.set(false); }; view! {
{children()}
} }