dioxus_local_storage/hooks/storage_iter/
mod.rs1mod storage_data;
2use super::*;
3
4pub struct UseStorageData {
5 storage: Option<Storage>,
6 }
8
9#[derive(Debug)]
11pub struct StorageIter<'a> {
12 inner: Option<Storage>,
13 count: u32,
14 index: u32,
15 bound: PhantomData<&'a ()>,
16 }
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 #[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 regenerate()
81 })
82}