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