Skip to content

Commit 61cd367

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

11 files changed

Lines changed: 86 additions & 62 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<any>(null);
6464

6565
return (
6666
<div>

src/Handles/Handle.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
8787
// =========================== Keyboard ===========================
8888
const onKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (e) => {
8989
if (!disabled && keyboard) {
90-
let offset: number | 'min' | 'max' = null;
90+
let offset: number | 'min' | 'max' | undefined;
9191

9292
// Change the value
9393
switch (e.which || e.keyCode) {
@@ -131,7 +131,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
131131
break;
132132
}
133133

134-
if (offset !== null) {
134+
if (offset !== undefined) {
135135
e.preventDefault();
136136
onOffsetChange(offset, valueIndex);
137137
}
@@ -161,7 +161,7 @@ const Handle = React.forwardRef<HTMLDivElement, HandleProps>((props, ref) => {
161161

162162
if (valueIndex !== null) {
163163
divProps = {
164-
tabIndex: disabled ? null : getIndex(tabIndex, valueIndex),
164+
tabIndex: disabled ? undefined : getIndex(tabIndex, valueIndex) ?? undefined,
165165
role: 'slider',
166166
'aria-valuemin': min,
167167
'aria-valuemax': max,

src/Handles/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ const Handles = React.forwardRef<HandlesRef, HandlesProps>((props, ref) => {
120120
key="a11y"
121121
{...handleProps}
122122
value={values[activeIndex]}
123-
valueIndex={null}
123+
valueIndex={null!}
124124
dragging={draggingIndex !== -1}
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: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};
@@ -243,10 +245,10 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
243245
const [formatValue, offsetValues] = useOffset(
244246
mergedMin,
245247
mergedMax,
246-
mergedStep,
248+
mergedStep as number,
247249
markList,
248250
allowCross,
249-
mergedPush,
251+
mergedPush as false | number,
250252
);
251253

252254
// ============================ Values ============================
@@ -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>(Number.NaN);
444450

445451
const onHandleOffsetChange = (offset: number | 'min' | 'max', valueIndex: number) => {
446452
if (!disabled) {
@@ -454,14 +460,14 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
454460
};
455461

456462
React.useEffect(() => {
457-
if (keyboardValue !== null) {
458-
const valueIndex = rawValues.indexOf(keyboardValue);
463+
if (!Number.isNaN(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

464-
setKeyboardValue(null);
470+
setKeyboardValue(Number.NaN);
465471
}, [keyboardValue]);
466472

467473
// ============================= Drag =============================
@@ -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 && !Number.isNaN(draggingValueRef.current)) {
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/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const Tracks: React.FC<TrackProps> = (props) => {
4949
const tracksNode =
5050
trackList?.length && (classNames.tracks || styles.tracks) ? (
5151
<Track
52-
index={null}
52+
index={null!}
5353
prefixCls={prefixCls}
5454
start={trackList[0].start}
5555
end={trackList[trackList.length - 1].end}

src/hooks/useDrag.ts

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function getPosition(e: React.MouseEvent | React.TouchEvent | MouseEvent | Touch
1515
}
1616

1717
function useDrag(
18-
containerRef: React.RefObject<HTMLDivElement>,
18+
containerRef: React.RefObject<HTMLDivElement | null>,
1919
direction: Direction,
2020
rawValues: number[],
2121
min: number,
@@ -33,15 +33,15 @@ function useDrag(
3333
returnValues: number[],
3434
onStartMove: OnStartMove,
3535
] {
36-
const [draggingValue, setDraggingValue] = React.useState(null);
36+
const [draggingValue, setDraggingValue] = React.useState<number>(Number.NaN);
3737
const [draggingIndex, setDraggingIndex] = React.useState(-1);
3838
const [draggingDelete, setDraggingDelete] = React.useState(false);
3939
const [cacheValues, setCacheValues] = React.useState(rawValues);
4040
const [originValues, setOriginValues] = React.useState(rawValues);
4141

42-
const mouseMoveEventRef = React.useRef<(event: MouseEvent) => void>(null);
43-
const mouseUpEventRef = React.useRef<(event: MouseEvent) => void>(null);
44-
const touchEventTargetRef = React.useRef<EventTarget>(null);
42+
const mouseMoveEventRef = React.useRef<EventListener | null>(null);
43+
const mouseUpEventRef = React.useRef<EventListener | null>(null);
44+
const touchEventTargetRef = React.useRef<EventTarget | null>(null);
4545

4646
const { onDragStart, onDragChange } = React.useContext(UnstableContext);
4747

@@ -54,11 +54,19 @@ function useDrag(
5454
// Clean up event
5555
React.useEffect(
5656
() => () => {
57-
document.removeEventListener('mousemove', mouseMoveEventRef.current);
58-
document.removeEventListener('mouseup', mouseUpEventRef.current);
57+
if (mouseMoveEventRef.current) {
58+
document.removeEventListener('mousemove', mouseMoveEventRef.current);
59+
}
60+
if (mouseUpEventRef.current) {
61+
document.removeEventListener('mouseup', mouseUpEventRef.current);
62+
}
5963
if (touchEventTargetRef.current) {
60-
touchEventTargetRef.current.removeEventListener('touchmove', mouseMoveEventRef.current);
61-
touchEventTargetRef.current.removeEventListener('touchend', mouseUpEventRef.current);
64+
if (mouseMoveEventRef.current) {
65+
touchEventTargetRef.current.removeEventListener('touchmove', mouseMoveEventRef.current);
66+
}
67+
if (mouseUpEventRef.current) {
68+
touchEventTargetRef.current.removeEventListener('touchend', mouseUpEventRef.current);
69+
}
6270
}
6371
},
6472
[],
@@ -82,7 +90,7 @@ function useDrag(
8290
rawValues: nextValues,
8391
deleteIndex: deleteMark ? draggingIndex : -1,
8492
draggingIndex,
85-
draggingValue: nextValue,
93+
draggingValue: nextValue as number,
8694
});
8795
}
8896
};
@@ -149,14 +157,14 @@ function useDrag(
149157
}
150158

151159
// Moving
152-
const onMouseMove = (event: MouseEvent | TouchEvent) => {
160+
const onMouseMove: EventListener = (event) => {
153161
event.preventDefault();
154162

155-
const { pageX: moveX, pageY: moveY } = getPosition(event);
163+
const { pageX: moveX, pageY: moveY } = getPosition(event as MouseEvent | TouchEvent);
156164
const offsetX = moveX - startX;
157165
const offsetY = moveY - startY;
158166

159-
const { width, height } = containerRef.current.getBoundingClientRect();
167+
const { width, height } = containerRef.current!.getBoundingClientRect();
160168

161169
let offSetPercent: number;
162170
let removeDist: number;
@@ -192,14 +200,18 @@ function useDrag(
192200
};
193201

194202
// End
195-
const onMouseUp = (event: MouseEvent | TouchEvent) => {
203+
const onMouseUp: EventListener = (event) => {
196204
event.preventDefault();
197205

198206
document.removeEventListener('mouseup', onMouseUp);
199207
document.removeEventListener('mousemove', onMouseMove);
200208
if (touchEventTargetRef.current) {
201-
touchEventTargetRef.current.removeEventListener('touchmove', mouseMoveEventRef.current);
202-
touchEventTargetRef.current.removeEventListener('touchend', mouseUpEventRef.current);
209+
if (mouseMoveEventRef.current) {
210+
touchEventTargetRef.current.removeEventListener('touchmove', mouseMoveEventRef.current);
211+
}
212+
if (mouseUpEventRef.current) {
213+
touchEventTargetRef.current.removeEventListener('touchend', mouseUpEventRef.current);
214+
}
203215
}
204216
mouseMoveEventRef.current = null;
205217
mouseUpEventRef.current = null;

src/hooks/useOffset.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ export default function useOffset(
5252
const maxDecimal = Math.max(getDecimal(step), getDecimal(max), getDecimal(min));
5353
const fixedValue = Number(stepValue.toFixed(maxDecimal));
5454

55-
return min <= fixedValue && fixedValue <= max ? fixedValue : null;
55+
return min <= fixedValue && fixedValue <= max ? fixedValue : null!;
5656
}
57-
return null;
57+
return null!;
5858
},
5959
[step, min, max, formatRangeValue],
6060
);
@@ -168,6 +168,9 @@ export default function useOffset(
168168
} else if (offset === 'max') {
169169
return max;
170170
}
171+
172+
// Unreachable since `offset` is typed as number | 'min' | 'max'.
173+
return max;
171174
};
172175

173176
/** Same as `offsetValue` but return `changed` mark to tell value changed */

src/hooks/useRange.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ export default function useRange(
2222
warning(!editable || !draggableTrack, '`editable` can not work with `draggableTrack`.');
2323
}
2424

25-
return [true, editable, !editable && draggableTrack, minCount || 0, maxCount];
25+
return [true, !!editable, !editable && !!draggableTrack, minCount || 0, maxCount];
2626
}, [range]);
2727
}

0 commit comments

Comments
 (0)