flams_web_utils/components/mod.rs
1#![allow(clippy::must_use_candidate)]
2
3mod r#await;
4mod drawer;
5mod trees;
6
7mod errors;
8pub use errors::*;
9use leptos::prelude::*;
10
11mod layout;
12pub use layout::*;
13
14pub use drawer::*;
15pub use r#await::*;
16pub use trees::*;
17
18pub use ftml_component_utils::Header;
19#[leptos::prelude::slot]
20pub struct Trigger {
21 children: leptos::prelude::Children,
22}
23
24#[macro_export]
25macro_rules! client_only {
26 ($b:expr) => {{
27 let sig = ::leptos::prelude::RwSignal::new(false);
28 ::leptos::prelude::Effect::new(move || {
29 #[cfg(feature = "hydrate")]
30 {
31 sig.set(true);
32 }
33 });
34 move || if sig.get() { Some($b) } else { None }
35 }};
36}
37
38#[component]
39pub fn ClientOnly(children: Children) -> impl IntoView {
40 let children = std::cell::Cell::new(Some(children));
41 let sig = RwSignal::new(false);
42 let rf = NodeRef::new();
43 rf.on_load(move |_| sig.set(true));
44 move || {
45 if sig.get() {
46 leptos::either::Either::Left(children.take().map(|c| c()))
47 } else {
48 leptos::either::Either::Right(view!(<div node_ref = rf/>))
49 }
50 }
51}