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}