dioxus_web/
data_transfer.rs

1use crate::WebFileData;
2use dioxus_html::{FileData, NativeDataTransfer};
3
4/// A wrapper around the web_sys::DataTransfer to implement NativeDataTransfer
5#[derive(Clone)]
6pub struct WebDataTransfer {
7    pub(crate) data: web_sys::DataTransfer,
8}
9
10impl WebDataTransfer {
11    /// Create a new WebDataTransfer from a web_sys::DataTransfer
12    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}