Skip to content

Commit 97b90ec

Browse files
Consolidate Domain Page Tabs, Content and Error configs into single file (#892)
- Create combined config for Domain Page Tabs, Content, and Error, to make it easier to update.
1 parent 0cd5bb6 commit 97b90ec

14 files changed

+122
-119
lines changed

src/views/domain-page/config/domain-page-tabs-content.config.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/views/domain-page/config/domain-page-tabs-error.config.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,51 @@
11
import { MdArchive, MdListAlt, MdSettings, MdSort } from 'react-icons/md';
22

3-
import type { DomainPageTabs } from '../domain-page-tabs/domain-page-tabs.types';
3+
import DomainWorkflows from '@/views/domain-workflows/domain-workflows';
4+
import DomainWorkflowsArchival from '@/views/domain-workflows-archival/domain-workflows-archival';
45

5-
const domainPageTabsConfig = [
6-
{
7-
key: 'workflows',
6+
import DomainPageMetadata from '../domain-page-metadata/domain-page-metadata';
7+
import DomainPageSettings from '../domain-page-settings/domain-page-settings';
8+
import type { DomainPageTabsConfig } from '../domain-page-tabs/domain-page-tabs.types';
9+
10+
const domainPageTabsConfig: DomainPageTabsConfig<
11+
'workflows' | 'metadata' | 'settings' | 'archival'
12+
> = {
13+
workflows: {
814
title: 'Workflows',
915
artwork: MdSort,
16+
content: DomainWorkflows,
17+
getErrorConfig: () => ({
18+
message: 'Failed to load workflows',
19+
actions: [{ kind: 'retry', label: 'Retry' }],
20+
}),
1021
},
11-
{
12-
key: 'metadata',
22+
metadata: {
1323
title: 'Metadata',
1424
artwork: MdListAlt,
25+
content: DomainPageMetadata,
26+
getErrorConfig: () => ({
27+
message: 'Failed to load metadata',
28+
actions: [{ kind: 'retry', label: 'Retry' }],
29+
}),
1530
},
16-
{
17-
key: 'settings',
31+
settings: {
1832
title: 'Settings',
1933
artwork: MdSettings,
34+
content: DomainPageSettings,
35+
getErrorConfig: () => ({
36+
message: 'Failed to load settings',
37+
actions: [{ kind: 'retry', label: 'Retry' }],
38+
}),
2039
},
21-
{
22-
key: 'archival',
40+
archival: {
2341
title: 'Archival',
2442
artwork: MdArchive,
43+
content: DomainWorkflowsArchival,
44+
getErrorConfig: () => ({
45+
message: 'Failed to load archival workflows',
46+
actions: [{ kind: 'retry', label: 'Retry' }],
47+
}),
2548
},
26-
] as const satisfies DomainPageTabs;
49+
} as const;
2750

2851
export default domainPageTabsConfig;

src/views/domain-page/domain-page-content/__tests__/domain-page-content.test.tsx

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import DomainPageContent from '../domain-page-content';
66
import type {
77
DomainPageContentParams,
88
DomainPageTabContentProps,
9-
DomainPageTabsContentConfig,
109
} from '../domain-page-content.types';
1110

1211
const mockNotFound = jest.fn();
@@ -25,16 +24,28 @@ const MockedTabContent = ({
2524
</div>
2625
);
2726

28-
jest.mock(
29-
'../../config/domain-page-tabs-content.config',
30-
() =>
31-
({
32-
workflows: (props) => <MockedTabContent {...props} tab="workflows" />,
33-
metadata: (props) => <MockedTabContent {...props} tab="metadata" />,
34-
settings: (props) => <MockedTabContent {...props} tab="settings" />,
35-
archival: (props) => <MockedTabContent {...props} tab="archival" />,
36-
}) as const satisfies DomainPageTabsContentConfig
37-
);
27+
jest.mock('../../config/domain-page-tabs.config', () => ({
28+
workflows: {
29+
content: (props: DomainPageTabContentProps) => (
30+
<MockedTabContent {...props} tab="workflows" />
31+
),
32+
},
33+
metadata: {
34+
content: (props: DomainPageTabContentProps) => (
35+
<MockedTabContent {...props} tab="metadata" />
36+
),
37+
},
38+
settings: {
39+
content: (props: DomainPageTabContentProps) => (
40+
<MockedTabContent {...props} tab="settings" />
41+
),
42+
},
43+
archival: {
44+
content: (props: DomainPageTabContentProps) => (
45+
<MockedTabContent {...props} tab="archival" />
46+
),
47+
},
48+
}));
3849

3950
const mockParams: DomainPageContentParams = {
4051
domain: 'mock-domain',

src/views/domain-page/domain-page-content/domain-page-content.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
55

66
import decodeUrlParams from '@/utils/decode-url-params';
77

8-
import domainPageTabsContentConfig from '../config/domain-page-tabs-content.config';
8+
import domainPageTabsConfig from '../config/domain-page-tabs.config';
99

1010
import { styled } from './domain-page-content.styles';
1111
import {
@@ -17,15 +17,15 @@ export default function DomainPageContent(props: Props) {
1717
const decodedParams = decodeUrlParams(
1818
props.params
1919
) as DomainPageContentParams;
20-
const TabContent = domainPageTabsContentConfig[decodedParams.domainTab];
20+
const tabConfig = domainPageTabsConfig[decodedParams.domainTab];
2121

22-
if (!TabContent) {
22+
if (!tabConfig) {
2323
return notFound();
2424
}
2525

2626
return (
2727
<styled.PageSection>
28-
<TabContent
28+
<tabConfig.content
2929
domain={decodedParams.domain}
3030
cluster={decodedParams.cluster}
3131
/>
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import type domainPageTabsConfig from '../config/domain-page-tabs.config';
2-
3-
export type DomainTabName = (typeof domainPageTabsConfig)[number]['key'];
1+
import { type DomainPageTabName } from '../domain-page-tabs/domain-page-tabs.types';
42

53
export type DomainPageContentParams = {
64
domain: string;
75
cluster: string;
8-
domainTab: DomainTabName;
6+
domainTab: DomainPageTabName;
97
};
108

119
export type Props = {
@@ -16,8 +14,3 @@ export type DomainPageTabContentProps = {
1614
domain: string;
1715
cluster: string;
1816
};
19-
20-
export type DomainPageTabsContentConfig = Record<
21-
DomainTabName,
22-
React.ComponentType<DomainPageTabContentProps>
23-
>;

src/views/domain-page/domain-page-tabs-error/__tests__/domain-page-tabs-error.test.tsx

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import * as navigationModule from 'next/navigation';
55
import { render, screen } from '@/test-utils/rtl';
66

77
import DomainPageTabsError from '../domain-page-tabs-error';
8-
import type { DomainPageTabsErrorConfig } from '../domain-page-tabs-error.types';
98

109
jest.mock('@/components/error-panel/error-panel', () =>
1110
jest.fn(({ message }: { message: string }) => <div>{message}</div>)
@@ -21,22 +20,30 @@ jest.mock('next/navigation', () => ({
2120
}));
2221

2322
jest.mock(
24-
'../../config/domain-page-tabs-error.config',
23+
'../../config/domain-page-tabs.config',
2524
() =>
2625
({
27-
workflows: () => ({
28-
message: 'workflow error',
29-
}),
30-
metadata: () => ({
31-
message: 'metadata error',
32-
}),
33-
settings: () => ({
34-
message: 'settings error',
35-
}),
36-
archival: () => ({
37-
message: 'archival error',
38-
}),
39-
}) as const satisfies DomainPageTabsErrorConfig
26+
workflows: {
27+
getErrorConfig: () => ({
28+
message: 'workflow error',
29+
}),
30+
},
31+
metadata: {
32+
getErrorConfig: () => ({
33+
message: 'metadata error',
34+
}),
35+
},
36+
settings: {
37+
getErrorConfig: () => ({
38+
message: 'settings error',
39+
}),
40+
},
41+
archival: {
42+
getErrorConfig: () => ({
43+
message: 'archival error',
44+
}),
45+
},
46+
}) as const
4047
);
4148

4249
describe(DomainPageTabsError.name, () => {

src/views/domain-page/domain-page-tabs-error/domain-page-tabs-error.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ import { useParams } from 'next/navigation';
33
import ErrorPanel from '@/components/error-panel/error-panel';
44
import PanelSection from '@/components/panel-section/panel-section';
55

6-
import domainPageTabsErrorConfig from '../config/domain-page-tabs-error.config';
7-
import { type DomainTabName } from '../domain-page-content/domain-page-content.types';
6+
import domainPageTabsConfig from '../config/domain-page-tabs.config';
7+
import { type DomainPageContentParams } from '../domain-page-content/domain-page-content.types';
88

99
import { type Props } from './domain-page-tabs-error.types';
1010

1111
export default function DomainPageTabsError({ error, reset }: Props) {
12-
const { domainTab } = useParams();
13-
const getConfig = domainPageTabsErrorConfig[domainTab as DomainTabName];
12+
const { domainTab } = useParams<DomainPageContentParams>();
13+
const tabConfig = domainPageTabsConfig[domainTab];
1414

15-
if (typeof getConfig !== 'function') {
15+
if (!tabConfig) {
1616
return (
1717
<PanelSection>
1818
<ErrorPanel
@@ -24,7 +24,8 @@ export default function DomainPageTabsError({ error, reset }: Props) {
2424
);
2525
}
2626

27-
const errorConfig = getConfig(error);
27+
const errorConfig = tabConfig.getErrorConfig(error);
28+
2829
return (
2930
<PanelSection>
3031
<ErrorPanel

src/views/domain-page/domain-page-tabs-error/domain-page-tabs-error.types.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
import { type Props as ErrorPanelProps } from '@/components/error-panel/error-panel.types';
22

3-
import { type DomainTabName } from '../domain-page-content/domain-page-content.types';
4-
53
export type DomainPageTabErrorConfig = Omit<ErrorPanelProps, 'error' | 'reset'>;
64

7-
export type DomainPageTabsErrorConfig = Record<
8-
DomainTabName,
9-
(err: Error) => DomainPageTabErrorConfig
10-
>;
11-
125
export type Props = {
136
error: Error;
147
reset: () => void;

src/views/domain-page/domain-page-tabs/__tests__/domain-page-tabs.test.tsx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import React from 'react';
22

33
import { render, screen, act, fireEvent } from '@/test-utils/rtl';
44

5-
import { type PageTab } from '@/components/page-tabs/page-tabs.types';
6-
75
import domainPageTabsConfig from '../../config/domain-page-tabs.config';
86
import DomainPageTabs from '../domain-page-tabs';
97

@@ -25,17 +23,15 @@ jest.mock('next/navigation', () => ({
2523
}),
2624
}));
2725

28-
jest.mock('../../config/domain-page-tabs.config', () => [
29-
{
30-
key: 'workflows',
26+
jest.mock('../../config/domain-page-tabs.config', () => ({
27+
workflows: {
3128
title: 'Workflows',
3229
artwork: () => <div data-testid="workflows-artwork" />,
3330
},
34-
{
35-
key: 'page-2',
31+
'page-2': {
3632
title: 'Page 2',
3733
},
38-
]);
34+
}));
3935

4036
describe('DomainPageTabs', () => {
4137
afterEach(() => {
@@ -45,7 +41,7 @@ describe('DomainPageTabs', () => {
4541
it('renders tabs titles correctly', () => {
4642
render(<DomainPageTabs />);
4743

48-
domainPageTabsConfig.forEach(({ title }) => {
44+
Object.values(domainPageTabsConfig).forEach(({ title }) => {
4945
expect(screen.getByText(title)).toBeInTheDocument();
5046
});
5147
});
@@ -90,7 +86,7 @@ describe('DomainPageTabs', () => {
9086
it('renders tabs artworks correctly', () => {
9187
render(<DomainPageTabs />);
9288

93-
domainPageTabsConfig.forEach(({ key, artwork }: PageTab) => {
89+
Object.entries(domainPageTabsConfig).forEach(([key, { artwork }]) => {
9490
if (typeof artwork !== 'undefined')
9591
expect(screen.getByTestId(`${key}-artwork`)).toBeInTheDocument();
9692
else

0 commit comments

Comments
 (0)