Skip to main content

orbital_base_components/overlay/
open_bind.rs

1use leptos::prelude::*;
2
3/// Two-way open-state handle for modal overlays.
4#[derive(Clone, Copy)]
5pub enum OpenBind {
6    Signal(RwSignal<bool>),
7    ReadWrite(ReadSignal<bool>, WriteSignal<bool>),
8}
9
10impl OpenBind {
11    pub fn get(&self) -> bool {
12        match self {
13            Self::Signal(signal) => signal.get(),
14            Self::ReadWrite(read, _) => read.get(),
15        }
16    }
17
18    pub fn get_untracked(&self) -> bool {
19        match self {
20            Self::Signal(signal) => signal.get_untracked(),
21            Self::ReadWrite(read, _) => read.get_untracked(),
22        }
23    }
24
25    pub fn set(&self, value: bool) {
26        match self {
27            Self::Signal(signal) => signal.set(value),
28            Self::ReadWrite(_, write) => write.set(value),
29        }
30    }
31
32    pub fn signal(&self) -> Signal<bool> {
33        match self {
34            Self::Signal(signal) => signal.read_only().into(),
35            Self::ReadWrite(read, _) => {
36                let read = *read;
37                Signal::derive(move || read.get())
38            }
39        }
40    }
41}
42
43impl From<RwSignal<bool>> for OpenBind {
44    fn from(signal: RwSignal<bool>) -> Self {
45        Self::Signal(signal)
46    }
47}
48
49impl From<(ReadSignal<bool>, WriteSignal<bool>)> for OpenBind {
50    fn from((read, write): (ReadSignal<bool>, WriteSignal<bool>)) -> Self {
51        Self::ReadWrite(read, write)
52    }
53}
54
55impl From<bool> for OpenBind {
56    fn from(value: bool) -> Self {
57        Self::Signal(RwSignal::new(value))
58    }
59}
60
61impl Default for OpenBind {
62    fn default() -> Self {
63        Self::Signal(RwSignal::new(false))
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn rw_signal_round_trip() {
73        Owner::new().with(|| {
74            let signal = RwSignal::new(false);
75            let bind = OpenBind::from(signal);
76            bind.set(true);
77            assert!(bind.get_untracked());
78            bind.set(false);
79            assert!(!bind.get_untracked());
80        });
81    }
82}