Skip to main content

freya_components/
activable_context.rs

1use freya_core::prelude::{
2    Readable,
3    use_try_consume,
4};
5
6/// Context that exposes whether the descendants are considered active.
7///
8/// Provided by [`Activable`](crate::activable::Activable) for user-controlled state
9/// and by [`ActivableRoute`](crate::activable_route::ActivableRoute) for route-driven
10/// state. Descendants read it via [`use_is_active`].
11#[derive(Clone)]
12pub struct ActivableContext(pub Readable<bool>);
13
14impl ActivableContext {
15    pub fn is_active(&self) -> bool {
16        *self.0.read()
17    }
18}
19
20/// Returns whether the closest ancestor [`ActivableContext`] provider is active.
21///
22/// Falls back to `false` when no provider is found in the tree.
23pub fn use_is_active() -> bool {
24    let ctx = use_try_consume::<ActivableContext>();
25
26    if let Some(ctx) = ctx {
27        ctx.is_active()
28    } else {
29        false
30    }
31}