dioxus_local_storage/hooks/storage_iter/
mod.rs

1mod storage_data;
2use super::*;
3
4pub struct UseStorageData {
5    storage: Option<Storage>,
6    // last_event: Option<StorageEvent>,
7}
8
9///
10#[derive(Debug)]
11pub struct StorageIter<'a> {
12    inner: Option<Storage>,
13    count: u32,
14    index: u32,
15    bound: PhantomData<&'a ()>,
16    // pub(crate) value: String,
17}
18
19impl<'a> Iterator for StorageIter<'a> {
20    type Item = (String, String);
21
22    fn next(&mut self) -> Option<Self::Item> {
23        if self.index + 1 > self.count {
24            return None;
25        }
26        self.index += 1;
27        let storage = self.inner.as_ref()?;
28        let key = storage.key(self.index).ok()??;
29        let value = storage.get_item(&key).ok()??;
30        Some((key, value))
31    }
32    #[inline]
33    fn size_hint(&self) -> (usize, Option<usize>) {
34        let c = self.count as usize;
35        (c, Some(c))
36    }
37    #[inline]
38    fn count(self) -> usize
39    where
40        Self: Sized,
41    {
42        self.count as usize
43    }
44}
45
46impl<'a> StorageIter<'a> {
47    /// c
48    #[inline]
49    pub fn new(storage: Option<Storage>) -> Self {
50        let count = match &storage {
51            None => 0,
52            Some(s) => s.length().unwrap_or_default(),
53        };
54        Self { inner: storage, count, index: 0, bound: Default::default() }
55    }
56}
57
58#[inline]
59pub(crate) fn storage_eq(owned: &Option<Storage>, event: &Option<Storage>) -> bool {
60    match (owned, event) {
61        (Some(lhs), Some(rhs)) => lhs.eq(&rhs),
62        _ => false,
63    }
64}
65
66pub(crate) fn on_storage(cx: &ScopeState, window: &Window, data: &Rc<RefCell<UseStorageData>>) -> EventListener {
67    #[cfg(debug_assertions)]
68    {
69        info!("Window Storage Listener Initialized at {}!", cx.scope_id().0);
70    }
71    let setter = data.clone();
72    let regenerate = cx.schedule_update();
73    EventListener::new(window, "storage", move |e| {
74        let e: StorageEvent = e.clone().unchecked_into();
75        let setter = setter.borrow_mut();
76        if !storage_eq(&setter.storage, &e.storage_area()) {
77            return;
78        }
79        // setter.last_event = Some(e);
80        regenerate()
81    })
82}