diff --git a/assets/js/react/App.tsx b/assets/js/react/App.tsx
index c9f6b81..c98522a 100644
--- a/assets/js/react/App.tsx
+++ b/assets/js/react/App.tsx
@@ -1,9 +1,24 @@
import * as React from "react";
+import { RouterProvider, createBrowserRouter } from "react-router-dom";
import { Footer } from "./components/Footer";
+const router = createBrowserRouter([
+ {
+ path: "/",
+ element: , // Placeholder.
+ },
+ {
+ path: "/nested",
+ element: , // Placeholder.
+ },
+]);
+
export default function App() {
return (
+
+
+
);
diff --git a/assets/node-packages.nix b/assets/node-packages.nix
index 4b9959a..399c5a5 100644
--- a/assets/node-packages.nix
+++ b/assets/node-packages.nix
@@ -4,6 +4,15 @@
let
sources = {
+ "@remix-run/router-1.13.1" = {
+ name = "_at_remix-run_slash_router";
+ packageName = "@remix-run/router";
+ version = "1.13.1";
+ src = fetchurl {
+ url = "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz";
+ sha512 = "so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==";
+ };
+ };
"clsx-2.0.0" = {
name = "clsx";
packageName = "clsx";
@@ -49,6 +58,24 @@ let
sha512 = "6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==";
};
};
+ "react-router-6.20.1" = {
+ name = "react-router";
+ packageName = "react-router";
+ version = "6.20.1";
+ src = fetchurl {
+ url = "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz";
+ sha512 = "ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==";
+ };
+ };
+ "react-router-dom-6.20.1" = {
+ name = "react-router-dom";
+ packageName = "react-router-dom";
+ version = "6.20.1";
+ src = fetchurl {
+ url = "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz";
+ sha512 = "npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==";
+ };
+ };
"scheduler-0.23.0" = {
name = "scheduler";
packageName = "scheduler";
@@ -65,11 +92,14 @@ let
version = "0.1.0";
src = ./.;
dependencies = [
+ sources."@remix-run/router-1.13.1"
sources."clsx-2.0.0"
sources."js-tokens-4.0.0"
sources."loose-envify-1.4.0"
sources."react-18.2.0"
sources."react-dom-18.2.0"
+ sources."react-router-6.20.1"
+ sources."react-router-dom-6.20.1"
sources."scheduler-0.23.0"
];
buildInputs = globalBuildInputs;
diff --git a/assets/package-lock.json b/assets/package-lock.json
index 36cdd96..a19c86a 100644
--- a/assets/package-lock.json
+++ b/assets/package-lock.json
@@ -10,11 +10,13 @@
"dependencies": {
"clsx": "^2.0.0",
"react": "^18.2.0",
- "react-dom": "^18.2.0"
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.20.1"
},
"devDependencies": {
"@types/react": "^18.2.40",
"@types/react-dom": "^18.2.17",
+ "@types/react-router-dom": "^5.3.3",
"typescript": "^5.3.2"
}
},
@@ -41,6 +43,20 @@
"node_modules/.pnpm/scheduler@0.23.0": {
"extraneous": true
},
+ "node_modules/@remix-run/router": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz",
+ "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "dev": true
+ },
"node_modules/@types/prop-types": {
"version": "15.7.11",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
@@ -67,6 +83,27 @@
"@types/react": "*"
}
},
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "dev": true,
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
"node_modules/@types/scheduler": {
"version": "0.16.8",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
@@ -126,6 +163,36 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-router": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz",
+ "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==",
+ "dependencies": {
+ "@remix-run/router": "1.13.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz",
+ "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==",
+ "dependencies": {
+ "@remix-run/router": "1.13.1",
+ "react-router": "6.20.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
"node_modules/scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
@@ -149,6 +216,17 @@
}
},
"dependencies": {
+ "@remix-run/router": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.13.1.tgz",
+ "integrity": "sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q=="
+ },
+ "@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "dev": true
+ },
"@types/prop-types": {
"version": "15.7.11",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
@@ -175,6 +253,27 @@
"@types/react": "*"
}
},
+ "@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "dev": true,
+ "requires": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "dev": true,
+ "requires": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
"@types/scheduler": {
"version": "0.16.8",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
@@ -222,6 +321,23 @@
"scheduler": "^0.23.0"
}
},
+ "react-router": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.20.1.tgz",
+ "integrity": "sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==",
+ "requires": {
+ "@remix-run/router": "1.13.1"
+ }
+ },
+ "react-router-dom": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.20.1.tgz",
+ "integrity": "sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==",
+ "requires": {
+ "@remix-run/router": "1.13.1",
+ "react-router": "6.20.1"
+ }
+ },
"scheduler": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
diff --git a/assets/package.json b/assets/package.json
index e3535c6..4cbd217 100644
--- a/assets/package.json
+++ b/assets/package.json
@@ -4,11 +4,13 @@
"dependencies": {
"clsx": "^2.0.0",
"react": "^18.2.0",
- "react-dom": "^18.2.0"
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.20.1"
},
"devDependencies": {
"@types/react": "^18.2.40",
"@types/react-dom": "^18.2.17",
+ "@types/react-router-dom": "^5.3.3",
"typescript": "^5.3.2"
},
"private": true
diff --git a/lib/boardwise_web/router.ex b/lib/boardwise_web/router.ex
index 3932d37..5eac47b 100644
--- a/lib/boardwise_web/router.ex
+++ b/lib/boardwise_web/router.ex
@@ -17,7 +17,7 @@ defmodule BoardWiseWeb.Router do
scope "/", BoardWiseWeb do
pipe_through :browser
- get "/", ReactController, :index
+ get "/*path", ReactController, :index
end
# Other scopes may use custom stacks.