Skip to content

Commit d62cd83

Browse files
authored
Refactor workflow action snackbar to a global provider (#875)
* Refactor workflow action snackbar to a global provider * add test case for onDismissMessage * remove snackbarprovider from test
1 parent 43f2c11 commit d62cd83

File tree

11 files changed

+57
-20
lines changed

11 files changed

+57
-20
lines changed

src/app/layout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import type { Metadata } from 'next';
22
import { Rubik } from 'next/font/google';
33

4+
import SnackbarProvider from '@/components/snackbar-provider/snackbar-provider';
45
import ReactQueryProvider from '@/providers/react-query-provider';
56

67
import StyletronProvider from '../providers/styletron-provider';
78

89
import StyledJsxRegistry from './registry';
10+
911
import './globals.css';
1012

1113
const inter = Rubik({ subsets: ['latin'] });
@@ -26,7 +28,9 @@ export default function RootLayout({
2628
<StyledJsxRegistry />
2729
<body className={inter.className}>
2830
<ReactQueryProvider>
29-
<StyletronProvider>{children}</StyletronProvider>
31+
<StyletronProvider>
32+
<SnackbarProvider>{children}</SnackbarProvider>
33+
</StyletronProvider>
3034
</ReactQueryProvider>
3135
</body>
3236
</html>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { type Theme } from 'baseui';
2+
import { type SnackbarElementOverrides } from 'baseui/snackbar';
3+
import { type StyleObject } from 'styletron-react';
4+
5+
export const overrides = {
6+
snackbar: {
7+
Root: {
8+
style: ({ $theme }: { $theme: Theme }): StyleObject => ({
9+
backgroundColor: $theme.colors.contentPositive,
10+
}),
11+
},
12+
} satisfies SnackbarElementOverrides,
13+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use client';
2+
import {
3+
SnackbarProvider as BaseSnackbarProvider,
4+
PLACEMENT,
5+
DURATION,
6+
} from 'baseui/snackbar';
7+
8+
import { overrides } from './snackbar-provider.styles';
9+
import { type Props } from './snackbar-provider.types';
10+
11+
export default function SnackbarProvider({ children }: Props) {
12+
return (
13+
<BaseSnackbarProvider
14+
placement={PLACEMENT.bottom}
15+
overrides={overrides.snackbar}
16+
defaultDuration={DURATION.infinite}
17+
>
18+
{children}
19+
</BaseSnackbarProvider>
20+
);
21+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type Props = {
2+
children: React.ReactNode;
3+
};

src/views/workflow-actions/workflow-action-new-run-success-msg/__tests__/workflow-action-new-run-success-msg.test.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('WorkflowActionNewRunSuccessMsg', () => {
1717
submissionData: null,
1818
},
1919
successMessage: 'Workflow has been restarted.',
20+
onDismissMessage: jest.fn(),
2021
};
2122

2223
it('renders the success message with a link', () => {
@@ -40,4 +41,11 @@ describe('WorkflowActionNewRunSuccessMsg', () => {
4041
`/domains/${domain}/${cluster}/workflows/${workflowId}/${runId}`
4142
);
4243
});
44+
45+
it('calls the onDismissMessage function when the link is clicked', () => {
46+
render(<WorkflowActionNewRunSuccessMsg {...mockProps} />);
47+
const link = screen.getByText('Click here');
48+
link.click();
49+
expect(mockProps.onDismissMessage).toHaveBeenCalled();
50+
});
4351
});

src/views/workflow-actions/workflow-action-new-run-success-msg/workflow-action-new-run-success-msg.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ const WorkflowActionNewRunSuccessMsg = ({
66
result: { runId },
77
inputParams: { workflowId, cluster, domain },
88
successMessage,
9+
onDismissMessage,
910
}: Props) => {
1011
return (
1112
<>
1213
{successMessage}{' '}
1314
<Link
1415
color="contentInversePrimary"
1516
href={`/domains/${domain}/${cluster}/workflows/${workflowId}/${runId}`}
17+
onClick={onDismissMessage}
1618
>
1719
Click here
1820
</Link>{' '}

src/views/workflow-actions/workflow-action-new-run-success-msg/workflow-action-new-run-success-msg.types.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export type Props = WorkflowActionSuccessMessageProps<
55
{ runId: string }
66
> & {
77
successMessage: string;
8+
onDismissMessage: () => void;
89
};

src/views/workflow-actions/workflow-actions-modal-content/workflow-actions-modal-content.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export default function WorkflowActionsModalContent<
7070
message: action.renderSuccessMessage?.({
7171
result,
7272
inputParams: params,
73+
onDismissMessage: () => dequeue(),
7374
}),
7475
startEnhancer: MdCheckCircle,
7576
actionMessage: 'OK',

src/views/workflow-actions/workflow-actions.styles.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { type Theme } from 'baseui';
22
import { type ButtonOverrides } from 'baseui/button';
33
import { type PopoverOverrides } from 'baseui/popover';
4-
import { type SnackbarElementOverrides } from 'baseui/snackbar';
54
import { type StyleObject } from 'styletron-react';
65

76
export const overrides = {
@@ -12,13 +11,6 @@ export const overrides = {
1211
}),
1312
},
1413
} satisfies PopoverOverrides,
15-
snackbar: {
16-
Root: {
17-
style: ({ $theme }: { $theme: Theme }): StyleObject => ({
18-
backgroundColor: $theme.colors.contentPositive,
19-
}),
20-
},
21-
} satisfies SnackbarElementOverrides,
2214
button: {
2315
BaseButton: {
2416
style: ({

src/views/workflow-actions/workflow-actions.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@ import {
66
StatefulPopover,
77
PLACEMENT as POPOVER_PLACEMENT,
88
} from 'baseui/popover';
9-
import {
10-
SnackbarProvider,
11-
PLACEMENT as SNACKBAR_PLACEMENT,
12-
DURATION,
13-
} from 'baseui/snackbar';
149
import { pick } from 'lodash';
1510
import { useParams } from 'next/navigation';
1611
import { MdArrowDropDown } from 'react-icons/md';
@@ -57,11 +52,7 @@ export default function WorkflowActions() {
5752
}
5853

5954
return (
60-
<SnackbarProvider
61-
placement={SNACKBAR_PLACEMENT.bottom}
62-
overrides={overrides.snackbar}
63-
defaultDuration={DURATION.infinite}
64-
>
55+
<>
6556
<StatefulPopover
6657
placement={POPOVER_PLACEMENT.bottomRight}
6758
overrides={overrides.popover}
@@ -93,6 +84,6 @@ export default function WorkflowActions() {
9384
action={selectedAction}
9485
onClose={() => setSelectedAction(undefined)}
9586
/>
96-
</SnackbarProvider>
87+
</>
9788
);
9889
}

0 commit comments

Comments
 (0)