Skip to main content

forge_dioxus/
context.rs

1
2use dioxus::prelude::*;
3
4use crate::ForgeClientError;
5use crate::signals::{ForgeSignals, SignalsConfig, setup_auto_capture};
6use crate::{ConnectionState, ForgeClient, ForgeClientConfig};
7
8#[component]
9pub fn ForgeProvider(
10    url: String,
11    #[props(default)] signals: Option<SignalsConfig>,
12    #[props(default)] on_mutation_error: Option<EventHandler<ForgeClientError>>,
13    children: Element,
14) -> Element {
15    let connection_state = use_context_provider(|| Signal::new(ConnectionState::Disconnected));
16    let client = use_context_provider(|| {
17        let mut config = ForgeClientConfig::new(url).with_connection_state(connection_state);
18        if let Some(handler) = on_mutation_error {
19            config = config.with_mutation_error_handler(move |err| handler.call(err));
20        }
21        ForgeClient::new(config)
22    });
23
24    let signals_config = signals.unwrap_or_default();
25    let signals_instance = use_context_provider(|| {
26        let s = ForgeSignals::new(client.clone(), signals_config);
27        client.set_signals(s.clone());
28        s
29    });
30
31    use_hook(|| {
32        setup_auto_capture(signals_instance);
33    });
34
35    rsx! { {children} }
36}
37
38pub fn use_forge_client() -> ForgeClient {
39    use_context::<ForgeClient>()
40}
41
42pub fn use_connection_state() -> Signal<ConnectionState> {
43    use_context::<Signal<ConnectionState>>()
44}