Skip to content

Commit da318c2

Browse files
authored
fix(slider): remounted controlled value not updating (#6301)
1 parent ee416da commit da318c2

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

packages/react/src/primitives/SliderField/SliderField.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,10 @@ const SliderFieldPrimitive: Primitive<SliderFieldProps, 'span'> = (
9090
[onChange]
9191
);
9292

93-
const renderedValue = React.useMemo(() => {
94-
const formattedValue = isFunction(formatValue)
95-
? formatValue(currentValue)
96-
: currentValue;
97-
return typeof formatValue === 'string' ? (
98-
<View as="span">{formattedValue}</View>
99-
) : (
100-
formattedValue
101-
);
102-
}, [currentValue, formatValue]);
93+
const realValue = isControlled ? value : currentValue;
94+
const formattedValue = isFunction(formatValue)
95+
? formatValue(realValue)
96+
: realValue;
10397

10498
const isVertical = orientation === 'vertical';
10599
const componentClasses = classNames(
@@ -137,7 +131,13 @@ const SliderFieldPrimitive: Primitive<SliderFieldProps, 'span'> = (
137131
visuallyHidden={labelHidden}
138132
>
139133
<View as="span">{label}</View>
140-
{!isValueHidden ? renderedValue : null}
134+
{!isValueHidden ? (
135+
typeof formatValue === 'string' ? (
136+
<View as="span">{formattedValue}</View>
137+
) : (
138+
formattedValue
139+
)
140+
) : null}
141141
</Label>
142142
<FieldDescription
143143
id={descriptionId}

packages/react/src/primitives/SliderField/__tests__/SliderField.test.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
import { ComponentClassName } from '@aws-amplify/ui';
1818
import { AUTO_GENERATED_ID_PREFIX } from '../../utils/useStableId';
1919
import { ERROR_SUFFIX, DESCRIPTION_SUFFIX } from '../../../helpers/constants';
20+
import { Button } from '../../Button';
2021

2122
// Jest uses JSDom, which apparently doesn't support the ResizeObserver API
2223
// This will get around that API reference error in Jest
@@ -131,7 +132,14 @@ describe('SliderField:', () => {
131132
describe('Slider', () => {
132133
const ControlledSliderField = () => {
133134
const [value, setValue] = React.useState(5);
134-
return <SliderField label="slider" value={value} onChange={setValue} />;
135+
return (
136+
<>
137+
<SliderField label="slider" value={value} onChange={setValue} />
138+
<Button testId="test-button" onClick={() => setValue(10)}>
139+
Set to 10
140+
</Button>
141+
</>
142+
);
135143
};
136144

137145
it('should work as uncontrolled component', async () => {
@@ -151,15 +159,27 @@ describe('SliderField:', () => {
151159
it('should work as controlled component', async () => {
152160
render(<ControlledSliderField />);
153161
const slider = await screen.findByRole('slider');
162+
const label = await screen.findByTestId(SLIDER_LABEL_TEST_ID);
154163
expect(slider).toHaveAttribute('aria-valuenow', '5');
164+
expect(label).toHaveTextContent('5');
155165
fireEvent.keyDown(slider, { key: 'ArrowUp', code: 'ArrowUp' });
156166
expect(slider).toHaveAttribute('aria-valuenow', '6');
167+
expect(label).toHaveTextContent('6');
157168
fireEvent.keyDown(slider, { key: 'ArrowUp', code: 'ArrowUp' });
158169
expect(slider).toHaveAttribute('aria-valuenow', '7');
170+
expect(label).toHaveTextContent('7');
159171
fireEvent.keyDown(slider, { key: 'ArrowDown', code: 'ArrowDown' });
160172
expect(slider).toHaveAttribute('aria-valuenow', '6');
173+
expect(label).toHaveTextContent('6');
161174
fireEvent.keyDown(slider, { key: 'ArrowDown', code: 'ArrowDown' });
162175
expect(slider).toHaveAttribute('aria-valuenow', '5');
176+
expect(label).toHaveTextContent('5');
177+
178+
// External update (remount) should work as well
179+
const button = await screen.findByTestId('test-button');
180+
fireEvent.click(button);
181+
expect(slider).toHaveAttribute('aria-valuenow', '10');
182+
expect(label).toHaveTextContent('10');
163183
});
164184

165185
it('should set step', async () => {

0 commit comments

Comments
 (0)