mirror of
https://github.com/leptos-rs/leptos
synced 2024-11-10 06:44:17 +00:00
Use URLSearchParams to handle client side query param logic
This commit is contained in:
parent
e4c9109278
commit
18eecd9606
2 changed files with 45 additions and 8 deletions
|
@ -56,7 +56,7 @@ features = [
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
csr = ["leptos/csr"]
|
csr = ["leptos/csr"]
|
||||||
hydrate = ["leptos/hydrate", "dep:url"]
|
hydrate = ["leptos/hydrate"]
|
||||||
ssr = ["leptos/ssr", "dep:url", "dep:regex"]
|
ssr = ["leptos/ssr", "dep:url", "dep:regex"]
|
||||||
stable = ["leptos/stable"]
|
stable = ["leptos/stable"]
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
use crate::ParamsMap;
|
use crate::ParamsMap;
|
||||||
use std::borrow::Cow;
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
use js_sys::{try_iter, Array, JsString};
|
||||||
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
use wasm_bindgen::JsCast;
|
||||||
|
#[cfg(not(feature = "ssr"))]
|
||||||
|
use wasm_bindgen::JsValue;
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
||||||
pub struct Url {
|
pub struct Url {
|
||||||
|
@ -25,11 +30,41 @@ pub fn escape(s: &str) -> String {
|
||||||
js_sys::encode_uri(s).as_string().unwrap()
|
js_sys::encode_uri(s).as_string().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ssr"))]
|
||||||
impl TryFrom<&str> for Url {
|
impl TryFrom<&str> for Url {
|
||||||
type Error = String;
|
type Error = String;
|
||||||
|
|
||||||
fn try_from(url: &str) -> Result<Self, Self::Error> {
|
fn try_from(url: &str) -> Result<Self, Self::Error> {
|
||||||
let url = url::Url::parse(&normalize_wasm_url(url)).map_err(|e| e.to_string())?;
|
let fake_host = String::from("http://leptos");
|
||||||
|
let url = web_sys::Url::new_with_base(url, &fake_host).map_js_error()?;
|
||||||
|
Ok(Self {
|
||||||
|
origin: url.origin(),
|
||||||
|
pathname: url.pathname(),
|
||||||
|
search: url.search(),
|
||||||
|
search_params: ParamsMap(
|
||||||
|
try_iter(&url.search_params())
|
||||||
|
.map_js_error()?
|
||||||
|
.ok_or("Failed to use URLSearchParams as an iterator".to_string())?
|
||||||
|
.map(|value| {
|
||||||
|
let array: Array = value.map_js_error()?.dyn_into().map_js_error()?;
|
||||||
|
Ok((
|
||||||
|
array.get(0).dyn_into::<JsString>().map_js_error()?.into(),
|
||||||
|
array.get(1).dyn_into::<JsString>().map_js_error()?.into(),
|
||||||
|
))
|
||||||
|
})
|
||||||
|
.collect::<Result<linear_map::LinearMap<String, String>, Self::Error>>()?,
|
||||||
|
),
|
||||||
|
hash: url.hash(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
impl TryFrom<&str> for Url {
|
||||||
|
type Error = String;
|
||||||
|
|
||||||
|
fn try_from(url: &str) -> Result<Self, Self::Error> {
|
||||||
|
let url = url::Url::parse(url).map_err(|e| e.to_string())?;
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
origin: url.origin().unicode_serialization(),
|
origin: url.origin().unicode_serialization(),
|
||||||
pathname: url.path().to_string(),
|
pathname: url.path().to_string(),
|
||||||
|
@ -44,12 +79,14 @@ impl TryFrom<&str> for Url {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "ssr")]
|
#[cfg(not(feature = "ssr"))]
|
||||||
fn normalize_wasm_url(url: &str) -> Cow<'_, str> {
|
trait MapJsError<T> {
|
||||||
Cow::Borrowed(url)
|
fn map_js_error(self) -> Result<T, String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "ssr"))]
|
#[cfg(not(feature = "ssr"))]
|
||||||
fn normalize_wasm_url(url: &str) -> Cow<'_, str> {
|
impl<T> MapJsError<T> for Result<T, JsValue> {
|
||||||
Cow::Owned(format!("http://leptos{}", url))
|
fn map_js_error(self) -> Result<T, String> {
|
||||||
|
self.map_err(|e| e.as_string().unwrap_or_default())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue