From ed3510de0ae709537987599e4bf8b5e859d1c196 Mon Sep 17 00:00:00 2001 From: Hamza Date: Tue, 18 May 2021 10:29:30 +0500 Subject: [PATCH] fix router --- packages/yew-router/src/service.rs | 4 +++- packages/yew-router/src/utils.rs | 30 +++++++++++++++-------------- packages/yew-router/tests/parser.rs | 23 ++++++++++++++++++++++ packages/yew-router/tests/router.rs | 3 +-- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/packages/yew-router/src/service.rs b/packages/yew-router/src/service.rs index 26950f5808b..c0a23117643 100644 --- a/packages/yew-router/src/service.rs +++ b/packages/yew-router/src/service.rs @@ -35,8 +35,10 @@ where fn push_impl(url: String) { let history = yew::utils::window().history().expect("no history"); + let path = build_path_with_base(&url); + history - .push_state_with_url(&JsValue::NULL, "", Some(&build_path_with_base(&url))) + .push_state_with_url(&JsValue::NULL, "", Some(&path)) .expect("push history"); let event = Event::new("popstate").unwrap(); yew::utils::window() diff --git a/packages/yew-router/src/utils.rs b/packages/yew-router/src/utils.rs index 159f4ee429e..5c775ab8c2d 100644 --- a/packages/yew-router/src/utils.rs +++ b/packages/yew-router/src/utils.rs @@ -1,15 +1,5 @@ use wasm_bindgen::JsCast; -fn strip_slash(path: String) -> String { - if path != "/" { - path.strip_suffix("/") - .map(|it| it.to_string()) - .unwrap_or(path) - } else { - path - } -} - pub fn base_url() -> Option { match yew::utils::document().query_selector("base[href]") { Ok(Some(base)) => { @@ -18,7 +8,14 @@ pub fn base_url() -> Option { let url = web_sys::Url::new(&base).unwrap(); let base = url.pathname(); - let base = strip_slash(base); + let base = if base != "/" { + base.strip_suffix("/") + .map(|it| it.to_string()) + .unwrap_or(base) + } else { + return None; + }; + Some(base) } _ => None, @@ -26,7 +23,12 @@ pub fn base_url() -> Option { } pub fn build_path_with_base(to: &str) -> String { - let to = format!("{}{}", base_url().as_deref().unwrap_or(""), to); - - strip_slash(to) + format!( + "{}{}", + base_url() + .as_deref() + .map(|it| it.strip_suffix("/").unwrap_or(it)) + .unwrap_or(""), + to + ) } diff --git a/packages/yew-router/tests/parser.rs b/packages/yew-router/tests/parser.rs index bfeac8ae55c..e1d10434be0 100644 --- a/packages/yew-router/tests/parser.rs +++ b/packages/yew-router/tests/parser.rs @@ -20,6 +20,8 @@ enum Routes { #[test] fn test_base_url() { + document().head().unwrap().set_inner_html(r#""#); + assert_eq!(base_url(), None); document() @@ -64,3 +66,24 @@ fn test_get_query_params() { map }); } + +#[test] +fn test_build_base_url() { + document().head().unwrap().set_inner_html(r#""#); + + assert_eq!(build_path_with_base("/posts"), "/posts"); + + document() + .head() + .unwrap() + .set_inner_html(r#""#); + + assert_eq!(build_path_with_base("/posts/"), "/router/posts/"); + + document() + .head() + .unwrap() + .set_inner_html(r#""#); + + assert_eq!(build_path_with_base("/posts"), "/posts"); +} diff --git a/packages/yew-router/tests/router.rs b/packages/yew-router/tests/router.rs index 3c8d246b3b5..07eb8843d28 100644 --- a/packages/yew-router/tests/router.rs +++ b/packages/yew-router/tests/router.rs @@ -82,8 +82,7 @@ fn component() -> Html { // - 404 redirects #[test] fn router_works() { - let app = App::::new(); - app.mount(yew::utils::document().get_element_by_id("output").unwrap()); + yew::start_app_in_element::(yew::utils::document().get_element_by_id("output").unwrap()); assert_eq!("Home", obtain_result_by_id("result"));