Fix web redirect routes (#4109)
This commit is contained in:
1 parent
d948ac23af
commit
53ef78823d
8 files changed
+131
-2
No files matched your search
Generated
+7
@@ -4349,6 +4349,13 @@ dependencies = [
|
|||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dioxus-playwright-web-routing-test"
|
||||||
|
version = "0.0.1"
|
||||||
|
dependencies = [
|
||||||
|
"dioxus",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dioxus-playwright-web-test"
|
name = "dioxus-playwright-web-test"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ members = [
|
|||||||
# Playwright tests
|
# Playwright tests
|
||||||
"packages/playwright-tests/liveview",
|
"packages/playwright-tests/liveview",
|
||||||
"packages/playwright-tests/web",
|
"packages/playwright-tests/web",
|
||||||
|
"packages/playwright-tests/web-routing",
|
||||||
"packages/playwright-tests/barebones-template",
|
"packages/playwright-tests/barebones-template",
|
||||||
"packages/playwright-tests/fullstack",
|
"packages/playwright-tests/fullstack",
|
||||||
"packages/playwright-tests/fullstack-mounted",
|
"packages/playwright-tests/fullstack-mounted",
|
||||||
|
|||||||
@@ -93,6 +93,15 @@ module.exports = defineConfig({
|
|||||||
reuseExistingServer: !process.env.CI,
|
reuseExistingServer: !process.env.CI,
|
||||||
stdout: "pipe",
|
stdout: "pipe",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
cwd: path.join(process.cwd(), "web-routing"),
|
||||||
|
command:
|
||||||
|
'cargo run --package dioxus-cli --release -- serve --force-sequential --platform web --addr "127.0.0.1" --port 2020',
|
||||||
|
port: 2020,
|
||||||
|
timeout: 50 * 60 * 1000,
|
||||||
|
reuseExistingServer: !process.env.CI,
|
||||||
|
stdout: "pipe",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
cwd: path.join(process.cwd(), "fullstack"),
|
cwd: path.join(process.cwd(), "fullstack"),
|
||||||
command:
|
command:
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
// @ts-check
|
||||||
|
const { test, expect } = require("@playwright/test");
|
||||||
|
|
||||||
|
test("redirect", async ({ page }) => {
|
||||||
|
// Going to the root url should redirect to /other.
|
||||||
|
await page.goto("http://localhost:2020");
|
||||||
|
|
||||||
|
// Expect the page to the text Other
|
||||||
|
const main = page.locator("#other");
|
||||||
|
await expect(main).toContainText("Other");
|
||||||
|
|
||||||
|
// Expect the url to be /other
|
||||||
|
await expect(page).toHaveURL("http://localhost:2020/other");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("links", async ({ page }) => {
|
||||||
|
await page.goto("http://localhost:2020/other");
|
||||||
|
|
||||||
|
// Expect clicking the link to /other/123 to navigate to /other/123
|
||||||
|
const link = page.locator("a[href='/other/123']");
|
||||||
|
await link.click();
|
||||||
|
await expect(page).toHaveURL("http://localhost:2020/other/123");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("fallback", async ({ page }) => {
|
||||||
|
await page.goto("http://localhost:2020/my/404/route");
|
||||||
|
|
||||||
|
// Expect the page to contain the text Fallback
|
||||||
|
const main = page.locator("#not-found");
|
||||||
|
await expect(main).toContainText("NotFound");
|
||||||
|
|
||||||
|
});
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
dist
|
||||||
|
target
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "dioxus-playwright-web-routing-test"
|
||||||
|
version = "0.0.1"
|
||||||
|
edition = "2021"
|
||||||
|
description = "Playwright test for Dioxus Web Routing"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
dioxus = { workspace = true, features = ["web", "router"]}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
use dioxus::prelude::*;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
launch(|| {
|
||||||
|
rsx! {
|
||||||
|
Router::<Route> {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Routable, Clone, PartialEq)]
|
||||||
|
#[rustfmt::skip]
|
||||||
|
enum Route {
|
||||||
|
#[redirect("/",|| Route::Other)]
|
||||||
|
#[route("/other")]
|
||||||
|
Other,
|
||||||
|
#[route("/other/:id")]
|
||||||
|
OtherId { id: String },
|
||||||
|
#[route("/:..segments")]
|
||||||
|
NotFound { segments: Vec<String> },
|
||||||
|
}
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
fn Other() -> Element {
|
||||||
|
rsx! {
|
||||||
|
div {
|
||||||
|
id: "other",
|
||||||
|
"Other"
|
||||||
|
}
|
||||||
|
|
||||||
|
Link {
|
||||||
|
id: "other-id-link",
|
||||||
|
to: Route::OtherId { id: "123".to_string() },
|
||||||
|
"go to OtherId"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
fn OtherId(id: String) -> Element {
|
||||||
|
rsx! {
|
||||||
|
div {
|
||||||
|
id: "other-id",
|
||||||
|
"OtherId {id}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
fn NotFound(segments: Vec<String>) -> Element {
|
||||||
|
rsx! {
|
||||||
|
div {
|
||||||
|
id: "not-found",
|
||||||
|
"NotFound {segments:?}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -141,16 +141,27 @@ impl RouterContext {
|
|||||||
site_map: R::SITE_MAP,
|
site_map: R::SITE_MAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let history = history();
|
||||||
|
|
||||||
// set the updater
|
// set the updater
|
||||||
history().updater(Arc::new(move || {
|
history.updater(Arc::new(move || {
|
||||||
for &rc in subscribers.lock().unwrap().iter() {
|
for &rc in subscribers.lock().unwrap().iter() {
|
||||||
rc.mark_dirty();
|
rc.mark_dirty();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
Self {
|
let myself = Self {
|
||||||
inner: CopyValue::new_in_scope(myself, ScopeId::ROOT),
|
inner: CopyValue::new_in_scope(myself, ScopeId::ROOT),
|
||||||
|
};
|
||||||
|
|
||||||
|
// If the current route is different from the one in the browser, replace the current route
|
||||||
|
let current_route: R = myself.current();
|
||||||
|
|
||||||
|
if current_route.to_string() != history.current_route() {
|
||||||
|
myself.replace(current_route);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myself
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the router is running in a liveview context
|
/// Check if the router is running in a liveview context
|
||||||
|
|||||||
Reference in new issue
Block a user