Skip to main content

dioxus_docs_kit/
hooks.rs

1use dioxus::prelude::*;
2
3use crate::DocsContext;
4use crate::components::DrawerOpen;
5use crate::registry::DocsRegistry;
6
7/// Signals returned by [`use_docs_providers`] so the consumer's header RSX
8/// can reference them (e.g. to wire up a search button or drawer toggle).
9pub struct DocsProviders {
10    pub search_open: Signal<bool>,
11    pub drawer_open: Signal<bool>,
12}
13
14/// One-call setup for all the context providers that `DocsLayout` and its
15/// children expect.
16///
17/// Call this in your docs layout wrapper **before** rendering `DocsLayout`:
18///
19/// ```rust,ignore
20/// let providers = use_docs_providers(&*DOCS, docs_ctx);
21/// // Use providers.search_open / providers.drawer_open in your header RSX
22/// ```
23///
24/// This replaces the manual calls to:
25/// - `use_context_provider(|| registry)`
26/// - `use_context_provider(|| docs_ctx)`
27/// - `use_signal(|| false)` × 2 + `use_context_provider` for search_open / DrawerOpen
28pub fn use_docs_providers(registry: &'static DocsRegistry, docs_ctx: DocsContext) -> DocsProviders {
29    use_context_provider(|| registry);
30    use_context_provider(|| docs_ctx);
31
32    let search_open = use_signal(|| false);
33    let drawer_open = use_signal(|| false);
34
35    use_context_provider(|| search_open);
36    use_context_provider(|| DrawerOpen(drawer_open));
37
38    DocsProviders {
39        search_open,
40        drawer_open,
41    }
42}