Error handling

This commit is contained in:
Jannes Vandepitte
2022-08-26 11:10:40 +02:00
parent d9d3d3de45
commit bea07ebe29
5 changed files with 53 additions and 7 deletions

View File

@@ -1,4 +1,17 @@
import { Center, Pagination, Skeleton, Table, Text, Title, Tooltip } from '@mantine/core'; import {
Alert,
Center,
Code,
Group,
Pagination,
Skeleton,
Table,
Text,
Title,
Tooltip,
} from '@mantine/core';
import { IconAlertCircle } from '@tabler/icons';
import { AxiosError } from 'axios';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import { FunctionComponent, useState } from 'react'; import { FunctionComponent, useState } from 'react';
@@ -16,7 +29,7 @@ const PAGE_SIZE = 10;
export const UsenetHistoryList: FunctionComponent<UsenetHistoryListProps> = ({ serviceId }) => { export const UsenetHistoryList: FunctionComponent<UsenetHistoryListProps> = ({ serviceId }) => {
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const { data, isLoading } = useGetUsenetHistory({ const { data, isLoading, isError, error } = useGetUsenetHistory({
limit: PAGE_SIZE, limit: PAGE_SIZE,
offset: (page - 1) * PAGE_SIZE, offset: (page - 1) * PAGE_SIZE,
serviceId, serviceId,
@@ -33,10 +46,23 @@ export const UsenetHistoryList: FunctionComponent<UsenetHistoryListProps> = ({ s
); );
} }
if (isError) {
return (
<Group position="center">
<Alert icon={<IconAlertCircle size={16} />} my="lg" title="Error!" color="red" radius="md">
Some error has occured while fetching data:
<Code mt="sm" block>
{(error as AxiosError)?.response?.data as string}
</Code>
</Alert>
</Group>
);
}
if (!data || data.items.length <= 0) { if (!data || data.items.length <= 0) {
return ( return (
<Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}> <Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<Title order={3}>Queue is empty</Title> <Title order={3}>History is empty</Title>
</Center> </Center>
); );
} }

View File

@@ -1,5 +1,8 @@
import { import {
Alert,
Center, Center,
Code,
Group,
Progress, Progress,
Skeleton, Skeleton,
Table, Table,
@@ -8,7 +11,8 @@ import {
Tooltip, Tooltip,
useMantineTheme, useMantineTheme,
} from '@mantine/core'; } from '@mantine/core';
import { IconPlayerPause, IconPlayerPlay } from '@tabler/icons'; import { IconAlertCircle, IconPlayerPause, IconPlayerPlay } from '@tabler/icons';
import { AxiosError } from 'axios';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import { FunctionComponent, useState } from 'react'; import { FunctionComponent, useState } from 'react';
@@ -26,7 +30,7 @@ const PAGE_SIZE = 10;
export const UsenetQueueList: FunctionComponent<UsenetQueueListProps> = ({ serviceId }) => { export const UsenetQueueList: FunctionComponent<UsenetQueueListProps> = ({ serviceId }) => {
const theme = useMantineTheme(); const theme = useMantineTheme();
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const { data, isLoading } = useGetUsenetDownloads({ const { data, isLoading, isError, error } = useGetUsenetDownloads({
limit: PAGE_SIZE, limit: PAGE_SIZE,
offset: (page - 1) * PAGE_SIZE, offset: (page - 1) * PAGE_SIZE,
serviceId, serviceId,
@@ -42,6 +46,19 @@ export const UsenetQueueList: FunctionComponent<UsenetQueueListProps> = ({ servi
); );
} }
if (isError) {
return (
<Group position="center">
<Alert icon={<IconAlertCircle size={16} />} my="lg" title="Error!" color="red" radius="md">
Some error has occured while fetching data:
<Code mt="sm" block>
{(error as AxiosError)?.response?.data as string}
</Code>
</Alert>
</Group>
);
}
if (!data || data.items.length <= 0) { if (!data || data.items.length <= 0) {
return ( return (
<Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}> <Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>

View File

@@ -36,6 +36,7 @@ async function Get(req: NextApiRequest, res: NextApiResponse) {
if (!service.apiKey) { if (!service.apiKey) {
throw new Error(`API Key for service "${service.name}" is missing`); throw new Error(`API Key for service "${service.name}" is missing`);
} }
const history = await new Client(service.url, service.apiKey).history(offset, limit); const history = await new Client(service.url, service.apiKey).history(offset, limit);
const items: UsenetHistoryItem[] = history.slots.map((slot) => ({ const items: UsenetHistoryItem[] = history.slots.map((slot) => ({
@@ -51,7 +52,7 @@ async function Get(req: NextApiRequest, res: NextApiResponse) {
return res.status(200).json(response); return res.status(200).json(response);
} catch (err) { } catch (err) {
return res.status(401).json(err); return res.status(500).send((err as any).message);
} }
} }

View File

@@ -63,7 +63,7 @@ async function Get(req: NextApiRequest, res: NextApiResponse) {
return res.status(200).json(response); return res.status(200).json(response);
} catch (err) { } catch (err) {
return res.status(401).json(err); return res.status(500).send((err as any).message);
} }
} }

View File

@@ -18,6 +18,7 @@ export const useGetUsenetDownloads = (params: UsenetQueueRequestParams) =>
{ {
refetchInterval: 1000, refetchInterval: 1000,
keepPreviousData: true, keepPreviousData: true,
retry: 2,
} }
); );
@@ -33,5 +34,6 @@ export const useGetUsenetHistory = (params: UsenetHistoryRequestParams) =>
{ {
refetchInterval: 1000, refetchInterval: 1000,
keepPreviousData: true, keepPreviousData: true,
retry: 2,
} }
); );