Skip to content
Snippets Groups Projects
Verified Commit cd5c35f9 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Implement error handling

parent 25bfa7ff
No related branches found
No related tags found
1 merge request!1Replace entire project structure
import {Paper} from "@material-ui/core";
export interface ErrorAlertProps {
severity: string,
error: unknown,
}
export function ErrorAlert({severity, error}: ErrorAlertProps) {
if (!error) {
return null;
}
return (
<Paper variant="outlined" color={severity}>
<strong>Error</strong>: {"" + error}
</Paper>
)
}
import {createContext, FC, FunctionComponent, PropsWithChildren, useCallback, useContext, useState} from "react";
import {createPortal} from "react-dom";
type ChildrenComponent = FunctionComponent<PropsWithChildren<{}>>;
const ErrorContext = createContext<ChildrenComponent | null>(null);
export function useErrorDisplay(): [FC, ChildrenComponent] {
const [ref, setRef] = useState<HTMLDivElement | null>(null);
const errorDisplay = useCallback(
() => (
<div ref={setRef}/>
),
[]
);
const errorRenderer: ChildrenComponent = useCallback(
({children}: PropsWithChildren<{}>) => ref && createPortal(
children,
ref
),
[ref]
);
const errorWrapper = useCallback(
({children}: PropsWithChildren<{}>) => (
<ErrorContext.Provider value={errorRenderer}>
{children}
</ErrorContext.Provider>
),
[errorRenderer]
);
return [errorDisplay, errorWrapper];
}
export const ErrorPortal: ChildrenComponent = (props: PropsWithChildren<{}>) => {
const errorRenderer = useContext(ErrorContext);
if (!errorRenderer) {
return null;
}
return errorRenderer(props);
}
import {useUploadImage} from "../api/useUploadImage";
import {ErrorPortal} from "./ErrorContext";
import {ErrorAlert} from "./ErrorAlert";
import {LinearProgress} from "@material-ui/core";
export default function UploadView() {
const {mutate: upload, error: uploadError, isLoading: uploadLoading} = useUploadImage();
const {mutate: upload, error, isLoading} = useUploadImage();
return (
<div>
<pre>Error: {JSON.stringify(uploadError, null, 2)}</pre>
<pre>Loading: {JSON.stringify(uploadLoading, null, 2)}</pre>
{isLoading && (
<LinearProgress/>
)}
<ErrorPortal>
<ErrorAlert severity="error" error={error}/>
</ErrorPortal>
<input
type="file"
disabled={isLoading}
onChange={async ({target}) => {
if (target.files) {
await upload(target.files)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment