11import {
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" ;
58import { rowSemverCompare } from "cyberstorm/utils/semverCompare" ;
69import { Suspense } from "react" ;
710import { 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" ;
2022import "./Versions.css" ;
2123import { DownloadLink , InstallLink , ModManagerBanner } from "./common" ;
2224
2325export 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
6975export 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+ }
0 commit comments