use crate::{use_atom_root, AtomId, AtomRef, AtomRoot, Readable}; use dioxus_core::{ScopeId, ScopeState}; use std::{ cell::{Ref, RefCell, RefMut}, rc::Rc, }; /// /// /// /// /// /// /// /// pub fn use_atom_ref(cx: &ScopeState, atom: AtomRef) -> &UseAtomRef { let root = use_atom_root(cx); cx.use_hook(|_| { root.initialize(atom); UseAtomRef { ptr: atom.unique_id(), root: root.clone(), scope_id: cx.scope_id(), value: root.register(atom, cx.scope_id()), } }) } pub struct UseAtomRef { ptr: AtomId, value: Rc>, root: Rc, scope_id: ScopeId, } impl UseAtomRef { pub fn read(&self) -> Ref { self.value.borrow() } pub fn write(&self) -> RefMut { self.root.force_update(self.ptr); self.value.borrow_mut() } pub fn write_silent(&self) -> RefMut { self.root.force_update(self.ptr); self.value.borrow_mut() } pub fn set(&self, new: T) { self.root.force_update(self.ptr); self.root.set(self.ptr, new); } } impl Drop for UseAtomRef { fn drop(&mut self) { self.root.unsubscribe(self.ptr, self.scope_id) } }