Skip to content

Commit 511da54

Browse files
committed
Simplify the Button and IconButton code
1 parent f32b04f commit 511da54

4 files changed

Lines changed: 180 additions & 173 deletions

File tree

packages/circuit-ui/components/Button/Button.tsx

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { deprecate } from '../../util/logger.js';
2424

2525
import classes from './Button.module.css';
2626
import {
27-
createButtonComponent,
27+
BaseButton,
2828
legacyButtonSizeMap,
2929
type SharedButtonProps,
3030
} from './base.js';
@@ -59,43 +59,49 @@ export type ButtonProps = SharedButtonProps & {
5959
* The Button component enables the user to perform an action or navigate
6060
* to a different screen.
6161
*/
62-
export const Button = createButtonComponent<ButtonProps>(
63-
'Button',
64-
({ className, size: legacySize = 'm', stretch, variant, ...props }) => {
65-
const size = legacyButtonSizeMap[legacySize] || legacySize;
62+
export function Button({
63+
className,
64+
size: legacySize = 'm',
65+
stretch,
66+
variant,
67+
...props
68+
}: ButtonProps) {
69+
const size = legacyButtonSizeMap[legacySize] || legacySize;
6670

67-
if (
68-
process.env.NODE_ENV !== 'production' &&
69-
process.env.NODE_ENV !== 'test' &&
70-
props.icon &&
71-
props.navigationIcon
72-
) {
73-
throw new CircuitError(
74-
'Button',
75-
'The leading and trailing icons cannot be used at the same time. Remove either the `icon` or the `navigationIcon` prop.',
76-
);
77-
}
71+
if (
72+
process.env.NODE_ENV !== 'production' &&
73+
process.env.NODE_ENV !== 'test' &&
74+
props.icon &&
75+
props.navigationIcon
76+
) {
77+
throw new CircuitError(
78+
'Button',
79+
'The leading and trailing icons cannot be used at the same time. Remove either the `icon` or the `navigationIcon` prop.',
80+
);
81+
}
7882

79-
if (
80-
process.env.NODE_ENV !== 'production' &&
81-
legacyButtonSizeMap[legacySize]
82-
) {
83-
deprecate(
84-
'Button',
85-
`The \`${legacySize}\` size has been deprecated. Use the \`${legacyButtonSizeMap[legacySize]}\` size instead.`,
86-
);
87-
}
83+
if (
84+
process.env.NODE_ENV !== 'production' &&
85+
legacyButtonSizeMap[legacySize]
86+
) {
87+
deprecate(
88+
'Button',
89+
`The \`${legacySize}\` size has been deprecated. Use the \`${legacyButtonSizeMap[legacySize]}\` size instead.`,
90+
);
91+
}
8892

89-
return {
90-
className: clsx(
93+
return (
94+
<BaseButton
95+
componentName="Button"
96+
className={clsx(
9197
className,
9298
classes[size],
9399
stretch && classes.stretch,
94100
variant === 'tertiary' && classes.tertiary,
95-
),
96-
variant,
97-
size,
98-
...props,
99-
};
100-
},
101-
);
101+
)}
102+
variant={variant}
103+
size={size}
104+
{...props}
105+
/>
106+
);
107+
}

packages/circuit-ui/components/Button/IconButton.tsx

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { CircuitError } from '../../util/errors.js';
2222
import { deprecate } from '../../util/logger.js';
2323

2424
import {
25-
createButtonComponent,
25+
BaseButton,
2626
legacyButtonSizeMap,
2727
type SharedButtonProps,
2828
} from './base.js';
@@ -47,31 +47,35 @@ export type IconButtonProps = SharedButtonProps & {
4747
* The IconButton component enables the user to perform an action or navigate
4848
* to a different screen.
4949
*/
50-
export const IconButton = createButtonComponent<IconButtonProps>(
51-
'IconButton',
52-
({ className, size: legacySize = 'm', ...props }) => {
53-
const size = legacyButtonSizeMap[legacySize] || legacySize;
50+
export function IconButton({
51+
className,
52+
size: legacySize = 'm',
53+
...props
54+
}: IconButtonProps) {
55+
const size = legacyButtonSizeMap[legacySize] || legacySize;
5456

55-
if (process.env.NODE_ENV !== 'production' && !props.icon) {
56-
throw new CircuitError('IconButton', 'The `icon` prop is missing.');
57-
}
57+
if (process.env.NODE_ENV !== 'production' && !props.icon) {
58+
throw new CircuitError('IconButton', 'The `icon` prop is missing.');
59+
}
5860

59-
if (
60-
process.env.NODE_ENV !== 'production' &&
61-
legacyButtonSizeMap[legacySize]
62-
) {
63-
deprecate(
64-
'IconButton',
65-
`The \`${legacySize}\` size has been deprecated. Use the \`${legacyButtonSizeMap[legacySize]}\` size instead.`,
66-
);
67-
}
61+
if (
62+
process.env.NODE_ENV !== 'production' &&
63+
legacyButtonSizeMap[legacySize]
64+
) {
65+
deprecate(
66+
'IconButton',
67+
`The \`${legacySize}\` size has been deprecated. Use the \`${legacyButtonSizeMap[legacySize]}\` size instead.`,
68+
);
69+
}
6870

69-
return {
70-
className: clsx(classes.base, classes[size], className),
71-
size,
72-
title: props.children,
73-
'aria-label': props.children,
74-
...props,
75-
};
76-
},
77-
);
71+
return (
72+
<BaseButton
73+
componentName="IconButton"
74+
className={clsx(classes.base, classes[size], className)}
75+
size={size}
76+
title={props.children}
77+
aria-label={props.children}
78+
{...props}
79+
/>
80+
);
81+
}

packages/circuit-ui/components/Button/base.spec.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ import { createRef } from 'react';
1818

1919
import { render, axe, userEvent, screen } from '../../util/test-utils.js';
2020

21-
import { createButtonComponent, type SharedButtonProps } from './base.js';
22-
23-
const Button = createButtonComponent<SharedButtonProps>(
24-
'TestButton',
25-
(props) => ({ ...props, children: 'Button', size: 'm' }),
26-
);
21+
import { BaseButton, type SharedButtonProps } from './base.js';
22+
23+
function Button({ size, ...props }: SharedButtonProps) {
24+
return (
25+
<BaseButton componentName="TestButton" size="m" {...props}>
26+
Button
27+
</BaseButton>
28+
);
29+
}
2730

2831
describe('Button', () => {
2932
it('should merge a custom class name with the default ones', () => {

0 commit comments

Comments
 (0)