Better error pages
This commit is contained in:
parent
fdae644eb2
commit
aa12b94a01
6 changed files with 75 additions and 11 deletions
|
@ -2,8 +2,9 @@
|
|||
|
||||
import { useState, useEffect } from 'react'
|
||||
|
||||
import NetworkError from './types/error/network';
|
||||
import ContentTypeError from './types/error/content_type';
|
||||
import NetworkError from './types/error/network';
|
||||
import StatusError from './types/error/status';
|
||||
import ImageContent from './types/image';
|
||||
import MarkdownContent from './types/markdown';
|
||||
import Terminal from './types/terminal';
|
||||
|
@ -86,6 +87,7 @@ export default function Content({ src }: { src: string}) {
|
|||
if (content == undefined) {
|
||||
const result = fetch(src)
|
||||
.then(response => {
|
||||
if (response.status < 400) {
|
||||
for (const type of recognized_types) {
|
||||
if (is_type(response, type)) {
|
||||
const emitted = type.emit();
|
||||
|
@ -97,6 +99,9 @@ export default function Content({ src }: { src: string}) {
|
|||
}
|
||||
}
|
||||
set_content(<ContentTypeError content_type={response.headers.get('Content-Type')!.split(';')[0]} />);
|
||||
} else {
|
||||
set_content(<StatusError status={response.status} />);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
set_content(<NetworkError err={err} />);
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import Error from './error'
|
||||
|
||||
export default function ContentTypeError({ content_type }: { content_type: string }) {
|
||||
return <p>{`Unrecognised MIME type: ${content_type}`}</p>
|
||||
return <Error>{`Unrecognised MIME type: ${content_type}`}</Error>
|
||||
}
|
||||
|
|
18
src/app/[...file]/components/types/error/error.css.ts
Normal file
18
src/app/[...file]/components/types/error/error.css.ts
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { style } from '@vanilla-extract/css'
|
||||
|
||||
export const error = style({
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
alignItems: 'center',
|
||||
width: '100%',
|
||||
height: 'max-content',
|
||||
});
|
||||
|
||||
export const message = style({
|
||||
fontSize: '2em',
|
||||
});
|
||||
|
||||
export const sad = style({
|
||||
margin: '0em',
|
||||
fontSize: '3em',
|
||||
})
|
13
src/app/[...file]/components/types/error/error.tsx
Normal file
13
src/app/[...file]/components/types/error/error.tsx
Normal file
|
@ -0,0 +1,13 @@
|
|||
import * as style from './error.css'
|
||||
|
||||
const faces = [
|
||||
"(•́︵•̀)",
|
||||
"(╥﹏╥)",
|
||||
]
|
||||
|
||||
export default function Error({ children }: { children }) {
|
||||
return <div className={style.error}>
|
||||
<p className={style.message}>{children}</p>
|
||||
<p className={style.sad}>{faces[Math.floor(Math.random() * faces.length)]}</p>
|
||||
</div>
|
||||
}
|
|
@ -1,3 +1,6 @@
|
|||
import Error from './error'
|
||||
|
||||
export default function NetworkError({ err }: { err: string }) {
|
||||
return <p>{`Error: ${err}`}</p>;
|
||||
console.err(err);
|
||||
return <Error>Network Error</Error>;
|
||||
}
|
||||
|
|
23
src/app/[...file]/components/types/error/status.tsx
Normal file
23
src/app/[...file]/components/types/error/status.tsx
Normal file
|
@ -0,0 +1,23 @@
|
|||
import Error from './error'
|
||||
|
||||
const statuses = {
|
||||
[400]: "Bad Request",
|
||||
[401]: "Unauthorized",
|
||||
[402]: "Payment Required",
|
||||
[403]: "Forbidden",
|
||||
[404]: "Not Found",
|
||||
[405]: "Method Not Allowed",
|
||||
[500]: "Internal Server Error",
|
||||
[501]: "Not Implemented",
|
||||
[502]: "Bad Gateway",
|
||||
[503]: "Service Unavailable",
|
||||
[504]: "Gateway Timeout",
|
||||
[505]: "HTTP Version Not Supported"
|
||||
}
|
||||
export default function StatusError({ status }: { status: number }) {
|
||||
if (status in statuses) {
|
||||
return <Error>{`${status} ${statuses[status as keyof typeof statuses]}`}</Error>
|
||||
} else {
|
||||
return <Error>{status}</Error>
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue