Skip to main content

dioxus_docs_kit/blog/
hooks.rs

1use dioxus::prelude::*;
2
3use crate::BlogContext;
4use crate::blog::registry::BlogRegistry;
5use crate::components::{DrawerOpen, SearchOpen};
6
7/// Newtype wrapper for the active tag filter on the blog list page.
8#[derive(Clone, Copy)]
9pub struct ActiveTag(pub Signal<Option<String>>);
10
11/// Newtype wrapper for the current blog list pagination page (0-based).
12#[derive(Clone, Copy)]
13pub struct CurrentPage(pub Signal<usize>);
14
15/// Signals returned by [`use_blog_providers`].
16pub struct BlogProviders {
17    pub search_open: Signal<bool>,
18    pub drawer_open: Signal<bool>,
19    pub active_tag: Signal<Option<String>>,
20    pub current_page: Signal<usize>,
21}
22
23/// One-call setup for all context providers that `BlogLayout` and its children expect.
24pub fn use_blog_providers(registry: &'static BlogRegistry, blog_ctx: BlogContext) -> BlogProviders {
25    use_context_provider(|| registry);
26    use_context_provider(|| blog_ctx);
27
28    let search_open = use_signal(|| false);
29    let drawer_open = use_signal(|| false);
30    let active_tag: Signal<Option<String>> = use_signal(|| None);
31    let current_page = use_signal(|| 0usize);
32
33    use_context_provider(|| SearchOpen(search_open));
34    use_context_provider(|| DrawerOpen(drawer_open));
35    use_context_provider(|| ActiveTag(active_tag));
36    use_context_provider(|| CurrentPage(current_page));
37
38    BlogProviders {
39        search_open,
40        drawer_open,
41        active_tag,
42        current_page,
43    }
44}