dioxus_switch/
lib.rs

1use dioxus_core::{Element, IntoDynNode};
2use dioxus_core_macro::{Props, component, rsx};
3use dioxus_hooks::{use_context, use_context_provider};
4use dioxus_signals::{GlobalSignal, Readable, Signal, Writable};
5pub use dioxus_switch_macro::Switch;
6
7pub trait Switchable: Default + PartialEq + Clone + 'static {
8    fn component(self) -> Element;
9}
10
11#[component]
12pub fn Switch<T: Switchable + 'static>(#[props(optional)] current: Option<T>) -> Element {
13    let context =
14        use_context_provider(move || Signal::new(current.unwrap_or_else(|| T::default())));
15    rsx! {
16        {context.read().clone().component()}
17    }
18}
19
20pub fn switch<T: Switchable>(to: T) {
21    *use_context::<Signal<T>>().write() = to;
22}