Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions src/app/catalog/[repoName]/[serverName]/[version]/actions.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,27 @@
"use server";

import { getRegistries } from "@/app/catalog/actions";
import { getAuthenticatedClient } from "@/lib/api-client";

export async function getServerDetails(serverName: string, version: string) {
export async function getServerDetails(
registryName: string | undefined,
serverName: string,
version: string,
) {
const api = await getAuthenticatedClient();

const registriesResult = await api.getV1Registries({ client: api.client });
const registryName = registriesResult.data?.registries?.[0]?.name;
const resolvedRegistry = registryName || (await getRegistries()).at(0)?.name;

if (!registryName) {
if (!resolvedRegistry) {
return {
error: new Error("No registry available"),
data: null,
response: null,
};
}

const { error, data, response } =
await api.getRegistryByRegistryNameV01ServersByServerNameVersionsByVersion({
path: {
registryName,
serverName,
version,
},
client: api.client,
});

return { error, data, response };
return api.getRegistryByRegistryNameV01ServersByServerNameVersionsByVersion({
path: { registryName: resolvedRegistry, serverName, version },
client: api.client,
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Button } from "@/components/ui/button";

export default function NotFound() {
return (
<div className="flex flex-col gap-5 px-8 pt-5 pb-8">
<div className="flex flex-col gap-5">
<NavigateBackButton
href="/catalog"
variant="outline"
Expand Down
10 changes: 9 additions & 1 deletion src/app/catalog/[repoName]/[serverName]/[version]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,22 @@ interface CatalogDetailPageProps {
serverName: string;
version: string;
}>;
searchParams: Promise<{
registryName?: string;
}>;
}

export default async function CatalogDetailPage({
params,
searchParams,
}: CatalogDetailPageProps) {
const { repoName, serverName, version } = await params;
const { registryName } = await searchParams;

const fullServerName = `${repoName}/${serverName}`;
const { data: serverResponse, response } = await getServerDetails(
`${repoName}/${serverName}`,
registryName,
fullServerName,
version,
);

Expand Down
10 changes: 10 additions & 0 deletions src/app/catalog/components/__tests__/servers.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ describe("Servers", () => {
render(
<Servers
servers={mockServers}
registryName="default-registry"
viewMode="grid"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -48,6 +49,7 @@ describe("Servers", () => {
const { container } = render(
<Servers
servers={mockServers}
registryName="default-registry"
viewMode="grid"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -64,6 +66,7 @@ describe("Servers", () => {
render(
<Servers
servers={mockServers}
registryName="default-registry"
viewMode="list"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -79,6 +82,7 @@ describe("Servers", () => {
render(
<Servers
servers={mockServers}
registryName="default-registry"
viewMode="list"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -95,6 +99,7 @@ describe("Servers", () => {
render(
<Servers
servers={[]}
registryName="default-registry"
viewMode="grid"
searchQuery="nonexistent"
onClearSearch={mockOnClearSearch}
Expand All @@ -114,6 +119,7 @@ describe("Servers", () => {
render(
<Servers
servers={[]}
registryName="default-registry"
viewMode="grid"
searchQuery="nonexistent"
onClearSearch={onClearSearch}
Expand All @@ -135,6 +141,7 @@ describe("Servers", () => {
render(
<Servers
servers={[]}
registryName="default-registry"
viewMode="grid"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -151,6 +158,7 @@ describe("Servers", () => {
render(
<Servers
servers={[]}
registryName="default-registry"
viewMode="list"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -164,6 +172,7 @@ describe("Servers", () => {
const { container } = render(
<Servers
servers={[]}
registryName="default-registry"
viewMode="grid"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand All @@ -177,6 +186,7 @@ describe("Servers", () => {
render(
<Servers
servers={[]}
registryName="default-registry"
viewMode="grid"
searchQuery=""
onClearSearch={mockOnClearSearch}
Expand Down
4 changes: 1 addition & 3 deletions src/app/catalog/components/server-filters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
} from "@/components/ui/select";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
import type { GithubComStacklokToolhiveRegistryServerInternalServiceRegistryInfo } from "@/generated/types.gen";
import { CATALOG_ALL_REGISTRIES } from "../constants";

interface ServerFiltersProps {
registries: GithubComStacklokToolhiveRegistryServerInternalServiceRegistryInfo[];
Expand Down Expand Up @@ -68,10 +67,9 @@ export function ServerFilters({
className="w-38 h-9 bg-white dark:bg-card"
aria-label="Select registry"
>
<SelectValue placeholder="All registries" />
<SelectValue placeholder="Select registry" />
</SelectTrigger>
<SelectContent>
<SelectItem value={CATALOG_ALL_REGISTRIES}>All registries</SelectItem>
{registries
.filter(
(registry): registry is typeof registry & { name: string } =>
Expand Down
3 changes: 2 additions & 1 deletion src/app/catalog/components/servers-wrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export function ServersWrapper({
<PageHeader title="MCP Server Catalog">
<ServerFilters
registries={registries}
selectedRegistry={selectedRegistry}
selectedRegistry={selectedRegistry || registries[0]?.name || ""}
onRegistryChange={handleRegistryChange}
viewMode={viewMode}
onViewModeChange={handleViewModeChange}
Expand All @@ -63,6 +63,7 @@ export function ServersWrapper({
) : (
<Servers
servers={servers}
registryName={selectedRegistry || registries[0]?.name || ""}
viewMode={viewMode}
searchQuery={search}
onClearSearch={handleClearSearch}
Expand Down
4 changes: 3 additions & 1 deletion src/app/catalog/components/servers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ServersTable } from "./servers-table";

interface ServersProps {
servers: V0ServerJson[];
registryName: string;
viewMode: "grid" | "list";
searchQuery: string;
onClearSearch: () => void;
Expand All @@ -20,6 +21,7 @@ interface ServersProps {
*/
export function Servers({
servers,
registryName,
viewMode,
searchQuery,
onClearSearch,
Expand All @@ -29,7 +31,7 @@ export function Servers({
const handleServerClick = (server: V0ServerJson) => {
if (!server.name) return;

const detailUrl = `/catalog/${server.name}/${server.version || "latest"}`;
const detailUrl = `/catalog/${server.name}/${server.version || "latest"}?registryName=${encodeURIComponent(registryName)}`;
router.push(detailUrl);
};

Expand Down
1 change: 0 additions & 1 deletion src/app/catalog/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export const CATALOG_ALL_REGISTRIES = "all";
export const CATALOG_VIEW_MODES = ["grid", "list"] as const;
export const CATALOG_PREV_CURSOR_HISTORY_KEY = "catalog:prevCursors";
export const CATALOG_PAGE_SIZE = 24;
Expand Down
10 changes: 3 additions & 7 deletions src/app/catalog/hooks/use-catalog-filters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ import {
useQueryStates,
} from "nuqs";
import { useTransition } from "react";
import {
CATALOG_ALL_REGISTRIES,
CATALOG_PAGE_SIZE,
CATALOG_VIEW_MODES,
} from "../constants";
import { CATALOG_PAGE_SIZE, CATALOG_VIEW_MODES } from "../constants";
import { useSessionStack } from "./use-session-stack";

/**
Expand Down Expand Up @@ -61,7 +57,7 @@ export function useCatalogFilters() {
setFilters(
(prev) => ({
...prev,
registryName: value === CATALOG_ALL_REGISTRIES ? null : value,
registryName: value,
cursor: "",
}),
{ startTransition },
Expand Down Expand Up @@ -97,7 +93,7 @@ export function useCatalogFilters() {
return {
viewMode,
search,
selectedRegistry: registryName || CATALOG_ALL_REGISTRIES,
selectedRegistry: registryName,
cursor,
limit,
isFirstPage,
Expand Down
Loading