use crate::*;
pub fn use_file_upload() -> UseFileUpload {
UseFileUpload::new(
use_signal(Vec::new),
use_signal(Vec::new),
use_signal(Vec::new),
use_signal(|| false),
use_signal(String::new),
use_signal(|| false),
use_signal(|| "No files selected".to_string()),
)
}
pub fn file_upload_on_change(state: UseFileUpload) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Change, move |event: Event| {
if let Some(target) = event.target()
&& let Ok(input) = target.clone().dyn_into::<HtmlInputElement>()
{
let value: String = input.value();
let names: Vec<String> = if value.is_empty() {
Vec::new()
} else {
value
.split(',')
.map(|s| {
s.trim()
.split('\\')
.next_back()
.unwrap_or("")
.split('/')
.next_back()
.unwrap_or("")
.to_string()
})
.filter(|s| !s.is_empty())
.collect()
};
state.get_file_names().set(names.clone());
if names.is_empty() {
state.get_file_sizes().set(Vec::new());
state.get_file_types().set(Vec::new());
state.get_status().set("No files selected".to_string());
} else {
let count: usize = names.len();
state
.get_status()
.set(format!("{} file(s) selected", count));
Console::log(&format!("Files selected: {:?}", names));
}
}
})
}
pub fn file_upload_on_clear(state: UseFileUpload) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Click, move |_event: Event| {
state.get_file_names().set(Vec::new());
state.get_file_sizes().set(Vec::new());
state.get_file_types().set(Vec::new());
state.get_drag_over().set(false);
state.get_status().set("No files selected".to_string());
})
}
pub fn file_upload_on_drag_enter(state: UseFileUpload) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::DragEnter, move |_event: Event| {
state.get_drag_over().set(true);
})
}
pub fn file_upload_on_drag_leave(state: UseFileUpload) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::DragLeave, move |_event: Event| {
state.get_drag_over().set(false);
})
}
pub fn file_upload_on_drag_over(state: UseFileUpload) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::DragOver, move |_event: Event| {
state.get_drag_over().set(true);
})
}
pub fn file_upload_on_drop(state: UseFileUpload) -> NativeEventHandler {
NativeEventHandler::new(NativeEventName::Drop, move |event: Event| {
state.get_drag_over().set(false);
if let Some(drag_event) = event.dyn_ref::<DragEvent>() {
let has_files: bool = drag_event
.data_transfer()
.map(|dt: DataTransfer| {
let len: u32 = dt.types().length();
(0..len)
.any(|i: u32| dt.types().get(i).as_string() == Some("Files".to_string()))
})
.unwrap_or(false);
if has_files {
state
.get_status()
.set("File(s) dropped - reading file names requires JS interop".to_string());
Console::log("Drop: files detected in data transfer");
} else {
state.get_status().set("No files in drop data".to_string());
}
}
})
}