From 95fe1460908b8fcbf5ee52db0a9b90ec67962c6b Mon Sep 17 00:00:00 2001 From: Arnaud Date: Tue, 24 Sep 2024 12:35:50 +0200 Subject: [PATCH] Better error management --- .../Availability/AvailabilityCreate.tsx | 9 +++- .../Availability/AvailabilityError.tsx | 16 ------- .../Availability/AvailabilityReservations.tsx | 48 ++++++++++++------- .../Availailibities/Availabilities.tsx | 22 +++++---- .../ErrorPlaceholder/ErrorPlaceholder.tsx | 25 ++++++++++ src/routes/dashboard/availabilities.tsx | 11 ++++- 6 files changed, 85 insertions(+), 46 deletions(-) delete mode 100644 src/components/Availability/AvailabilityError.tsx create mode 100644 src/components/ErrorPlaceholder/ErrorPlaceholder.tsx diff --git a/src/components/Availability/AvailabilityCreate.tsx b/src/components/Availability/AvailabilityCreate.tsx index 6b18605..56494a3 100644 --- a/src/components/Availability/AvailabilityCreate.tsx +++ b/src/components/Availability/AvailabilityCreate.tsx @@ -14,7 +14,7 @@ import { UIAvailability } from "./types"; import { STEPPER_DURATION } from "../../utils/constants"; import { useAvailabilityMutation } from "./useAvailabilityMutation"; import { AvailabilitySuccess } from "./AvailabilitySuccess"; -import { AvailabilityError } from "./AvailabilityError"; +import { ErrorPlaceholder } from "../ErrorPlaceholder/ErrorPlaceholder"; type Props = { space: CodexNodeSpace; @@ -39,7 +39,12 @@ export function AvailabilityCreate({ space }: Props) { AvailabilityForm, AvailabilityConfirm, error - ? () => + ? () => ( + + ) : AvailabilitySuccess, ]; diff --git a/src/components/Availability/AvailabilityError.tsx b/src/components/Availability/AvailabilityError.tsx deleted file mode 100644 index dd36185..0000000 --- a/src/components/Availability/AvailabilityError.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Placeholder } from "@codex-storage/marketplace-ui-components"; -import { ErrorIcon } from "../ErrorIcon/ErrorIcon"; - -type Props = { - error: Error; -}; - -export function AvailabilityError({ error }: Props) { - return ( - } - title="Error" - subtitle={"Got an error when trying to create the availability."} - message={error.message}> - ); -} diff --git a/src/components/Availability/AvailabilityReservations.tsx b/src/components/Availability/AvailabilityReservations.tsx index 1ec2753..29757d1 100644 --- a/src/components/Availability/AvailabilityReservations.tsx +++ b/src/components/Availability/AvailabilityReservations.tsx @@ -2,8 +2,10 @@ import { Backdrop, Button, EmptyPlaceholder, + Modal, Placeholder, SpaceAllocation, + Spinner, } from "@codex-storage/marketplace-ui-components"; import { classnames } from "../../utils/classnames"; import "./AvailabilityReservations.css"; @@ -13,6 +15,7 @@ import { Promises } from "../../utils/promises"; import { CodexAvailability } from "@codex-storage/sdk-js"; import { useEffect } from "react"; import { ErrorIcon } from "../ErrorIcon/ErrorIcon"; +import { ErrorPlaceholder } from "../ErrorPlaceholder/ErrorPlaceholder"; type Props = { availability: CodexAvailability; @@ -28,28 +31,41 @@ export function AvailabilityReservations({ const queryClient = useQueryClient(); useEffect(() => { - queryClient.invalidateQueries({ queryKey: ["reservations"] }); + if (availability) { + queryClient.invalidateQueries({ queryKey: ["reservations"] }); + } }, [availability]); - const { data = [], error } = useQuery({ - queryFn: async () => { - const s = await CodexSdk.marketplace.reservations(availability.id); - return await Promises.rejectOnError(s); + const { + data = [], + isPending, + error, + } = useQuery({ + queryFn: () => { + return CodexSdk.marketplace + .reservations(availability?.id) + .then((s) => Promises.rejectOnError(s)); }, queryKey: ["reservations"], + retry: 0, + staleTime: 0, }); + if (isPending) { + return ( + + + + ); + } + if (error) { return ( - <> - - - } - title="Error" + + - + error={error}> + ); } @@ -68,9 +84,7 @@ export function AvailabilityReservations({ const isEmpty = !!data.length; return ( - <> - - +
Availability reservations @@ -87,6 +101,6 @@ export function AvailabilityReservations({
- +
); } diff --git a/src/components/Availailibities/Availabilities.tsx b/src/components/Availailibities/Availabilities.tsx index e296895..2846638 100644 --- a/src/components/Availailibities/Availabilities.tsx +++ b/src/components/Availailibities/Availabilities.tsx @@ -1,4 +1,5 @@ import { + Placeholder, SpaceAllocation, Spinner, } from "@codex-storage/marketplace-ui-components"; @@ -13,10 +14,19 @@ import { AvailabilitiesTable } from "../Availability/AvailabilitiesTable"; import { AvailabilityReservations } from "../Availability/AvailabilityReservations"; import "./Availabilities.css"; +const defaultSpace = { + quotaMaxBytes: 0, + quotaReservedBytes: 0, + quotaUsedBytes: 0, + totalBlocks: 0, +}; + export function Availabilities() { { const [availabilitySelected, setAvailabilitySelected] = useState(null); + + // Error will be catched in ErrorBounday const { data: availabilities = [], isPending } = useQuery({ queryFn: () => CodexSdk.marketplace @@ -29,16 +39,8 @@ export function Availabilities() { throwOnError: true, }); - const { - data: space = { - quotaMaxBytes: 0, - quotaReservedBytes: 0, - quotaUsedBytes: 0, - totalBlocks: 0, - }, - isError, - error, - } = useQuery({ + // Error will be catched in ErrorBounday + const { data: space = defaultSpace } = useQuery({ queryFn: () => CodexSdk.data.space().then((s) => Promises.rejectOnError(s)), queryKey: ["space"], diff --git a/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx b/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx new file mode 100644 index 0000000..e7d28bb --- /dev/null +++ b/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx @@ -0,0 +1,25 @@ +import { Placeholder } from "@codex-storage/marketplace-ui-components"; +import { ErrorIcon } from "../ErrorIcon/ErrorIcon"; + +type Props = { + subtitle?: string; + error: unknown; +}; + +export function ErrorPlaceholder({ subtitle, error }: Props) { + const message = + error instanceof Object && error.hasOwnProperty("message") + ? // @ts-ignore + error.message + : `${error}`; + + console.info(message, error); + + return ( + } + title="Error" + subtitle={subtitle} + message={message}> + ); +} diff --git a/src/routes/dashboard/availabilities.tsx b/src/routes/dashboard/availabilities.tsx index e0492b4..368b6d8 100644 --- a/src/routes/dashboard/availabilities.tsx +++ b/src/routes/dashboard/availabilities.tsx @@ -1,6 +1,15 @@ import { createFileRoute } from "@tanstack/react-router"; import { Availabilities } from "../../components/Availailibities/Availabilities"; +import { ErrorBoundary } from "@sentry/react"; +import { ErrorPlaceholder } from "../../components/ErrorPlaceholder/ErrorPlaceholder"; export const Route = createFileRoute("/dashboard/availabilities")({ - component: Availabilities, + component: () => ( + ( + + )}> + + + ), });