use super::params::ParamsMap;
use crate::{State, Url};
use leptos::*;
pub fn create_location(
cx: Scope,
path: ReadSignal<String>,
state: ReadSignal<State>,
) -> Location {
let url = create_memo(cx, move |prev: Option<&Url>| {
path.with(|path| match Url::try_from(path.as_str()) {
Ok(url) => url,
Err(e) => {
leptos::error!("[Leptos Router] Invalid path {path}\n\n{e:?}");
prev.cloned().unwrap()
}
})
});
let pathname =
create_memo(cx, move |_| url.with(|url| url.pathname.clone()));
let search = create_memo(cx, move |_| url.with(|url| url.search.clone()));
let hash = create_memo(cx, move |_| url.with(|url| url.hash.clone()));
let query =
create_memo(cx, move |_| url.with(|url| url.search_params.clone()));
Location {
pathname,
search,
hash,
query,
state,
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Location {
pub pathname: Memo<String>,
pub search: Memo<String>,
pub query: Memo<ParamsMap>,
pub hash: Memo<String>,
pub state: ReadSignal<State>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct LocationChange {
pub value: String,
pub replace: bool,
pub scroll: bool,
pub state: State,
}
impl Default for LocationChange {
fn default() -> Self {
Self {
value: Default::default(),
replace: true,
scroll: true,
state: Default::default(),
}
}
}