use crate::{
Component, Context, Hooks, UseState,
components::router::history::RouterHistory,
prelude::{ContextProvider, Outlet, RouteContext, RouteState, Routes},
};
use ratatui_kit_macros::{Props, element};
use std::collections::HashMap;
#[derive(Default, Props)]
pub struct RouterProviderProps {
pub routes: Routes,
pub index_path: String,
pub history_length: Option<usize>,
pub state: Option<RouteState>,
}
pub struct RouterProvider;
impl Component for RouterProvider {
type Props<'a> = RouterProviderProps;
fn new(_props: &Self::Props<'_>) -> Self {
Self
}
fn update(
&mut self,
props: &mut Self::Props<'_>,
mut hooks: Hooks,
updater: &mut crate::ComponentUpdater,
) {
let history = hooks.use_state(|| {
RouterHistory::new(
RouteContext {
params: HashMap::new(),
path: props.index_path.clone(),
state: props.state.clone(),
},
props.history_length.unwrap_or(10),
)
});
let ctx = history.read().current_context();
updater.update_children(
[element!(
ContextProvider(
value: Context::owned(history),
) {
ContextProvider(
value: Context::owned(ctx),
){
Outlet
}
}
)],
Some(Context::from_mut(&mut props.routes)),
);
}
}