Skip to content

Commit e3635a3

Browse files
committed
1 parent 8a4742c commit e3635a3

File tree

5 files changed

+44
-17
lines changed

5 files changed

+44
-17
lines changed

src/config/useInstanceClient.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,23 @@ export function useInstanceClientParams(operationsUrl?: string | null, port?: nu
2020
}
2121

2222
export function useInstanceClientIdParams(operationsUrl?: string | null, port?: number, secure?: boolean): InstanceClientIdConfig & InstanceTypeConfig {
23-
const { instanceId, clusterId }: { instanceId?: string; clusterId?: string; } = useParams({ strict: false });
23+
const params: { instanceId?: string; clusterId?: string; } = useParams({ strict: false });
24+
return getInstanceClientIdFromParams({ ...params, operationsUrl, port, secure });
25+
}
26+
27+
export function getInstanceClientIdFromParams({
28+
instanceId,
29+
clusterId,
30+
operationsUrl,
31+
port,
32+
secure,
33+
}: {
34+
instanceId?: string,
35+
clusterId?: string,
36+
operationsUrl?: string | null,
37+
port?: number,
38+
secure?: boolean,
39+
}): InstanceClientIdConfig & InstanceTypeConfig {
2440
const id = isLocalStudio ? OverallAppSignIn : instanceId ?? clusterId;
2541
if (!id) {
2642
throw new Error('id could not be automatically calculated in useInstanceClientIdParams');

src/features/instance/InstanceLayout.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
1-
import { getInstanceInfoQueryOptions } from '@/features/cluster/queries/getInstanceInfoQuery';
21
import { InstanceNavBar } from '@/features/instance/InstanceNavBar';
3-
import { useSuspenseQuery } from '@tanstack/react-query';
4-
import { Outlet, useParams } from '@tanstack/react-router';
2+
import { Outlet } from '@tanstack/react-router';
53

64
export function InstanceLayout() {
7-
const params: { instanceId?: string; clusterId?: string; } = useParams({ strict: false });
8-
const { isSuccess } = useSuspenseQuery(getInstanceInfoQueryOptions(params));
9-
10-
if (!isSuccess) {
11-
throw new Error('Instance info not found');
12-
}
135
return (
146
<>
157
<nav className="fixed top-20 w-full z-39 md:px-12 md:py-1 bg-grey-700">

src/features/instance/InstanceNavBar.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import {
88
DropdownMenuSeparator,
99
DropdownMenuTrigger,
1010
} from '@/components/ui/dropdownMenu';
11+
import { RegistrationInfoResponse } from '@/features/instance/operations/queries/getRegistrationInfo';
1112
import { useInstanceManagePermission } from '@/hooks/usePermissions';
1213
import { excludeFalsy } from '@/lib/arrays/excludeFalsy';
14+
import { wasAReleasedBeforeB } from '@/lib/string/wasAReleasedBeforeB';
1315
import { buildAbsoluteLinkToPage } from '@/lib/urls/buildAbsoluteLinkToPage';
14-
import { Link, useParams } from '@tanstack/react-router';
16+
import { Link, useLoaderData, useParams } from '@tanstack/react-router';
1517
import { DatabaseIcon, GaugeIcon, Menu, NotepadTextIcon, PackageIcon, ServerIcon, SettingsIcon } from 'lucide-react';
1618
import { ReactNode, useMemo } from 'react';
1719

@@ -27,6 +29,11 @@ const activeLinkProps = { className: 'text-white' };
2729
export function InstanceNavBar() {
2830
const canManage = useInstanceManagePermission();
2931
const params = useParams({ strict: false });
32+
33+
const { version }: RegistrationInfoResponse = useLoaderData({ strict: false });
34+
const apisAvailable = wasAReleasedBeforeB('4.7.0-beta.7', version);
35+
const statusAvailable = wasAReleasedBeforeB('4.6.0', version);
36+
3037
const links = useMemo(() => [
3138
{
3239
to: buildAbsoluteLinkToPage(params),
@@ -40,12 +47,12 @@ export function InstanceNavBar() {
4047
icon: <DatabaseIcon className="inline-block" />,
4148
name: 'Databases',
4249
},
43-
canManage && {
50+
canManage && apisAvailable && {
4451
to: buildAbsoluteLinkToPage(params, 'apis'),
4552
name: 'APIs',
4653
icon: <ServerIcon className="inline-block" />,
4754
},
48-
canManage && {
55+
canManage && statusAvailable && {
4956
to: buildAbsoluteLinkToPage(params, 'status'),
5057
icon: <GaugeIcon className="inline-block" />,
5158
name: 'Status',
@@ -60,7 +67,7 @@ export function InstanceNavBar() {
6067
icon: <SettingsIcon className="inline-block" />,
6168
name: 'Config',
6269
},
63-
].filter(excludeFalsy) satisfies Link[], [canManage, params]);
70+
].filter(excludeFalsy) satisfies Link[], [canManage, params, apisAvailable, statusAvailable]);
6471
return (
6572
<>
6673
<DesktopInstanceNavBar links={links} />

src/features/instance/instanceLayoutRoute.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { getInstanceClientIdFromParams } from '@/config/useInstanceClient';
12
import { clusterLayoutRoute } from '@/features/cluster/clusterLayoutRoute';
2-
import { getInstanceInfoQueryOptions } from '@/features/cluster/queries/getInstanceInfoQuery';
33
import { InstanceLayout } from '@/features/instance/InstanceLayout';
4+
import { getRegistrationInfoQueryOptions } from '@/features/instance/operations/queries/getRegistrationInfo';
45
import { buildRedirectInSearch } from '@/lib/urls/buildRedirectInSearch';
56
import { dashboardLayout } from '@/router/dashboardRoute';
67
import { createRoute, redirect } from '@tanstack/react-router';
@@ -11,6 +12,10 @@ export function createInstanceLayoutRoute(mode: 'local' | 'cluster' | 'instance'
1112
getParentRoute: () => dashboardLayout,
1213
id: '_instanceLayout',
1314
component: InstanceLayout,
15+
loader: async ({ context, params }) => {
16+
const operationsParams = getInstanceClientIdFromParams(params);
17+
return context.queryClient.ensureQueryData(getRegistrationInfoQueryOptions(operationsParams));
18+
},
1419
});
1520
}
1621
if (mode === 'cluster') {
@@ -24,7 +29,10 @@ export function createInstanceLayoutRoute(mode: 'local' | 'cluster' | 'instance'
2429
const to = `/${params.organizationId}/${params.clusterId}/sign-in`;
2530
throw redirect({ to, search: buildRedirectInSearch() });
2631
}
27-
return await context.queryClient.ensureQueryData(getInstanceInfoQueryOptions(params));
32+
},
33+
loader: async ({ context, params }) => {
34+
const operationsParams = getInstanceClientIdFromParams(params);
35+
return context.queryClient.ensureQueryData(getRegistrationInfoQueryOptions(operationsParams));
2836
},
2937
});
3038
}
@@ -38,7 +46,10 @@ export function createInstanceLayoutRoute(mode: 'local' | 'cluster' | 'instance'
3846
const to = `/${params.organizationId}/${params.clusterId}/instance/${params.instanceId}/sign-in`;
3947
throw redirect({ to, search: buildRedirectInSearch() });
4048
}
41-
return await context.queryClient.ensureQueryData(getInstanceInfoQueryOptions(params));
49+
},
50+
loader: async ({ context, params }) => {
51+
const operationsParams = getInstanceClientIdFromParams(params);
52+
return context.queryClient.ensureQueryData(getRegistrationInfoQueryOptions(operationsParams));
4253
},
4354
});
4455
}

src/features/instance/operations/queries/getRegistrationInfo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface RegistrationInfoResponse {
1111
export function getRegistrationInfoQueryOptions({ entityId, instanceClient }: InstanceClientIdConfig) {
1212
return queryOptions({
1313
queryKey: [entityId, 'registration_info'] as const,
14+
staleTime: 60_000,
1415
queryFn: async () => {
1516
const { data } = await instanceClient.post('/', {
1617
operation: 'registration_info',

0 commit comments

Comments
 (0)