Skip to content

Commit 28b0c24

Browse files
Reduce duplicate button code
1 parent 0139cac commit 28b0c24

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

src/components/form-elements/button/Button.tsx

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,38 @@ import {
1414

1515
import { type AsElementLink } from '#util/types/LinkTypes.js';
1616

17-
export interface ButtonProps extends AsElementLink<HTMLButtonElement> {
17+
export interface ButtonProps extends ButtonBaseProps, AsElementLink<HTMLButtonElement> {
1818
href?: never;
19-
secondary?: boolean;
20-
reverse?: boolean;
21-
warning?: boolean;
22-
login?: boolean;
23-
small?: boolean;
2419
as?: 'button';
25-
preventDoubleClick?: boolean;
2620
}
2721

28-
export interface ButtonLinkProps extends AsElementLink<HTMLAnchorElement> {
22+
export interface ButtonLinkProps extends ButtonBaseProps, AsElementLink<HTMLAnchorElement> {
2923
href: string;
3024
type?: never;
25+
as?: 'a';
26+
}
27+
28+
interface ButtonBaseProps {
3129
secondary?: boolean;
3230
reverse?: boolean;
3331
warning?: boolean;
3432
login?: boolean;
3533
small?: boolean;
36-
as?: 'a';
3734
preventDoubleClick?: boolean;
3835
}
3936

37+
function getButtonClassNames(props: ButtonProps | ButtonLinkProps) {
38+
return classNames(
39+
'nhsuk-button',
40+
{ 'nhsuk-button--secondary': props.secondary },
41+
{ 'nhsuk-button--reverse': props.reverse },
42+
{ 'nhsuk-button--warning': props.warning },
43+
{ 'nhsuk-button--login': props.login },
44+
{ 'nhsuk-button--small': props.small },
45+
props.className,
46+
);
47+
}
48+
4049
const ButtonComponent = forwardRef<HTMLButtonElement, ButtonProps>((props, forwardedRef) => {
4150
const {
4251
className,
@@ -76,15 +85,7 @@ const ButtonComponent = forwardRef<HTMLButtonElement, ButtonProps>((props, forwa
7685

7786
return (
7887
<Element
79-
className={classNames(
80-
'nhsuk-button',
81-
{ 'nhsuk-button--secondary': secondary },
82-
{ 'nhsuk-button--reverse': reverse },
83-
{ 'nhsuk-button--warning': warning },
84-
{ 'nhsuk-button--login': login },
85-
{ 'nhsuk-button--small': small },
86-
className,
87-
)}
88+
className={getButtonClassNames(props)}
8889
data-module="nhsuk-button"
8990
data-prevent-double-click={preventDoubleClick === true ? 'true' : undefined}
9091
disabled={disabled}
@@ -142,15 +143,7 @@ const ButtonLinkComponent = forwardRef<HTMLAnchorElement, ButtonLinkProps>(
142143

143144
return (
144145
<Element
145-
className={classNames(
146-
'nhsuk-button',
147-
{ 'nhsuk-button--secondary': secondary },
148-
{ 'nhsuk-button--reverse': reverse },
149-
{ 'nhsuk-button--warning': warning },
150-
{ 'nhsuk-button--login': login },
151-
{ 'nhsuk-button--small': small },
152-
className,
153-
)}
146+
className={getButtonClassNames(props)}
154147
data-module="nhsuk-button"
155148
data-prevent-double-click={preventDoubleClick === true ? 'true' : undefined}
156149
role="button"

0 commit comments

Comments
 (0)