Skip to content

Commit 00001fb

Browse files
committed
Use useRenderElement
1 parent 2c4a9a2 commit 00001fb

File tree

6 files changed

+51
-74
lines changed

6 files changed

+51
-74
lines changed

packages/react/src/progress/indicator/ProgressIndicator.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
'use client';
22
import * as React from 'react';
33
import PropTypes from 'prop-types';
4-
import { mergeProps } from '../../merge-props';
5-
import { useComponentRenderer } from '../../utils/useComponentRenderer';
4+
import { useRenderElement } from '../../utils/useRenderElement';
65
import { valueToPercent } from '../../utils/valueToPercent';
76
import type { ProgressRoot } from '../root/ProgressRoot';
87
import { useProgressRootContext } from '../root/ProgressRootContext';
@@ -19,7 +18,7 @@ const ProgressIndicator = React.forwardRef(function ProgressIndicator(
1918
props: ProgressIndicator.Props,
2019
forwardedRef: React.ForwardedRef<HTMLDivElement>,
2120
) {
22-
const { render, className, ...otherProps } = props;
21+
const { render, className, ...elementProps } = props;
2322

2423
const { max, min, value, state } = useProgressRootContext();
2524

@@ -38,17 +37,15 @@ const ProgressIndicator = React.forwardRef(function ProgressIndicator(
3837
};
3938
}, [percentageValue]);
4039

41-
const { renderElement } = useComponentRenderer({
42-
render: render ?? 'div',
40+
const renderElement = useRenderElement('div', props, {
4341
state,
44-
className,
4542
ref: forwardedRef,
46-
extraProps: mergeProps<'div'>(
43+
props: [
4744
{
4845
style: getStyles(),
4946
},
50-
otherProps,
51-
),
47+
elementProps,
48+
],
5249
customStyleHookMapping: progressStyleHookMapping,
5350
});
5451

packages/react/src/progress/label/ProgressLabel.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
'use client';
22
import * as React from 'react';
33
import PropTypes from 'prop-types';
4-
import { mergeProps } from '../../merge-props';
54
import { useBaseUiId } from '../../utils/useBaseUiId';
6-
import { useComponentRenderer } from '../../utils/useComponentRenderer';
5+
import { useRenderElement } from '../../utils/useRenderElement';
76
import { useEnhancedEffect } from '../../utils/useEnhancedEffect';
87
import { useProgressRootContext } from '../root/ProgressRootContext';
98
import { progressStyleHookMapping } from '../root/styleHooks';
@@ -20,7 +19,7 @@ const ProgressLabel = React.forwardRef(function ProgressLabel(
2019
props: ProgressLabel.Props,
2120
forwardedRef: React.ForwardedRef<HTMLSpanElement>,
2221
) {
23-
const { render, className, id: idProp, ...otherProps } = props;
22+
const { render, className, id: idProp, ...elementProps } = props;
2423

2524
const id = useBaseUiId(idProp);
2625

@@ -31,12 +30,15 @@ const ProgressLabel = React.forwardRef(function ProgressLabel(
3130
return () => setLabelId(undefined);
3231
}, [id, setLabelId]);
3332

34-
const { renderElement } = useComponentRenderer({
35-
render: render ?? 'span',
33+
const renderElement = useRenderElement('span', props, {
3634
state,
37-
className,
3835
ref: forwardedRef,
39-
extraProps: mergeProps<'span'>({ id }, otherProps),
36+
props: [
37+
{
38+
id,
39+
},
40+
elementProps,
41+
],
4042
customStyleHookMapping: progressStyleHookMapping,
4143
});
4244

packages/react/src/progress/root/ProgressRoot.tsx

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
import * as React from 'react';
33
import PropTypes from 'prop-types';
44
import { formatNumber } from '../../utils/formatNumber';
5-
import { mergeProps } from '../../merge-props';
6-
import { useComponentRenderer } from '../../utils/useComponentRenderer';
5+
import { useRenderElement } from '../../utils/useRenderElement';
76
import { useLatestRef } from '../../utils/useLatestRef';
87
import { ProgressRootContext } from './ProgressRootContext';
98
import { progressStyleHookMapping } from './styleHooks';
@@ -52,7 +51,7 @@ const ProgressRoot = React.forwardRef(function ProgressRoot(
5251
value,
5352
render,
5453
className,
55-
...otherProps
54+
...elementProps
5655
} = props;
5756

5857
const [labelId, setLabelId] = React.useState<string | undefined>();
@@ -85,31 +84,22 @@ const ProgressRoot = React.forwardRef(function ProgressRoot(
8584
[formattedValue, max, min, setLabelId, state, status, value],
8685
);
8786

88-
const propGetter = React.useCallback(
89-
(externalProps = {}) =>
90-
mergeProps<'div'>(
91-
{
92-
'aria-labelledby': labelId,
93-
'aria-valuemax': max,
94-
'aria-valuemin': min,
95-
'aria-valuenow': value ?? undefined,
96-
'aria-valuetext': getAriaValueText
97-
? getAriaValueText(formattedValue, value)
98-
: (otherProps['aria-valuetext'] ?? getDefaultAriaValueText(formattedValue, value)),
99-
role: 'progressbar',
100-
},
101-
otherProps,
102-
externalProps,
103-
),
104-
[formattedValue, getAriaValueText, labelId, max, min, otherProps, value],
105-
);
106-
107-
const { renderElement } = useComponentRenderer({
108-
propGetter,
109-
render: render ?? 'div',
87+
const renderElement = useRenderElement('div', props, {
11088
state,
111-
className,
11289
ref: forwardedRef,
90+
props: [
91+
{
92+
'aria-labelledby': labelId,
93+
'aria-valuemax': max,
94+
'aria-valuemin': min,
95+
'aria-valuenow': value ?? undefined,
96+
'aria-valuetext': getAriaValueText
97+
? getAriaValueText(formattedValue, value)
98+
: (props['aria-valuetext'] ?? getDefaultAriaValueText(formattedValue, value)),
99+
role: 'progressbar',
100+
},
101+
elementProps,
102+
],
113103
customStyleHookMapping: progressStyleHookMapping,
114104
});
115105

packages/react/src/progress/track/ProgressTrack.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use client';
22
import * as React from 'react';
33
import PropTypes from 'prop-types';
4-
import { useComponentRenderer } from '../../utils/useComponentRenderer';
4+
import { useRenderElement } from '../../utils/useRenderElement';
55
import { useProgressRootContext } from '../root/ProgressRootContext';
66
import { progressStyleHookMapping } from '../root/styleHooks';
77
import type { ProgressRoot } from '../root/ProgressRoot';
@@ -17,16 +17,14 @@ const ProgressTrack = React.forwardRef(function ProgressTrack(
1717
props: ProgressTrack.Props,
1818
forwardedRef: React.ForwardedRef<HTMLDivElement>,
1919
) {
20-
const { render, className, ...otherProps } = props;
20+
const { render, className, ...elementProps } = props;
2121

2222
const { state } = useProgressRootContext();
2323

24-
const { renderElement } = useComponentRenderer({
25-
render: render ?? 'div',
24+
const renderElement = useRenderElement('div', props, {
2625
state,
27-
className,
2826
ref: forwardedRef,
29-
extraProps: otherProps,
27+
props: elementProps,
3028
customStyleHookMapping: progressStyleHookMapping,
3129
});
3230

packages/react/src/progress/value/ProgressValue.tsx

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
'use client';
22
import * as React from 'react';
33
import PropTypes from 'prop-types';
4-
import { mergeProps } from '../../merge-props';
54
import type { BaseUIComponentProps } from '../../utils/types';
6-
import { useComponentRenderer } from '../../utils/useComponentRenderer';
5+
import { useRenderElement } from '../../utils/useRenderElement';
76
import { useProgressRootContext } from '../root/ProgressRootContext';
87
import type { ProgressRoot } from '../root/ProgressRoot';
98
import { progressStyleHookMapping } from '../root/styleHooks';
@@ -17,35 +16,26 @@ const ProgressValue = React.forwardRef(function ProgressValue(
1716
props: ProgressValue.Props,
1817
forwardedRef: React.ForwardedRef<HTMLSpanElement>,
1918
) {
20-
const { className, render, children, ...otherProps } = props;
19+
const { className, render, children, ...elementProps } = props;
2120

2221
const { value, formattedValue, state } = useProgressRootContext();
2322

24-
const getValueProps = React.useCallback(
25-
(externalProps = {}) => {
26-
const formattedValueArg = value == null ? 'indeterminate' : formattedValue;
27-
const formattedValueDisplay = value == null ? null : formattedValue;
28-
return mergeProps(
29-
{
30-
'aria-hidden': true,
31-
children:
32-
typeof children === 'function'
33-
? children(formattedValueArg, value)
34-
: formattedValueDisplay,
35-
},
36-
externalProps,
37-
);
38-
},
39-
[children, value, formattedValue],
40-
);
23+
const formattedValueArg = value == null ? 'indeterminate' : formattedValue;
24+
const formattedValueDisplay = value == null ? null : formattedValue;
4125

42-
const { renderElement } = useComponentRenderer({
43-
propGetter: getValueProps,
44-
render: render ?? 'span',
45-
className,
26+
const renderElement = useRenderElement('span', props, {
4627
state,
4728
ref: forwardedRef,
48-
extraProps: otherProps,
29+
props: [
30+
{
31+
'aria-hidden': true,
32+
children:
33+
typeof children === 'function'
34+
? children(formattedValueArg, value)
35+
: formattedValueDisplay,
36+
},
37+
elementProps,
38+
],
4939
customStyleHookMapping: progressStyleHookMapping,
5040
});
5141

packages/react/src/utils/useRenderElement.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export namespace useRenderElement {
113113
/**
114114
* The render prop or React element to override the default element.
115115
*/
116-
render:
116+
render?:
117117
| undefined
118118
| ComponentRenderFn<React.HTMLAttributes<any>, State>
119119
| React.ReactElement<Record<string, unknown>>;

0 commit comments

Comments
 (0)