Skip to content

Commit d640796

Browse files
committed
fix slider lint issues
1 parent 0e4e031 commit d640796

13 files changed

Lines changed: 104 additions & 75 deletions

File tree

docs/examples/components/TooltipSlider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface HandleTooltipProps {
1616
const HandleTooltip: React.FC<HandleTooltipProps> = (props) => {
1717
const { value, children, visible, tipFormatter = (val) => `${val} %`, ...restProps } = props;
1818

19-
const tooltipRef = React.useRef<TooltipRef>();
19+
const tooltipRef = React.useRef<TooltipRef>(null);
2020
const rafRef = React.useRef<number | null>(null);
2121

2222
function cancelKeepAlign() {

docs/examples/slider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class NullableSlider extends React.Component<any, any> {
6060
}
6161

6262
const NullableRangeSlider = () => {
63-
const [value, setValue] = React.useState(null);
63+
const [value, setValue] = React.useState<number | number[] | null>(null);
6464

6565
return (
6666
<div>

src/Handles/Handle.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { OnStartMove } from '../interface';
66
import { getDirectionStyle, getIndex } from '../util';
77

88
interface RenderProps {
9-
index: number;
9+
index: number | null;
1010
prefixCls: string;
1111
value: number;
1212
dragging: boolean;
@@ -18,7 +18,7 @@ export interface HandleProps
1818
prefixCls: string;
1919
style?: React.CSSProperties;
2020
value: number;
21-
valueIndex: number;
21+
valueIndex: number | null;
2222
dragging: boolean;
2323
draggingDelete: boolean;
2424
onStartMove: OnStartMove;
@@ -71,23 +71,27 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
7171

7272
// ============================ Events ============================
7373
const onInternalStartMove = (e: React.MouseEvent | React.TouchEvent) => {
74-
if (!disabled) {
74+
if (!disabled && valueIndex !== null) {
7575
onStartMove(e, valueIndex);
7676
}
7777
};
7878

7979
const onInternalFocus = (e: React.FocusEvent<HTMLDivElement>) => {
80-
onFocus?.(e, valueIndex);
80+
if (valueIndex !== null) {
81+
onFocus?.(e, valueIndex);
82+
}
8183
};
8284

8385
const onInternalMouseEnter = (e: React.MouseEvent<HTMLDivElement>) => {
84-
onMouseEnter(e, valueIndex);
86+
if (valueIndex !== null) {
87+
onMouseEnter(e, valueIndex);
88+
}
8589
};
8690

8791
// =========================== Keyboard ===========================
8892
const onKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (e) => {
89-
if (!disabled && keyboard) {
90-
let offset: number | 'min' | 'max' = null;
93+
if (!disabled && keyboard && valueIndex !== null) {
94+
let offset: number | 'min' | 'max' | null = null;
9195

9296
// Change the value
9397
switch (e.which || e.keyCode) {
@@ -161,7 +165,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
161165

162166
if (valueIndex !== null) {
163167
divProps = {
164-
tabIndex: disabled ? null : getIndex(tabIndex, valueIndex),
168+
tabIndex: disabled ? undefined : getIndex(tabIndex, valueIndex) ?? undefined,
165169
role: 'slider',
166170
'aria-valuemin': min,
167171
'aria-valuemax': max,
@@ -187,7 +191,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
187191
className={clsx(
188192
handlePrefixCls,
189193
{
190-
[`${handlePrefixCls}-${valueIndex + 1}`]: valueIndex !== null && range,
194+
...(valueIndex !== null && range ? { [`${handlePrefixCls}-${valueIndex + 1}`]: true } : {}),
191195
[`${handlePrefixCls}-dragging`]: dragging,
192196
[`${handlePrefixCls}-dragging-delete`]: draggingDelete,
193197
},

src/Handles/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ const Handles = React.forwardRef<HandlesRef, HandlesProps>((props, ref) => {
125125
draggingDelete={draggingDelete}
126126
render={activeHandleRender}
127127
style={{ pointerEvents: 'none' }}
128-
tabIndex={null}
128+
tabIndex={undefined}
129129
aria-hidden
130130
/>
131131
)}

src/Marks/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export interface MarksProps {
1717
}
1818

1919
const Marks: React.FC<MarksProps> = (props) => {
20-
const { prefixCls, marks, onClick } = props;
20+
const { prefixCls, marks = [], onClick } = props;
2121

2222
const markPrefixCls = `${prefixCls}-mark`;
2323

src/Slider.tsx

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ export interface SliderProps<ValueType = number | number[]> {
7070
min?: number;
7171
max?: number;
7272
step?: number | null;
73-
value?: ValueType;
74-
defaultValue?: ValueType;
73+
value?: ValueType | null;
74+
defaultValue?: ValueType | null;
7575
onChange?: (value: ValueType) => void;
7676
/** @deprecated It's always better to use `onChange` instead */
7777
onBeforeChange?: (value: ValueType) => void;
@@ -109,7 +109,7 @@ export interface SliderProps<ValueType = number | number[]> {
109109
track?: boolean;
110110

111111
// Accessibility
112-
tabIndex?: number | number[];
112+
tabIndex?: number | null | (number | null)[];
113113
ariaLabelForHandle?: string | string[];
114114
ariaLabelledByForHandle?: string | string[];
115115
ariaRequired?: boolean;
@@ -185,8 +185,8 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
185185
ariaValueTextFormatterForHandle,
186186
} = props;
187187

188-
const handlesRef = React.useRef<HandlesRef>(null);
189-
const containerRef = React.useRef<HTMLDivElement>(null);
188+
const handlesRef = React.useRef<HandlesRef | null>(null);
189+
const containerRef = React.useRef<HTMLDivElement | null>(null);
190190

191191
const direction = React.useMemo<Direction>(() => {
192192
if (vertical) {
@@ -214,9 +214,11 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
214214

215215
// ============================ Marks =============================
216216
const markList = React.useMemo<InternalMarkObj[]>(() => {
217-
return Object.keys(marks || {})
217+
const markRecord = marks || {};
218+
219+
return Object.keys(markRecord)
218220
.map<InternalMarkObj>((key) => {
219-
const mark = marks[key];
221+
const mark = markRecord[key];
220222
const markObj: InternalMarkObj = {
221223
value: Number(key),
222224
};
@@ -269,7 +271,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
269271

270272
// When count provided or value is `undefined`, we fill values
271273
if (count || mergedValue === undefined) {
272-
const pointCount = count >= 0 ? count + 1 : 2;
274+
const pointCount = count !== undefined && count >= 0 ? count + 1 : 2;
273275
returnValues = returnValues.slice(0, pointCount);
274276

275277
// Fill with count
@@ -287,6 +289,8 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
287289

288290
return returnValues;
289291
}, [mergedValue, rangeEnabled, mergedMin, count, formatValue]);
292+
const rawValuesRef = React.useRef(rawValues);
293+
rawValuesRef.current = rawValues;
290294

291295
// =========================== onChange ===========================
292296
const getTriggerValue = (triggerValues: number[]) =>
@@ -308,7 +312,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
308312
const finishChange = useEvent((draggingDelete?: boolean) => {
309313
// Trigger from `useDrag` will tell if it's a delete action
310314
if (draggingDelete) {
311-
handlesRef.current.hideHelp();
315+
handlesRef.current!.hideHelp();
312316
}
313317

314318
const finishValue = getTriggerValue(rawValues);
@@ -332,8 +336,8 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
332336
triggerChange(cloneNextValues);
333337

334338
const nextFocusIndex = Math.max(0, index - 1);
335-
handlesRef.current.hideHelp();
336-
handlesRef.current.focus(nextFocusIndex);
339+
handlesRef.current!.hideHelp();
340+
handlesRef.current!.focus(nextFocusIndex);
337341
};
338342

339343
const [draggingIndex, draggingValue, draggingDelete, cacheValues, onStartDrag] = useDrag(
@@ -349,6 +353,8 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
349353
rangeEditable,
350354
minCount,
351355
);
356+
const draggingValueRef = React.useRef(draggingValue);
357+
draggingValueRef.current = draggingValue;
352358

353359
/**
354360
* When `rangeEditable` will insert a new value in the values array.
@@ -395,7 +401,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
395401

396402
if (e) {
397403
(document.activeElement as HTMLElement)?.blur?.();
398-
handlesRef.current.focus(focusIndex);
404+
handlesRef.current!.focus(focusIndex);
399405
onStartDrag(e, focusIndex, cloneNextValues);
400406
} else {
401407
// https://github.com/ant-design/ant-design/issues/49997
@@ -414,7 +420,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
414420
e.preventDefault();
415421

416422
const { width, height, left, top, bottom, right } =
417-
containerRef.current.getBoundingClientRect();
423+
containerRef.current!.getBoundingClientRect();
418424
const { clientX, clientY } = e;
419425

420426
let percent: number;
@@ -440,7 +446,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
440446
};
441447

442448
// =========================== Keyboard ===========================
443-
const [keyboardValue, setKeyboardValue] = React.useState<number>(null);
449+
const [keyboardValue, setKeyboardValue] = React.useState<number | null>(null);
444450

445451
const onHandleOffsetChange = (offset: number | 'min' | 'max', valueIndex: number) => {
446452
if (!disabled) {
@@ -455,9 +461,9 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
455461

456462
React.useEffect(() => {
457463
if (keyboardValue !== null) {
458-
const valueIndex = rawValues.indexOf(keyboardValue);
464+
const valueIndex = rawValuesRef.current.indexOf(keyboardValue);
459465
if (valueIndex >= 0) {
460-
handlesRef.current.focus(valueIndex);
466+
handlesRef.current!.focus(valueIndex);
461467
}
462468
}
463469

@@ -484,9 +490,9 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
484490
// Auto focus for updated handle
485491
const dragging = draggingIndex !== -1;
486492
React.useEffect(() => {
487-
if (!dragging) {
488-
const valueIndex = rawValues.lastIndexOf(draggingValue);
489-
handlesRef.current.focus(valueIndex);
493+
if (!dragging && draggingValueRef.current !== null && draggingValueRef.current !== undefined) {
494+
const valueIndex = rawValuesRef.current.lastIndexOf(draggingValueRef.current);
495+
handlesRef.current!.focus(valueIndex);
490496
}
491497
}, [dragging]);
492498

@@ -509,7 +515,7 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
509515
// ============================= Refs =============================
510516
React.useImperativeHandle(ref, () => ({
511517
focus: () => {
512-
handlesRef.current.focus(0);
518+
handlesRef.current!.focus(0);
513519
},
514520
blur: () => {
515521
const { activeElement } = document;
@@ -520,9 +526,10 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
520526
}));
521527

522528
// ========================== Auto Focus ==========================
529+
const autoFocusRef = React.useRef(autoFocus);
523530
React.useEffect(() => {
524-
if (autoFocus) {
525-
handlesRef.current.focus(0);
531+
if (autoFocusRef.current) {
532+
handlesRef.current!.focus(0);
526533
}
527534
}, []);
528535

src/Tracks/Track.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export interface TrackProps {
1111
replaceCls?: string;
1212
start: number;
1313
end: number;
14-
index: number;
14+
index: number | null;
1515
onStartMove?: OnStartMove;
1616
}
1717

@@ -60,7 +60,7 @@ const Track: React.FC<TrackProps> = (props) => {
6060
clsx(
6161
trackPrefixCls,
6262
{
63-
[`${trackPrefixCls}-${index + 1}`]: index !== null && range,
63+
...(index !== null && range ? { [`${trackPrefixCls}-${index + 1}`]: true } : {}),
6464
[`${prefixCls}-track-draggable`]: onStartMove,
6565
},
6666
classNames.track,

src/context.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface SliderContextProps {
1212
included?: boolean;
1313
step: number | null;
1414
range?: boolean;
15-
tabIndex: number | number[];
15+
tabIndex: number | null | (number | null)[];
1616
ariaLabelForHandle?: string | string[];
1717
ariaLabelledByForHandle?: string | string[];
1818
ariaRequired?: boolean;
@@ -40,13 +40,13 @@ export interface UnstableContextProps {
4040
onDragStart?: (info: {
4141
rawValues: number[];
4242
draggingIndex: number;
43-
draggingValue: number;
43+
draggingValue?: number;
4444
}) => void;
4545
onDragChange?: (info: {
4646
rawValues: number[];
4747
deleteIndex: number;
4848
draggingIndex: number;
49-
draggingValue: number;
49+
draggingValue?: number;
5050
}) => void;
5151
}
5252

0 commit comments

Comments
 (0)