use cranpose_animation::{AnimationType, Easing, tween};
use cranpose_coroflow::ProvideViewModelStore;
use cranpose_services::BackHandler;
use cranpose_ui::{Crossfade, composable};
use crate::controller::NavController;
const DEFAULT_TRANSITION_MILLIS: u64 = 700;
#[composable(no_skip)]
pub fn NavHost<R, F>(controller: NavController<R>, content: F)
where
R: Clone + PartialEq + 'static,
F: FnMut(R) + 'static,
{
NavHostWith(
controller,
tween(DEFAULT_TRANSITION_MILLIS, Easing::FastOutSlowInEasing),
content,
);
}
#[composable(no_skip)]
pub fn NavHostWith<R, F>(controller: NavController<R>, transition: AnimationType, mut content: F)
where
R: Clone + PartialEq + 'static,
F: FnMut(R) + 'static,
{
let (top, can_pop) = controller
.stack
.read(|stack| (stack.top(), stack.can_pop()));
BackHandler(can_pop, move || {
controller.navigate_up();
});
Crossfade(top, transition, move |entry| {
if let Some(entry) = entry {
let route = entry.route;
ProvideViewModelStore(entry.store, || content(route));
}
});
}