diff --git a/package-lock.json b/package-lock.json
index d7006db..d43f821 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -25,6 +25,7 @@
"formik": "^2.4.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
+ "react-error-boundary": "^5.0.0",
"react-redux": "^9.2.0",
"react-router": "^6.30.0",
"react-router-dom": "^6.30.0",
@@ -17902,6 +17903,18 @@
"react": "^18.3.1"
}
},
+ "node_modules/react-error-boundary": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-5.0.0.tgz",
+ "integrity": "sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1"
+ }
+ },
"node_modules/react-error-overlay": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz",
diff --git a/package.json b/package.json
index 5b7c08f..f19fe94 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"formik": "^2.4.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
+ "react-error-boundary": "^5.0.0",
"react-redux": "^9.2.0",
"react-router": "^6.30.0",
"react-router-dom": "^6.30.0",
diff --git a/src/App.tsx b/src/App.tsx
index ac4466e..8458eaa 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,22 +1,13 @@
-import { Container, CssBaseline } from "@mui/material";
+import { CssBaseline } from "@mui/material";
import { Provider } from "react-redux";
-import { BrowserRouter } from "react-router-dom";
-import NavigationBar from "./components/NavigationBar";
-import LazyRoutes from "./LazyRoutes";
import { reduxStore } from "./store/configureStore";
+import EagerRoutes from "./EagerRoutes";
function App() {
return (
-
- <>
-
-
-
-
- >
-
+
);
diff --git a/src/EagerRoutes.tsx b/src/EagerRoutes.tsx
index 2c1272d..331dcc2 100644
--- a/src/EagerRoutes.tsx
+++ b/src/EagerRoutes.tsx
@@ -1,16 +1,32 @@
-import { Route, Routes } from "react-router-dom";
+import { createBrowserRouter, createRoutesFromElements, Route, RouterProvider } from "react-router-dom";
import HeroesPage from "./pages/HeroesPage";
+// import HeroesPage, { loader as heroesLoader } from "./pages/HeroesPage";
import HomePage from "./pages/HomePage";
import VillainsPage from "./pages/VillainsPage";
+import { reduxStore } from "./store/configureStore";
+import Root from "./pages/root";
+import { Suspense } from "react";
-const EagerRoutes = () => {
- return (
-
- } />
- } />
+
+
+const routes = createBrowserRouter(
+ createRoutesFromElements(
+ } >
+ } />
+ }
+ // loader={() => {
+ // return heroesLoader(reduxStore.dispatch);
+ // }}
+ />
} />
-
- );
-};
+
+ )
+)
-export default EagerRoutes;
+export default function EagerRoutes() {
+ return (
+ Fallback component from the root suspense}>
+
+
+ );
+}
diff --git a/src/pages/HeroesPage.tsx b/src/pages/HeroesPage.tsx
index ecf1994..e07bfa5 100644
--- a/src/pages/HeroesPage.tsx
+++ b/src/pages/HeroesPage.tsx
@@ -15,11 +15,16 @@ import {
removeHeroFromStore,
triggerLoading,
} from "../features/heroes/heroSlice";
-import { useAppDispatch, useAppSelector } from "../store/configureStore";
+import { AppDispatch, useAppDispatch, useAppSelector } from "../store/configureStore";
import { deleteAxios, getAxios } from "../axios/generic-api-calls";
import { HeroModel } from "../features/heroes/heroTypes";
import { EndPoints } from "../axios/api-config";
+// export async function loader(dispatch: AppDispatch) {
+// return dispatch(getHeroesAction());
+// }
+
+
const HeroesPage = () => {
const dispatch = useAppDispatch();
const { heroes, loading } = useAppSelector((state) => state.hero);
@@ -31,8 +36,8 @@ const HeroesPage = () => {
const [counter, setCounter] = useState("0");
useEffect(() => {
- dispatch(getHeroesAction());
- // handleGetHeroes();
+ // dispatch(getHeroesAction());
+ handleGetHeroes();
// handleFetchHeroes();
}, [dispatch]);
diff --git a/src/pages/root.tsx b/src/pages/root.tsx
new file mode 100644
index 0000000..e33a3d2
--- /dev/null
+++ b/src/pages/root.tsx
@@ -0,0 +1,21 @@
+import React from 'react';
+import { ErrorBoundary } from 'react-error-boundary';
+
+import { Outlet } from 'react-router';
+import NavigationBar from '../components/NavigationBar';
+import { Container } from '@mui/material';
+
+export default function Root() {
+ return (
+ <>
+
+
+
Something went wrong
}>
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/store/configureStore.ts b/src/store/configureStore.ts
index d5eaf8b..6c0ce60 100644
--- a/src/store/configureStore.ts
+++ b/src/store/configureStore.ts
@@ -5,7 +5,7 @@ import { heroSlice } from "../features/heroes/heroSlice";
import { villainSlice } from "../features/villains/query";
const reduxStore = configureStore({
- preloadedState: load(),
+ // preloadedState: load(),
reducer: {
// rtk
@@ -18,7 +18,7 @@ const reduxStore = configureStore({
getDefaultMiddleware({
serializableCheck: false,
})
- .concat(save({ ignoreStates: ["villain"] }))
+ // .concat(save({ ignoreStates: ["villain"] }))
.concat(villainSlice.middleware), // for query caching
devTools: