dioxus_web/
data_transfer.rs1use crate::WebFileData;
2use dioxus_html::{FileData, NativeDataTransfer};
3
4#[derive(Clone)]
6pub struct WebDataTransfer {
7 pub(crate) data: web_sys::DataTransfer,
8}
9
10impl WebDataTransfer {
11 pub fn new(data: web_sys::DataTransfer) -> Self {
13 Self { data }
14 }
15}
16
17unsafe impl Send for WebDataTransfer {}
18unsafe impl Sync for WebDataTransfer {}
19
20impl NativeDataTransfer for WebDataTransfer {
21 fn get_data(&self, format: &str) -> Option<String> {
22 self.data.get_data(format).ok()
23 }
24 fn set_data(&self, format: &str, data: &str) -> Result<(), String> {
25 self.data.set_data(format, data).map_err(|e| {
26 format!(
27 "Failed to set data for format {format}: {:?}",
28 e.as_string()
29 )
30 })
31 }
32 fn clear_data(&self, format: Option<&str>) -> Result<(), String> {
33 match format {
34 Some(f) => self.data.clear_data_with_format(f),
35 None => self.data.clear_data(),
36 }
37 .map_err(|e| format!("{:?}", e))
38 }
39 fn effect_allowed(&self) -> String {
40 self.data.effect_allowed()
41 }
42 fn set_effect_allowed(&self, effect: &str) {
43 self.data.set_effect_allowed(effect);
44 }
45 fn drop_effect(&self) -> String {
46 self.data.drop_effect()
47 }
48 fn set_drop_effect(&self, effect: &str) {
49 self.data.set_drop_effect(effect);
50 }
51
52 fn files(&self) -> Vec<FileData> {
53 let mut result = Vec::new();
54 if let Some(file_list) = self.data.files() {
55 for i in 0..file_list.length() {
56 if let Some(file) = file_list.item(i) {
57 result.push(FileData::new(WebFileData::new(
58 file,
59 web_sys::FileReader::new().unwrap(),
60 )));
61 }
62 }
63 }
64 result
65 }
66}