use super::RouteVerdict;
use crate::{path::PathMaybeWithLocale, router::RouteInfo};
use std::cell::RefCell;
use std::rc::Rc;
use sycamore::prelude::{create_rc_signal, create_ref, RcSignal, Scope};
#[derive(Clone, Debug)]
pub struct RouterState {
load_state: RcSignal<RouterLoadState>,
last_verdict: Rc<RefCell<Option<RouteVerdict>>>,
pub(crate) reload_commander: RcSignal<bool>,
}
impl Default for RouterState {
fn default() -> Self {
Self {
load_state: create_rc_signal(RouterLoadState::Server),
last_verdict: Rc::new(RefCell::new(None)),
reload_commander: create_rc_signal(true),
}
}
}
impl RouterState {
pub fn get_load_state<'a>(&self, cx: Scope<'a>) -> &'a RcSignal<RouterLoadState> {
create_ref(cx, self.load_state.clone())
}
pub(crate) fn get_load_state_rc(&self) -> RcSignal<RouterLoadState> {
self.load_state.clone() }
pub(crate) fn set_load_state(&self, new: RouterLoadState) {
self.load_state.set(new);
}
pub fn get_last_verdict(&self) -> Option<RouteVerdict> {
(*self.last_verdict.borrow()).clone()
}
pub(crate) fn set_last_verdict(&self, new: RouteVerdict) {
let mut last_verdict = self.last_verdict.borrow_mut();
*last_verdict = Some(new);
}
pub fn reload(&self) {
self.reload_commander
.set(!*self.reload_commander.get_untracked())
}
pub fn get_path(&self) -> Option<PathMaybeWithLocale> {
let verdict = self.last_verdict.borrow();
if let Some(RouteVerdict::Found(RouteInfo { path, locale, .. })) = &*verdict {
Some(PathMaybeWithLocale::new(path, locale))
} else {
None
}
}
}
#[derive(Clone, Debug)]
pub enum RouterLoadState {
Loaded {
template_name: String,
path: PathMaybeWithLocale,
},
Loading {
template_name: String,
path: PathMaybeWithLocale,
},
Server,
}