error boundary
This commit is contained in:
parent
bae7e17444
commit
c70b0e7236
21
src/components/error-boundary.tsx
Normal file
21
src/components/error-boundary.tsx
Normal file
@ -0,0 +1,21 @@
|
||||
import React from 'react'
|
||||
|
||||
export class ErrorBoundary extends React.Component {
|
||||
state = {
|
||||
error: false
|
||||
}
|
||||
|
||||
static getDerivedStateFromError() {
|
||||
return {
|
||||
error: true
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
if (this.state.error) {
|
||||
return <h1>Something went wrong.</h1>
|
||||
}
|
||||
|
||||
return this.props.children
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
import React from "react";
|
||||
|
||||
import data from '../__stubs__/landing-data.json'
|
||||
import data from "../__stubs__/landing-data.json";
|
||||
import { NavPanel } from "../components/nav-panel";
|
||||
import logo from "../assets/logo_1x.png";
|
||||
import cucumber from "../assets/cucumber.png";
|
||||
@ -21,30 +21,32 @@ import {
|
||||
PageFooter,
|
||||
PageHeader,
|
||||
} from "./style";
|
||||
import { ErrorBoundary } from "../components/error-boundary";
|
||||
|
||||
export const LandingPage = () => {
|
||||
return (
|
||||
<>
|
||||
<PageHeader>
|
||||
<Logo
|
||||
height="44px"
|
||||
width="227"
|
||||
src={logo4x}
|
||||
alt="Логотип. Надпись Рик и Морти"
|
||||
srcSet={`
|
||||
<ErrorBoundary>
|
||||
<PageHeader>
|
||||
<Logo
|
||||
height="44px"
|
||||
width="227"
|
||||
src={logo4x}
|
||||
alt="Логотип. Надпись Рик и Морти"
|
||||
srcSet={`
|
||||
${logo} 220w,
|
||||
${logo2x} 445w,
|
||||
${logo4x} 880w,
|
||||
`}
|
||||
sizes="
|
||||
sizes="
|
||||
(max-width: 240px) 100px,
|
||||
(min-width: 320px) 440px,
|
||||
(min-width: 520px) 880px
|
||||
"
|
||||
/>
|
||||
<NavPanel currentNavElement={'Home'} />
|
||||
</PageHeader>
|
||||
|
||||
/>
|
||||
<NavPanel currentNavElement={"Home"} />
|
||||
</PageHeader>
|
||||
</ErrorBoundary>
|
||||
<Main>
|
||||
<MainCardWrapper as="header">
|
||||
<MainCardText>
|
||||
@ -64,21 +66,24 @@ export const LandingPage = () => {
|
||||
</MainCardText>
|
||||
<MainCardImg src={cucumber} alt="" />
|
||||
</MainCardWrapper>
|
||||
{data.map((item, index) => (
|
||||
<Card
|
||||
directionReverse={index % 2 === 0}
|
||||
key={item.id}
|
||||
title={item.title}
|
||||
image={item.image}
|
||||
link={item.link}
|
||||
subTitle={item.subTitle}
|
||||
>
|
||||
{item.body}
|
||||
</Card>
|
||||
))}
|
||||
<ErrorBoundary><Cards /></ErrorBoundary>
|
||||
</Main>
|
||||
|
||||
<PageFooter></PageFooter>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const Cards = () =>
|
||||
data.map((item, index) => (
|
||||
<Card
|
||||
directionReverse={index % 2 === 0}
|
||||
key={item.id}
|
||||
title={item.title}
|
||||
image={item.image}
|
||||
link={item.link}
|
||||
subTitle={item.subTitle}
|
||||
>
|
||||
{item.body}
|
||||
</Card>
|
||||
));
|
||||
|
@ -6,6 +6,9 @@ import logo from "../assets/logo_1x.png";
|
||||
import logo2x from "../assets/logo_2x.png";
|
||||
import logo4x from "../assets/logo_4x.png";
|
||||
import { NavPanel } from "../components/nav-panel";
|
||||
import { Header1 } from "../components/common";
|
||||
import { InputField } from "../components/field/field";
|
||||
import { URLs } from "../__data__/urls";
|
||||
|
||||
import {
|
||||
BrandText,
|
||||
@ -19,9 +22,6 @@ import {
|
||||
SearchButton,
|
||||
SearchForm,
|
||||
} from "./style";
|
||||
import { Header1 } from "../components/common";
|
||||
import { InputField } from "../components/field/field";
|
||||
import { URLs } from "../__data__/urls";
|
||||
|
||||
export const SearchCharacterPage = () => {
|
||||
return (
|
||||
|
@ -1,16 +1,21 @@
|
||||
import React from 'react';
|
||||
import { Routes, Route } from'react-router-dom';
|
||||
import React from "react";
|
||||
import { Routes, Route } from "react-router-dom";
|
||||
|
||||
import { URLs } from './__data__/urls';
|
||||
import { LandingPage } from './pages/landing';
|
||||
import { SearchCharacterPage } from './pages/search-character';
|
||||
import { URLs } from "./__data__/urls";
|
||||
import { LandingPage } from "./pages/landing";
|
||||
import { SearchCharacterPage } from "./pages/search-character";
|
||||
import { ErrorBoundary } from "./components/error-boundary";
|
||||
|
||||
export const PageRoutes = () => (
|
||||
<Routes>
|
||||
<Route path={URLs.ui.charDetail.url} element={<LandingPage />} />
|
||||
<Route path={URLs.baseUrl} element={<LandingPage />} />
|
||||
{URLs.ui.search && <Route path={URLs.ui.search} element={<SearchCharacterPage />} />}
|
||||
<ErrorBoundary>
|
||||
<Routes>
|
||||
<Route path={URLs.ui.charDetail.url} element={<LandingPage />} />
|
||||
<Route path={URLs.baseUrl} element={<LandingPage />} />
|
||||
{URLs.ui.search && (
|
||||
<Route path={URLs.ui.search} element={<SearchCharacterPage />} />
|
||||
)}
|
||||
|
||||
<Route path="*" element={<h1>Page not found</h1>} />
|
||||
</Routes>
|
||||
)
|
||||
<Route path="*" element={<h1>Page not found</h1>} />
|
||||
</Routes>
|
||||
</ErrorBoundary>
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user