Skip to content

Commit ce6c283

Browse files
committed
Redirect unsupported chain routes before loader fetches
1 parent 2d749f8 commit ce6c283

File tree

6 files changed

+18
-11
lines changed

6 files changed

+18
-11
lines changed

src/data/ethereumProvider.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const networkMap = {
2121
const LONGPOLLING_PERIOD_MS = 20000;
2222

2323
const initializeContract = (chainId) => new ethers.Contract(Object.keys(networkMap[chainId].deployments)[0], ABI);
24-
const getDefaultNetwork = () => {
24+
export const getDefaultNetwork = () => {
2525
const defaultNetworkKeys = Object.keys(networkMap).filter((key) => networkMap[key].default);
2626

2727
if (defaultNetworkKeys.length !== 1)

src/index.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Account, { loader as AccountLoader } from "./routes/account";
1212
import Court, { loader as CourtLoader } from "./routes/court";
1313
import EthereumProviderErrors from "./components/others/ethereumProviderErrors";
1414

15-
import EthereumProvider, { EthereumContext, networkMap } from "./data/ethereumProvider.jsx";
15+
import EthereumProvider, { EthereumContext, getDefaultNetwork, networkMap } from "./data/ethereumProvider.jsx";
1616
import RouteRedirect from "./components/RouteRedirect";
1717
import AuthRequired from "./components/AuthRequired";
1818

@@ -55,7 +55,7 @@ const router = createBrowserRouter(
5555
function App() {
5656
const { pathname } = window.location;
5757
const pathSegment = pathname.split("/")[1];
58-
const chainId = pathSegment.startsWith("0x") && networkMap[pathSegment] ? pathSegment : undefined;
58+
const chainId = pathSegment.startsWith("0x") ? (networkMap[pathSegment] ? pathSegment : getDefaultNetwork()) : undefined;
5959
return (
6060
<EthereumProvider chainId={chainId}>
6161
<RouterProvider router={router} />

src/routes/account/index.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { useLoaderData, useParams } from "react-router-dom";
1+
import { redirect, useLoaderData, useParams } from "react-router-dom";
22
import * as styles from "./index.module.scss";
33

44
import ListArticles from "/src/components/others/listArticles";
5-
import { getArticlesByAuthor } from "/src/data/ethereumProvider";
5+
import { getArticlesByAuthor, getDefaultNetwork, networkMap } from "/src/data/ethereumProvider";
66
import populateArticleContents from "../../utils/populateArticleContents";
77

88
export async function loader({ params }) {
9+
if (!networkMap[params.chain]) return redirect(`/${getDefaultNetwork()}/account/${params.id}`);
910
const articles = await getArticlesByAuthor(params.chain, params.id);
1011
return await populateArticleContents(articles);
1112
}

src/routes/article/index.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { useState, useContext } from "react";
2-
import { useLoaderData, useRevalidator } from "react-router-dom";
2+
import { redirect, useLoaderData, useRevalidator } from "react-router-dom";
33
import Interval from "react-interval-rerender";
44
import * as styles from "./index.module.scss";
55
import { formatTime, getTimeLeft } from "/src/hooks/useCountdown";
66

7-
import { EthereumContext, getArticleByID } from "/src/data/ethereumProvider";
7+
import { EthereumContext, getArticleByID, getDefaultNetwork, networkMap } from "/src/data/ethereumProvider";
88
import { ipfsGateway } from "/src/utils/addToIPFS";
99

1010
import CustomButton from "/src/components/presentational/button";
@@ -18,6 +18,9 @@ import ArbitrationDetails from "/src/components/others/route_article/arbitration
1818
import BountyModal from "/src/components/others/bountyModal";
1919

2020
export async function loader({ params }) {
21+
const defaultChain = getDefaultNetwork();
22+
if (!networkMap[params.chain]?.deployments?.[params.contract]) return redirect(`/${defaultChain}`);
23+
2124
const article = await getArticleByID(params.chain, params.contract, params.id);
2225
let articleContent = {};
2326
try {

src/routes/browse/index.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { useContext } from "react";
2-
import { useLoaderData, useParams } from "react-router-dom";
2+
import { redirect, useLoaderData, useParams } from "react-router-dom";
33
import * as styles from "./index.module.scss";
44

55
import EthereumProviderErrors from "/src/components/others/ethereumProviderErrors";
66
import ListArticles from "/src/components/others/listArticles";
77
import SyncStatus from "/src/components/presentational/syncStatus";
88

9-
import { EthereumContext, networkMap, getAllArticles } from "/src/data/ethereumProvider";
9+
import { EthereumContext, getAllArticles, getDefaultNetwork, networkMap } from "/src/data/ethereumProvider";
1010
import populateArticleContents from "../../utils/populateArticleContents";
1111

1212
export async function loader({ params }) {
13+
if (!networkMap[params.chain]) return redirect(`/${getDefaultNetwork()}`);
1314
const articles = await getAllArticles(params.chain);
1415
return await populateArticleContents(articles);
1516
}

src/routes/court/index.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import { useLoaderData } from "react-router-dom";
1+
import { redirect, useLoaderData } from "react-router-dom";
22
import * as styles from "./index.module.scss";
33

4-
import { getCourtById } from "/src/data/ethereumProvider";
4+
import { getCourtById, getDefaultNetwork, networkMap } from "/src/data/ethereumProvider";
55
import { ipfsGateway } from "/src/utils/addToIPFS";
66

77
const PERIODS = ["Evidence", "Vote", "Appeal", "Execution"];
88

99
export async function loader({ params }) {
1010
const { chain, contract, id } = params;
11+
if (!networkMap[chain]?.deployments?.[contract]) return redirect(`/${getDefaultNetwork()}`);
12+
1113
const court = await getCourtById(chain, contract, id);
1214
court.policy = await (await fetch(ipfsGateway + court.policyURI)).json();
1315
return court;

0 commit comments

Comments
 (0)