Skip to content

Commit 9e34510

Browse files
committed
cleanup
1 parent 7476250 commit 9e34510

1 file changed

Lines changed: 56 additions & 73 deletions

File tree

packages/mui-material/src/Slider/useSlider.ts

Lines changed: 56 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function findClosest(values: number[], currentValue: number) {
4242
(acc, value: number, index: number) => {
4343
const distance = Math.abs(currentValue - value);
4444

45-
if (acc == null || distance < acc.distance || distance === acc.distance) {
45+
if (acc == null || distance <= acc.distance) {
4646
return {
4747
distance,
4848
index,
@@ -109,31 +109,18 @@ function roundValueToStep(value: number, step: number, min: number) {
109109
return Number(nearest.toFixed(getDecimalPrecision(step)));
110110
}
111111

112-
function setValueIndex({
113-
values,
114-
newValue,
115-
index,
116-
}: {
117-
values: number[];
118-
newValue: number;
119-
index: number;
120-
}) {
112+
function setValueIndex(values: number[], newValue: number, index: number) {
121113
const output = values.slice();
122114
output[index] = newValue;
123115
return output.sort(asc);
124116
}
125117

126-
function focusThumb({
127-
sliderRef,
128-
activeIndex,
129-
setActive,
130-
focusVisible,
131-
}: {
132-
sliderRef: React.RefObject<any>;
133-
activeIndex: number;
134-
setActive?: ((num: number) => void) | undefined;
135-
focusVisible?: boolean | undefined;
136-
}) {
118+
function focusThumb(
119+
sliderRef: React.RefObject<any>,
120+
activeIndex: number,
121+
setActive?: ((num: number) => void) | undefined,
122+
focusVisible?: boolean | undefined,
123+
) {
137124
const doc = ownerDocument(sliderRef.current);
138125
if (
139126
!sliderRef.current?.contains(doc.activeElement) ||
@@ -271,21 +258,38 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
271258

272259
const range = Array.isArray(valueDerived);
273260
const values = React.useMemo(() => {
274-
const raw = range ? (valueDerived as number[]).slice().sort(asc) : [valueDerived as number];
275-
return raw.map((value) => (value == null ? min : clamp(value, min, max)));
276-
}, [valueDerived, range, min, max]);
277-
278-
const marks = React.useMemo<readonly Mark[]>(
279-
() =>
280-
marksProp === true && step != null
281-
? [...Array(Math.floor((max - min) / step) + 1)].map((_, index) => ({
282-
value: min + step * index,
283-
}))
284-
: ((marksProp || EMPTY_MARKS) as readonly Mark[]),
285-
[marksProp, step, min, max],
286-
);
261+
if (!Array.isArray(valueDerived)) {
262+
return [valueDerived == null ? min : clamp(valueDerived, min, max)];
263+
}
264+
265+
const values = valueDerived.slice().sort(asc);
266+
for (let i = 0; i < values.length; i += 1) {
267+
const value = values[i];
268+
values[i] = value == null ? min : clamp(value, min, max);
269+
}
270+
271+
return values;
272+
}, [valueDerived, min, max]);
273+
274+
const marks = React.useMemo<readonly Mark[]>(() => {
275+
if (marksProp === true && step != null) {
276+
const marks = new Array<Mark>(Math.floor((max - min) / step) + 1);
277+
for (let i = 0; i < marks.length; i += 1) {
278+
marks[i] = { value: min + step * i };
279+
}
280+
return marks;
281+
}
282+
283+
return Array.isArray(marksProp) ? marksProp : EMPTY_MARKS;
284+
}, [marksProp, step, min, max]);
287285

288-
const marksValues = React.useMemo(() => marks.map((mark) => mark.value), [marks]);
286+
const marksValues = React.useMemo(() => {
287+
const values = new Array<number>(marks.length);
288+
for (let i = 0; i < marks.length; i += 1) {
289+
values[i] = marks[i].value;
290+
}
291+
return values;
292+
}, [marks]);
289293

290294
const [focusedThumbIndex, setFocusedThumbIndex] = React.useState(-1);
291295

@@ -336,11 +340,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
336340
}
337341

338342
const previousValue = newValue;
339-
newValue = setValueIndex({
340-
values,
341-
newValue,
342-
index,
343-
});
343+
newValue = setValueIndex(values, newValue, index);
344344

345345
let activeIndex = index;
346346

@@ -349,7 +349,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
349349
activeIndex = newValue.indexOf(previousValue);
350350
}
351351

352-
focusThumb({ sliderRef, activeIndex });
352+
focusThumb(sliderRef, activeIndex);
353353
}
354354

355355
setValueState(newValue);
@@ -530,11 +530,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
530530
}
531531

532532
const previousValue = newValue;
533-
newValue = setValueIndex({
534-
values,
535-
newValue,
536-
index: activeIndex,
537-
});
533+
newValue = setValueIndex(values, newValue, activeIndex);
538534

539535
// Potentially swap the index if needed.
540536
if (!(disableSwap && isDragging)) {
@@ -573,12 +569,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
573569
return;
574570
}
575571

576-
focusThumb({
577-
sliderRef,
578-
activeIndex: newFingerValue.activeIndex,
579-
setActive,
580-
focusVisible: false,
581-
});
572+
focusThumb(sliderRef, newFingerValue.activeIndex, setActive, false);
582573
lastUsedThumbIndexRef.current = newFingerValue.activeIndex;
583574
setValueState(newFingerValue.newValue);
584575

@@ -656,12 +647,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
656647
previousIndexRef.current = -1;
657648
const newFingerValue = getValueAtFinger(finger);
658649
if (newFingerValue) {
659-
focusThumb({
660-
sliderRef,
661-
activeIndex: newFingerValue.activeIndex,
662-
setActive,
663-
focusVisible: false,
664-
});
650+
focusThumb(sliderRef, newFingerValue.activeIndex, setActive, false);
665651
lastUsedThumbIndexRef.current = newFingerValue.activeIndex;
666652

667653
setValueState(newFingerValue.newValue);
@@ -745,11 +731,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
745731
cancelFocusFrame();
746732
focusFrameRef.current = requestAnimationFrame(() => {
747733
focusFrameRef.current = null;
748-
focusThumb({
749-
sliderRef,
750-
activeIndex: newFingerValue.activeIndex,
751-
focusVisible: false,
752-
});
734+
focusThumb(sliderRef, newFingerValue.activeIndex, undefined, false);
753735
});
754736
}
755737

@@ -785,10 +767,10 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
785767
const getRootProps = <ExternalProps extends Record<string, unknown> = {}>(
786768
externalProps: ExternalProps = {} as ExternalProps,
787769
): UseSliderRootSlotProps<ExternalProps> => {
788-
const externalHandlers = extractEventHandlers(externalProps);
770+
const externalHandlers = extractEventHandlers(externalProps) || EMPTY_OBJ;
789771

790772
const ownEventHandlers = {
791-
onPointerDown: createHandlePointerDown(externalHandlers || EMPTY_OBJ),
773+
onPointerDown: createHandlePointerDown(externalHandlers),
792774
};
793775

794776
const mergedEventHandlers = {
@@ -821,11 +803,11 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
821803
const getThumbProps = <ExternalProps extends Record<string, unknown> = {}>(
822804
externalProps: ExternalProps = {} as ExternalProps,
823805
): UseSliderThumbSlotProps<ExternalProps> => {
824-
const externalHandlers = extractEventHandlers(externalProps);
806+
const externalHandlers = extractEventHandlers(externalProps) || EMPTY_OBJ;
825807

826808
const ownEventHandlers = {
827-
onMouseOver: createHandleMouseOver(externalHandlers || EMPTY_OBJ),
828-
onMouseLeave: createHandleMouseLeave(externalHandlers || EMPTY_OBJ),
809+
onMouseOver: createHandleMouseOver(externalHandlers),
810+
onMouseLeave: createHandleMouseLeave(externalHandlers),
829811
};
830812

831813
return {
@@ -846,6 +828,7 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
846828
} else if (active === index) {
847829
zIndex = 1;
848830
}
831+
849832
return {
850833
// So the non active thumb doesn't show its label on hover.
851834
pointerEvents: active !== -1 && active !== index ? 'none' : undefined,
@@ -861,13 +844,13 @@ export function useSlider(parameters: UseSliderParameters): UseSliderReturnValue
861844
const getHiddenInputProps = <ExternalProps extends Record<string, unknown> = {}>(
862845
externalProps: ExternalProps = {} as ExternalProps,
863846
): UseSliderHiddenInputProps<ExternalProps> => {
864-
const externalHandlers = extractEventHandlers(externalProps);
847+
const externalHandlers = extractEventHandlers(externalProps) || EMPTY_OBJ;
865848

866849
const ownEventHandlers = {
867-
onChange: createHandleHiddenInputChange(externalHandlers || EMPTY_OBJ),
868-
onFocus: createHandleHiddenInputFocus(externalHandlers || EMPTY_OBJ),
869-
onBlur: createHandleHiddenInputBlur(externalHandlers || EMPTY_OBJ),
870-
onKeyDown: createHandleHiddenInputKeyDown(externalHandlers || EMPTY_OBJ),
850+
onChange: createHandleHiddenInputChange(externalHandlers),
851+
onFocus: createHandleHiddenInputFocus(externalHandlers),
852+
onBlur: createHandleHiddenInputBlur(externalHandlers),
853+
onKeyDown: createHandleHiddenInputKeyDown(externalHandlers),
871854
};
872855

873856
const mergedEventHandlers = {

0 commit comments

Comments
 (0)