Skip to content

Commit e116f43

Browse files
committed
Enhance error handling in all package versions routes
1 parent de2572f commit e116f43

File tree

3 files changed

+160
-134
lines changed

3 files changed

+160
-134
lines changed

apps/cyberstorm-remix/app/p/tabs/Versions/PackageVersionVersions.tsx

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import {
2-
getPublicEnvVariables,
3-
getSessionTools,
4-
} from "cyberstorm/security/publicEnvVariables";
2+
NimbusAwaitErrorElement,
3+
NimbusDefaultRouteErrorBoundary,
4+
} from "cyberstorm/utils/errors/NimbusErrorBoundary";
5+
import { handleLoaderError } from "cyberstorm/utils/errors/handleLoaderError";
6+
import { throwUserFacingPayloadResponse } from "cyberstorm/utils/errors/userFacingErrorResponse";
7+
import { getLoaderTools } from "cyberstorm/utils/getLoaderTools";
58
import { rowSemverCompare } from "cyberstorm/utils/semverCompare";
69
import { Suspense } from "react";
710
import { Await, type LoaderFunctionArgs } from "react-router";
@@ -14,69 +17,69 @@ import {
1417
NewTableSort,
1518
SkeletonBox,
1619
} from "@thunderstore/cyberstorm";
17-
import { DapperTs } from "@thunderstore/dapper-ts";
1820

19-
import { columns } from "./Versions";
21+
import { columns, packageVersionsErrorMappings } from "./Versions";
2022
import "./Versions.css";
2123
import { DownloadLink, InstallLink, ModManagerBanner } from "./common";
2224

2325
export async function loader({ params }: LoaderFunctionArgs) {
2426
if (params.communityId && params.namespaceId && params.packageId) {
25-
const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]);
26-
const dapper = new DapperTs(() => {
27+
const { dapper } = getLoaderTools();
28+
try {
29+
const versions = await dapper.getPackageVersions(
30+
params.namespaceId,
31+
params.packageId
32+
);
33+
2734
return {
28-
apiHost: publicEnvVariables.VITE_API_URL,
29-
sessionId: undefined,
35+
communityId: params.communityId,
36+
namespaceId: params.namespaceId,
37+
packageId: params.packageId,
38+
versions,
3039
};
31-
});
32-
return {
33-
communityId: params.communityId,
34-
namespaceId: params.namespaceId,
35-
packageId: params.packageId,
36-
versions: dapper.getPackageVersions(params.namespaceId, params.packageId),
37-
};
40+
} catch (error) {
41+
handleLoaderError(error, { mappings: packageVersionsErrorMappings });
42+
}
3843
}
39-
return {
40-
status: "error",
41-
message: "Failed to load versions",
42-
versions: [],
43-
};
44+
throwUserFacingPayloadResponse({
45+
headline: "Package not found.",
46+
description: "We could not find the requested package.",
47+
category: "not_found",
48+
status: 404,
49+
});
4450
}
4551

46-
export async function clientLoader({ params }: LoaderFunctionArgs) {
52+
export function clientLoader({ params }: LoaderFunctionArgs) {
4753
if (params.communityId && params.namespaceId && params.packageId) {
48-
const tools = getSessionTools();
49-
const dapper = new DapperTs(() => {
50-
return {
51-
apiHost: tools?.getConfig().apiHost,
52-
sessionId: tools?.getConfig().sessionId,
53-
};
54-
});
54+
const { dapper } = getLoaderTools();
55+
const versions = dapper.getPackageVersions(
56+
params.namespaceId,
57+
params.packageId
58+
);
59+
5560
return {
5661
communityId: params.communityId,
5762
namespaceId: params.namespaceId,
5863
packageId: params.packageId,
59-
versions: dapper.getPackageVersions(params.namespaceId, params.packageId),
64+
versions,
6065
};
6166
}
62-
return {
63-
status: "error",
64-
message: "Failed to load versions",
65-
versions: [],
66-
};
67+
throwUserFacingPayloadResponse({
68+
headline: "Package not found.",
69+
description: "We could not find the requested package.",
70+
category: "not_found",
71+
status: 404,
72+
});
6773
}
6874

6975
export default function Versions() {
70-
const { communityId, namespaceId, packageId, status, message, versions } =
71-
useLoaderData<typeof loader | typeof clientLoader>();
72-
73-
if (status === "error") {
74-
return <div>{message}</div>;
75-
}
76+
const { communityId, namespaceId, packageId, versions } = useLoaderData<
77+
typeof loader | typeof clientLoader
78+
>();
7679

7780
return (
7881
<Suspense fallback={<SkeletonBox className="package-versions__skeleton" />}>
79-
<Await resolve={versions}>
82+
<Await resolve={versions} errorElement={<NimbusAwaitErrorElement />}>
8083
{(resolvedValue) => (
8184
<div className="package-versions">
8285
<ModManagerBanner />
@@ -134,3 +137,7 @@ export default function Versions() {
134137
</Suspense>
135138
);
136139
}
140+
141+
export function ErrorBoundary() {
142+
return <NimbusDefaultRouteErrorBoundary />;
143+
}

apps/cyberstorm-remix/app/p/tabs/Versions/PackageVersionWithoutCommunityVersions.tsx

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import {
2-
getPublicEnvVariables,
3-
getSessionTools,
4-
} from "cyberstorm/security/publicEnvVariables";
2+
NimbusAwaitErrorElement,
3+
NimbusDefaultRouteErrorBoundary,
4+
} from "cyberstorm/utils/errors/NimbusErrorBoundary";
5+
import { handleLoaderError } from "cyberstorm/utils/errors/handleLoaderError";
6+
import { throwUserFacingPayloadResponse } from "cyberstorm/utils/errors/userFacingErrorResponse";
7+
import { getLoaderTools } from "cyberstorm/utils/getLoaderTools";
58
import { rowSemverCompare } from "cyberstorm/utils/semverCompare";
69
import { Suspense } from "react";
710
import { Await, type LoaderFunctionArgs } from "react-router";
@@ -14,68 +17,67 @@ import {
1417
NewTableSort,
1518
SkeletonBox,
1619
} from "@thunderstore/cyberstorm";
17-
import { DapperTs } from "@thunderstore/dapper-ts";
1820

19-
import { columns } from "./Versions";
21+
import { columns, packageVersionsErrorMappings } from "./Versions";
2022
import "./Versions.css";
2123
import { DownloadLink, InstallLink, ModManagerBanner } from "./common";
2224

2325
export async function loader({ params }: LoaderFunctionArgs) {
2426
if (params.namespaceId && params.packageId) {
25-
const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]);
26-
const dapper = new DapperTs(() => {
27+
const { dapper } = getLoaderTools();
28+
try {
29+
const versions = await dapper.getPackageVersions(
30+
params.namespaceId,
31+
params.packageId
32+
);
33+
2734
return {
28-
apiHost: publicEnvVariables.VITE_API_URL,
29-
sessionId: undefined,
35+
namespaceId: params.namespaceId,
36+
packageId: params.packageId,
37+
versions,
3038
};
31-
});
32-
return {
33-
namespaceId: params.namespaceId,
34-
packageId: params.packageId,
35-
versions: dapper.getPackageVersions(params.namespaceId, params.packageId),
36-
};
39+
} catch (error) {
40+
handleLoaderError(error, { mappings: packageVersionsErrorMappings });
41+
}
3742
}
38-
return {
39-
status: "error",
40-
message: "Failed to load versions",
41-
versions: [],
42-
};
43+
throwUserFacingPayloadResponse({
44+
headline: "Package not found.",
45+
description: "We could not find the requested package.",
46+
category: "not_found",
47+
status: 404,
48+
});
4349
}
4450

45-
export async function clientLoader({ params }: LoaderFunctionArgs) {
51+
export function clientLoader({ params }: LoaderFunctionArgs) {
4652
if (params.namespaceId && params.packageId) {
47-
const tools = getSessionTools();
48-
const dapper = new DapperTs(() => {
49-
return {
50-
apiHost: tools?.getConfig().apiHost,
51-
sessionId: tools?.getConfig().sessionId,
52-
};
53-
});
53+
const { dapper } = getLoaderTools();
54+
const versions = dapper.getPackageVersions(
55+
params.namespaceId,
56+
params.packageId
57+
);
58+
5459
return {
5560
namespaceId: params.namespaceId,
5661
packageId: params.packageId,
57-
versions: dapper.getPackageVersions(params.namespaceId, params.packageId),
62+
versions,
5863
};
5964
}
60-
return {
61-
status: "error",
62-
message: "Failed to load versions",
63-
versions: [],
64-
};
65+
throwUserFacingPayloadResponse({
66+
headline: "Package not found.",
67+
description: "We could not find the requested package.",
68+
category: "not_found",
69+
status: 404,
70+
});
6571
}
6672

6773
export default function Versions() {
68-
const { namespaceId, packageId, status, message, versions } = useLoaderData<
74+
const { namespaceId, packageId, versions } = useLoaderData<
6975
typeof loader | typeof clientLoader
7076
>();
7177

72-
if (status === "error") {
73-
return <div>{message}</div>;
74-
}
75-
7678
return (
7779
<Suspense fallback={<SkeletonBox className="package-versions__skeleton" />}>
78-
<Await resolve={versions}>
80+
<Await resolve={versions} errorElement={<NimbusAwaitErrorElement />}>
7981
{(resolvedValue) => (
8082
<div className="package-versions">
8183
<ModManagerBanner />
@@ -132,3 +134,7 @@ export default function Versions() {
132134
</Suspense>
133135
);
134136
}
137+
138+
export function ErrorBoundary() {
139+
return <NimbusDefaultRouteErrorBoundary />;
140+
}

0 commit comments

Comments
 (0)