1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00

89 lines
2.3 KiB
JavaScript
Raw Normal View History

2020-10-07 09:41:58 -07:00
import React from 'react';
import dynamic from 'next/dynamic';
import { useRouter } from 'next/router';
2020-01-19 22:06:16 -07:00
import {
2020-05-02 16:09:03 -07:00
Button,
CSSReset,
Flex,
Heading,
Text,
ThemeProvider,
useColorMode,
2020-10-07 09:41:58 -07:00
theme as defaultTheme,
} from '@chakra-ui/core';
import { inRange } from 'lodash';
2020-01-19 22:06:16 -07:00
const ColorModeProvider = dynamic(
2020-10-07 09:41:58 -07:00
() => import('@chakra-ui/core').then(mod => mod.ColorModeProvider),
{ ssr: false },
2020-01-19 22:06:16 -07:00
);
const ErrorContent = ({ msg, statusCode }) => {
2020-05-02 16:09:03 -07:00
const { colorMode } = useColorMode();
2020-10-07 09:41:58 -07:00
const bg = { light: 'white', dark: 'black' };
const baseCode = inRange(statusCode, 400, 500) ? 400 : inRange(statusCode, 500, 600) ? 500 : 400;
2020-05-02 16:09:03 -07:00
const errorColor = {
2020-10-07 09:41:58 -07:00
400: { light: 'error.500', dark: 'error.300' },
500: { light: 'danger.500', dark: 'danger.300' },
2020-05-02 16:09:03 -07:00
};
const variantColor = {
2020-10-07 09:41:58 -07:00
400: 'error',
500: 'danger',
2020-05-02 16:09:03 -07:00
};
2020-10-07 09:41:58 -07:00
const color = { light: 'black', dark: 'white' };
2020-05-02 16:09:03 -07:00
const { push } = useRouter();
2020-10-07 09:41:58 -07:00
const handleClick = () => push('/');
2020-05-02 16:09:03 -07:00
return (
<Flex
w="100%"
minHeight="100vh"
bg={bg[colorMode]}
flexDirection="column"
2020-10-07 09:41:58 -07:00
color={color[colorMode]}>
2020-05-02 16:09:03 -07:00
<Flex
px={2}
py={0}
w="100%"
as="main"
flexGrow={1}
flexShrink={1}
flexBasis="auto"
textAlign="center"
alignItems="center"
flexDirection="column"
justifyContent="start"
2020-10-07 09:41:58 -07:00
mt={['50%', '50%', '50%', '25%']}>
2020-05-02 16:09:03 -07:00
<Heading mb={4} as="h1" fontSize="2xl">
<Text as="span" color={errorColor[baseCode][colorMode]}>
{msg}
</Text>
{statusCode === 404 && <Text as="span"> isn't a thing...</Text>}
</Heading>
2020-01-19 22:06:16 -07:00
2020-10-07 09:41:58 -07:00
<Button variant="outline" onClick={handleClick} variantColor={variantColor[baseCode]}>
2020-05-02 16:09:03 -07:00
Home
</Button>
</Flex>
</Flex>
);
2020-01-19 22:06:16 -07:00
};
const ErrorPage = ({ msg, statusCode }) => {
2020-05-02 16:09:03 -07:00
return (
<ThemeProvider theme={defaultTheme}>
<ColorModeProvider>
<CSSReset />
<ErrorContent msg={msg} statusCode={statusCode} />
</ColorModeProvider>
</ThemeProvider>
);
2020-01-19 22:06:16 -07:00
};
ErrorPage.getInitialProps = ({ res, err }) => {
2020-05-02 16:09:03 -07:00
const statusCode = res ? res.statusCode : err ? err.statusCode : 404;
2020-10-07 09:41:58 -07:00
const msg = err ? err.message : res.req?.url || 'Error';
2020-05-02 16:09:03 -07:00
return { msg, statusCode };
2020-01-19 22:06:16 -07:00
};
export default ErrorPage;