Skip to content

Commit 32a7dc5

Browse files
Misc Domain Page refactoring (#867)
- Rename DomainInfo to DomainDescription - Add common hook useSuspenseDomainDescription to load domain description - Move generated Domain type to route handlers - Fix lint warnings in archival header - Add hook for DomainPageMetadata, which can be overridden with additional domain metadata
1 parent f4b9c07 commit 32a7dc5

30 files changed

+242
-159
lines changed

src/route-handlers/describe-domain/describe-domain.types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { type Domain } from '@/__generated__/proto-ts/uber/cadence/api/v1/Domain';
12
import { type DefaultMiddlewaresContext } from '@/utils/route-handlers-middleware';
2-
import { type DomainInfo } from '@/views/domain-page/domain-page.types';
33

44
export type RouteParams = {
55
domain: string;
@@ -11,4 +11,4 @@ export type RequestParams = {
1111
};
1212

1313
export type Context = DefaultMiddlewaresContext;
14-
export type DescribeDomainResponse = DomainInfo;
14+
export type DescribeDomainResponse = Domain;

src/route-handlers/update-domain/update-domain.types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { type Domain } from '@/__generated__/proto-ts/uber/cadence/api/v1/Domain';
12
import { type UpdateDomainRequest__Input } from '@/__generated__/proto-ts/uber/cadence/api/v1/UpdateDomainRequest';
23
import { type DefaultMiddlewaresContext } from '@/utils/route-handlers-middleware';
3-
import { type DomainInfo } from '@/views/domain-page/domain-page.types';
44

55
export type RouteParams = {
66
domain: string;
@@ -16,6 +16,6 @@ export type UpdateDomainFields = Omit<
1616
'securityToken' | 'name' | 'updateMask'
1717
>;
1818

19-
export type UpdateDomainResponse = DomainInfo;
19+
export type UpdateDomainResponse = Domain;
2020

2121
export type Context = DefaultMiddlewaresContext;

src/views/domain-page/__fixtures__/domain-info.ts renamed to src/views/domain-page/__fixtures__/domain-description.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { type DomainInfo } from '../domain-page.types';
1+
import { type DomainDescription } from '../domain-page.types';
22

3-
export const mockDomainInfo: DomainInfo = {
3+
export const mockDomainDescription: DomainDescription = {
44
activeClusterName: 'cluster_1',
55
clusters: [{ clusterName: 'cluster_1' }, { clusterName: 'cluster_2' }],
66
data: { Tier: '5', IsManagedByCadence: 'true' },
@@ -25,7 +25,7 @@ export const mockDomainInfo: DomainInfo = {
2525
failoverVersion: '123456',
2626
};
2727

28-
export const mockDomainInfoSingleCluster: DomainInfo = {
28+
export const mockDomainDescriptionSingleCluster: DomainDescription = {
2929
activeClusterName: 'cluster_1',
3030
clusters: [{ clusterName: 'cluster_1' }],
3131
data: { Tier: '5', IsManagedByCadence: 'true' },

src/views/domain-page/config/domain-page-header-info-items.config.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ const domainPageHeaderInfoItemsConfig = [
1313
{
1414
title: 'Global/Local',
1515
getLabel: (props: DomainHeaderInfoItemContentProps) =>
16-
props.domainInfo.isGlobalDomain ? 'Global' : 'Local',
16+
props.domainDescription.isGlobalDomain ? 'Global' : 'Local',
1717
placeholderSize: '64px',
1818
},
1919
{
2020
title: 'Domain ID',
21-
getLabel: (props: DomainHeaderInfoItemContentProps) => props.domainInfo.id,
21+
getLabel: (props: DomainHeaderInfoItemContentProps) =>
22+
props.domainDescription.id,
2223
placeholderSize: '256px',
2324
},
2425
] as const satisfies DomainPageHeaderInfoItemsConfig;

src/views/domain-page/config/domain-page-metadata-table.config.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
1-
import { createElement } from 'react';
2-
31
import type { ListTableItem } from '@/components/list-table/list-table.types';
42

53
import DomainPageMetadataClusters from '../domain-page-metadata-clusters/domain-page-metadata-clusters';
6-
import { type DomainInfo } from '../domain-page.types';
4+
import { type DomainDescription } from '../domain-page.types';
75

8-
const domainPageMetadataTableConfig: Array<ListTableItem<DomainInfo>> = [
6+
const domainPageMetadataTableConfig: Array<ListTableItem<DomainDescription>> = [
97
{
108
key: 'domainId',
119
label: 'Domain ID',
12-
renderValue: (domainInfo: DomainInfo) => domainInfo.id,
10+
renderValue: (domainDescription: DomainDescription) => domainDescription.id,
1311
},
1412
{
1513
key: 'owner',
1614
label: 'Owner',
17-
renderValue: (domainInfo: DomainInfo) => domainInfo.ownerEmail,
15+
renderValue: (domainDescription: DomainDescription) =>
16+
domainDescription.ownerEmail,
1817
},
1918
{
2019
key: 'clusters',
2120
label: 'Clusters',
22-
renderValue: (domainInfo: DomainInfo) =>
23-
createElement(DomainPageMetadataClusters, domainInfo),
21+
renderValue: DomainPageMetadataClusters,
2422
},
2523
{
2624
key: 'globalOrLocal',
2725
label: 'Global/Local',
28-
renderValue: (domainInfo: DomainInfo) =>
29-
domainInfo.isGlobalDomain ? 'Global' : 'Local',
26+
renderValue: (domainDescription: DomainDescription) =>
27+
domainDescription.isGlobalDomain ? 'Global' : 'Local',
3028
},
3129
{
3230
key: 'failoverVersion',
3331
label: 'Failover version',
34-
renderValue: (domainInfo: DomainInfo) => domainInfo.failoverVersion,
32+
renderValue: (domainDescription: DomainDescription) =>
33+
domainDescription.failoverVersion,
3534
},
3635
];
3736

src/views/domain-page/config/domain-page-settings-form.config.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import formatDurationToSeconds from '@/utils/data-formatters/format-duration-to-
88
import { type SettingsFormField } from '@/views/shared/settings-form/settings-form.types';
99

1010
import DomainPageSettingsRetentionPeriod from '../domain-page-settings-retention-period/domain-page-settings-retention-period';
11-
import { type DomainInfo } from '../domain-page.types';
11+
import { type DomainDescription } from '../domain-page.types';
1212

1313
export const domainPageSettingsFormSchema = z.object({
1414
description: z.string(),
@@ -21,22 +21,22 @@ export const domainPageSettingsFormSchema = z.object({
2121

2222
export const domainPageSettingsFormConfig: [
2323
SettingsFormField<
24-
DomainInfo,
24+
DomainDescription,
2525
typeof domainPageSettingsFormSchema,
2626
'description'
2727
>,
2828
SettingsFormField<
29-
DomainInfo,
29+
DomainDescription,
3030
typeof domainPageSettingsFormSchema,
3131
'retentionPeriodSeconds'
3232
>,
3333
SettingsFormField<
34-
DomainInfo,
34+
DomainDescription,
3535
typeof domainPageSettingsFormSchema,
3636
'visibilityArchival'
3737
>,
3838
SettingsFormField<
39-
DomainInfo,
39+
DomainDescription,
4040
typeof domainPageSettingsFormSchema,
4141
'historyArchival'
4242
>,

src/views/domain-page/domain-page-cluster-selector/__tests__/domain-page-cluster-selector.test.tsx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import React from 'react';
33
import { render, screen, fireEvent, act, within } from '@/test-utils/rtl';
44

55
import {
6-
mockDomainInfo,
7-
mockDomainInfoSingleCluster,
8-
} from '../../__fixtures__/domain-info';
9-
import { type DomainInfo } from '../../domain-page.types';
6+
mockDomainDescription,
7+
mockDomainDescriptionSingleCluster,
8+
} from '../../__fixtures__/domain-description';
9+
import { type DomainDescription } from '../../domain-page.types';
1010
import DomainPageClusterSelector from '../domain-page-cluster-selector';
1111

1212
const mockPushFn = jest.fn();
@@ -33,21 +33,21 @@ describe(DomainPageClusterSelector.name, () => {
3333
});
3434

3535
it('Should render current cluster correctly', () => {
36-
setup({ domainInfo: mockDomainInfo });
36+
setup({ domainDescription: mockDomainDescription });
3737

3838
expect(screen.getByText('cluster_1')).toBeInTheDocument();
3939
expect(screen.getByRole('combobox')).toBeInTheDocument();
4040
});
4141

4242
it('Should render only a label for single cluster', () => {
43-
setup({ domainInfo: mockDomainInfoSingleCluster });
43+
setup({ domainDescription: mockDomainDescriptionSingleCluster });
4444

4545
expect(screen.getByText('cluster_1')).toBeInTheDocument();
4646
expect(screen.queryByRole('combobox')).toBeNull();
4747
});
4848

4949
it('Should show available clusters and redirect when one is selected', () => {
50-
setup({ domainInfo: mockDomainInfo });
50+
setup({ domainDescription: mockDomainDescription });
5151

5252
expect(screen.getByText('cluster_1')).toBeInTheDocument();
5353
const clusterSelect = screen.getByRole('combobox');
@@ -69,8 +69,15 @@ describe(DomainPageClusterSelector.name, () => {
6969
});
7070
});
7171

72-
function setup({ domainInfo }: { domainInfo: DomainInfo }) {
72+
function setup({
73+
domainDescription,
74+
}: {
75+
domainDescription: DomainDescription;
76+
}) {
7377
render(
74-
<DomainPageClusterSelector cluster="cluster_1" domainInfo={domainInfo} />
78+
<DomainPageClusterSelector
79+
cluster="cluster_1"
80+
domainDescription={domainDescription}
81+
/>
7582
);
7683
}

src/views/domain-page/domain-page-cluster-selector/domain-page-cluster-selector.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ export default function DomainPageClusterSelector(
1515
const router = useRouter();
1616
const { domain: encodedDomain, domainTab: encodedDomainTab } = useParams();
1717

18-
if (props.domainInfo.clusters?.length === 1) {
18+
if (props.domainDescription.clusters?.length === 1) {
1919
return <styled.ItemLabel>{props.cluster}</styled.ItemLabel>;
2020
}
2121

2222
return (
2323
<Select
2424
overrides={overrides.select}
25-
options={props.domainInfo.clusters.map((cluster) => ({
25+
options={props.domainDescription.clusters.map((cluster) => ({
2626
id: cluster.clusterName,
2727
label: cluster.clusterName,
2828
}))}

src/views/domain-page/domain-page-header-info-loader/__tests__/domain-page-header-info-loader.test.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,22 @@ import { render, screen, act } from '@/test-utils/rtl';
44

55
import * as requestModule from '@/utils/request';
66

7-
import { mockDomainInfo } from '../../__fixtures__/domain-info';
8-
import { type DomainInfo } from '../../domain-page.types';
7+
import { mockDomainDescription } from '../../__fixtures__/domain-description';
8+
import { type DomainDescription } from '../../domain-page.types';
99
import DomainPageHeaderInfoLoader from '../domain-page-header-info-loader';
1010

1111
jest.mock('../../domain-page-header-info/domain-page-header-info', () =>
1212
jest.fn(
13-
({ domainInfo, cluster }: { domainInfo: DomainInfo; cluster: string }) => (
13+
({
14+
domainDescription,
15+
cluster,
16+
}: {
17+
domainDescription: DomainDescription;
18+
cluster: string;
19+
}) => (
1420
<div>
15-
Mock domain info for Domain {domainInfo.name} in {cluster}
16-
<div>Domain ID: {domainInfo.id}</div>
21+
Mock domain info for Domain {domainDescription.name} in {cluster}
22+
<div>Domain ID: {domainDescription.id}</div>
1723
</div>
1824
)
1925
)
@@ -59,7 +65,7 @@ async function setup({ error }: { error?: boolean }) {
5965
requestMock.mockRejectedValue(new Error('Failed to fetch domain info'));
6066
} else {
6167
requestMock.mockResolvedValue({
62-
json: () => Promise.resolve(mockDomainInfo),
68+
json: () => Promise.resolve(mockDomainDescription),
6369
});
6470
}
6571

src/views/domain-page/domain-page-header-info-loader/domain-page-header-info-loader.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,19 @@
11
'use client';
22
import React from 'react';
33

4-
import { useSuspenseQuery } from '@tanstack/react-query';
5-
6-
import request from '@/utils/request';
4+
import useSuspenseDomainDescription from '@/views/shared/hooks/use-suspense-domain-description';
75

86
import DomainPageHeaderInfo from '../domain-page-header-info/domain-page-header-info';
9-
import { type DomainInfo } from '../domain-page.types';
107

118
import { type Props } from './domain-page-header-info-loader.types';
129

1310
export default function DomainPageHeaderInfoLoader(props: Props) {
14-
const { data: domainInfo } = useSuspenseQuery<DomainInfo>({
15-
queryKey: ['describeDomain', props],
16-
queryFn: () =>
17-
request(`/api/domains/${props.domain}/${props.cluster}`).then((res) =>
18-
res.json()
19-
),
20-
});
11+
const { data: domainDescription } = useSuspenseDomainDescription(props);
2112

2213
return (
2314
<DomainPageHeaderInfo
2415
loading={false}
25-
domainInfo={domainInfo}
16+
domainDescription={domainDescription}
2617
cluster={props.cluster}
2718
/>
2819
);

0 commit comments

Comments
 (0)