diff --git a/apps/cyberstorm-remix/app/p/listingUtils.ts b/apps/cyberstorm-remix/app/p/listingUtils.ts
index da17906c2..c3a70a8c4 100644
--- a/apps/cyberstorm-remix/app/p/listingUtils.ts
+++ b/apps/cyberstorm-remix/app/p/listingUtils.ts
@@ -5,6 +5,7 @@ export interface ListingIdentifiers {
communityId: string;
namespaceId: string;
packageId: string;
+ packageVersion?: string;
}
/**
@@ -16,12 +17,13 @@ export async function getPublicListing(
dapper: DapperTs,
ids: ListingIdentifiers
) {
- const { communityId, namespaceId, packageId } = ids;
+ const { communityId, namespaceId, packageId, packageVersion } = ids;
try {
return await dapper.getPackageListingDetails(
communityId,
namespaceId,
- packageId
+ packageId,
+ packageVersion
);
} catch (e) {
if (isApiError(e) && e.response.status === 404) {
@@ -42,13 +44,14 @@ export async function getPrivateListing(
dapper: DapperTs,
ids: ListingIdentifiers
) {
- const { communityId, namespaceId, packageId } = ids;
+ const { communityId, namespaceId, packageId, packageVersion } = ids;
try {
return await dapper.getPackageListingDetails(
communityId,
namespaceId,
- packageId
+ packageId,
+ packageVersion
);
} catch (e) {
const is404 = isApiError(e) && e.response?.status === 404;
@@ -61,6 +64,7 @@ export async function getPrivateListing(
communityId,
namespaceId,
packageId,
+ packageVersion,
true
);
diff --git a/apps/cyberstorm-remix/app/p/packageVersion.tsx b/apps/cyberstorm-remix/app/p/packageVersion.tsx
index 2502d75cd..26fdd1bed 100644
--- a/apps/cyberstorm-remix/app/p/packageVersion.tsx
+++ b/apps/cyberstorm-remix/app/p/packageVersion.tsx
@@ -33,7 +33,6 @@ import {
type ReactElement,
Suspense,
useEffect,
- useMemo,
useRef,
useState,
} from "react";
@@ -53,68 +52,71 @@ import {
getPublicEnvVariables,
getSessionTools,
} from "cyberstorm/security/publicEnvVariables";
-import { getTeamDetails } from "@thunderstore/dapper-ts/src/methods/team";
-import { isPromise } from "cyberstorm/utils/typeChecks";
-import { getPackageVersionDetails } from "@thunderstore/dapper-ts/src/methods/packageVersion";
+import { getPrivateListing, getPublicListing } from "./listingUtils";
+import {
+ type PackageListingDetails,
+ type TeamDetails,
+} from "@thunderstore/dapper/types";
export async function loader({ params }: LoaderFunctionArgs) {
- if (
- params.communityId &&
- params.namespaceId &&
- params.packageId &&
- params.packageVersion
- ) {
- const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]);
- const dapper = new DapperTs(() => {
- return {
- apiHost: publicEnvVariables.VITE_API_URL,
- sessionId: undefined,
- };
- });
+ const { communityId, namespaceId, packageId, packageVersion } = params;
- return {
- communityId: params.communityId,
- community: await dapper.getCommunity(params.communityId),
- version: await dapper.getPackageVersionDetails(
- params.namespaceId,
- params.packageId,
- params.packageVersion
- ),
- team: await dapper.getTeamDetails(params.namespaceId),
- };
+ if (!communityId || !namespaceId || !packageId || !packageVersion) {
+ throw new Response("Package not found", { status: 404 });
}
- throw new Response("Package not found", { status: 404 });
+
+ const publicEnvVariables = getPublicEnvVariables(["VITE_API_URL"]);
+ const dapper = new DapperTs(() => ({
+ apiHost: publicEnvVariables.VITE_API_URL,
+ sessionId: undefined,
+ }));
+
+ const listing = await getPublicListing(dapper, {
+ communityId,
+ namespaceId,
+ packageId,
+ packageVersion,
+ });
+
+ return {
+ community: await dapper.getCommunity(communityId),
+ listing,
+ packageVersion,
+ team: await dapper.getTeamDetails(namespaceId),
+ };
}
export async function clientLoader({ params }: LoaderFunctionArgs) {
- if (
- params.communityId &&
- params.namespaceId &&
- params.packageId &&
- params.packageVersion
- ) {
- const tools = getSessionTools();
- const dapper = new DapperTs(() => {
- return {
- apiHost: tools?.getConfig().apiHost,
- sessionId: tools?.getConfig().sessionId,
- };
- });
+ const { communityId, namespaceId, packageId, packageVersion } = params;
- return {
- communityId: params.communityId,
- community: dapper.getCommunity(params.communityId),
- version: dapper.getPackageVersionDetails(
- params.namespaceId,
- params.packageId,
- params.packageVersion
- ),
- team: dapper.getTeamDetails(params.namespaceId),
- };
+ if (!communityId || !namespaceId || !packageId || !packageVersion) {
+ throw new Response("Package not found", { status: 404 });
}
- throw new Response("Package not found", { status: 404 });
+
+ const tools = getSessionTools();
+ const config = tools.getConfig();
+ const dapper = new DapperTs(() => ({
+ apiHost: config.apiHost,
+ sessionId: config.sessionId,
+ }));
+
+ const listing = await getPrivateListing(dapper, {
+ communityId,
+ namespaceId,
+ packageId,
+ packageVersion,
+ });
+
+ return {
+ community: dapper.getCommunity(communityId),
+ listing,
+ packageVersion,
+ team: dapper.getTeamDetails(namespaceId),
+ };
}
+clientLoader.hydrate = true;
+
export function shouldRevalidate(arg: ShouldRevalidateFunctionArgs) {
const oldPath = arg.currentUrl.pathname.split("/");
const newPath = arg.nextUrl.pathname.split("/");
@@ -131,7 +133,7 @@ export function shouldRevalidate(arg: ShouldRevalidateFunctionArgs) {
}
export default function PackageVersion() {
- const { communityId, community, version, team } = useLoaderData<
+ const { community, listing, packageVersion, team } = useLoaderData<
typeof loader | typeof clientLoader
>();
@@ -151,48 +153,38 @@ export default function PackageVersion() {
// https://react.dev/reference/react/StrictMode
// If strict mode is removed from the entry.client.tsx, this should only run once
useEffect(() => {
- if (!startsHydrated.current && isHydrated) return;
- if (isPromise(version)) {
- version.then((versionData) => {
- setFirstUploaded(
-