Skip to content

Commit 8db0b82

Browse files
committed
Address review feedback: Replace @ts-ignore with proper onChange callbacks
1 parent e66276b commit 8db0b82

File tree

5 files changed

+40
-16
lines changed

5 files changed

+40
-16
lines changed

packages/components/src/calendar/date-calendar/index.tsx

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
*/
44
import { DayPicker } from 'react-day-picker';
55
import { enUS } from 'react-day-picker/locale';
6+
/**
7+
* WordPress dependencies
8+
*/
9+
import { useCallback } from '@wordpress/element';
610
/**
711
* Internal dependencies
812
*/
913
import { COMMON_PROPS } from '../utils/constants';
1014
import { clampNumberOfMonths } from '../utils/misc';
1115
import { useControlledValue } from '../../utils/hooks';
1216
import { useLocalizationProps } from '../utils/use-localization-props';
13-
import type { DateCalendarProps } from '../types';
17+
import type { DateCalendarProps, OnSelectHandler } from '../types';
1418

1519
/**
1620
* `DateCalendar` is a React component that provides a customizable calendar
@@ -35,14 +39,21 @@ export const DateCalendar = ( {
3539
mode: 'single',
3640
} );
3741

38-
const [ selected, setSelected ] = useControlledValue<
39-
Date | undefined | null
40-
>( {
41-
defaultValue: defaultSelected,
42-
value: selectedProp,
43-
// @ts-ignore: The useControlledValue expects onChange value parameter type is the same as the value parameter, but in our case, onSelect always receives DateRange | undefined.
44-
onChange: onSelect,
45-
} );
42+
const onChange: OnSelectHandler< typeof selectedProp > = useCallback(
43+
( selected, triggerDate, modifiers, e ) => {
44+
// Convert internal `null` to `undefined` for the public event handler.
45+
onSelect?.( selected ?? undefined, triggerDate, modifiers, e );
46+
},
47+
[ onSelect ]
48+
);
49+
50+
const [ selected, setSelected ] = useControlledValue< typeof selectedProp >(
51+
{
52+
defaultValue: defaultSelected,
53+
value: selectedProp,
54+
onChange,
55+
}
56+
);
4657

4758
return (
4859
<DayPicker

packages/components/src/calendar/date-range-calendar/index.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@ import { enUS } from 'react-day-picker/locale';
77
/**
88
* WordPress dependencies
99
*/
10-
import { useMemo, useState } from '@wordpress/element';
10+
import { useMemo, useState, useCallback } from '@wordpress/element';
1111
/**
1212
* Internal dependencies
1313
*/
1414
import { COMMON_PROPS, MODIFIER_CLASSNAMES } from '../utils/constants';
1515
import { clampNumberOfMonths } from '../utils/misc';
1616
import { useControlledValue } from '../../utils/hooks';
1717
import { useLocalizationProps } from '../utils/use-localization-props';
18-
import type { DateRangeCalendarProps, DateRange } from '../types';
18+
import type {
19+
DateRangeCalendarProps,
20+
DateRange,
21+
OnSelectHandler,
22+
} from '../types';
1923

2024
export function usePreviewRange( {
2125
selected,
@@ -151,13 +155,20 @@ export const DateRangeCalendar = ( {
151155
mode: 'range',
152156
} );
153157

158+
const onChange: OnSelectHandler< typeof selectedProp > = useCallback(
159+
( selected, triggerDate, modifiers, e ) => {
160+
// Convert internal `null` to `undefined` for the public event handler.
161+
onSelect?.( selected ?? undefined, triggerDate, modifiers, e );
162+
},
163+
[ onSelect ]
164+
);
165+
154166
const [ selected, setSelected ] = useControlledValue<
155167
DateRange | undefined | null
156168
>( {
157169
defaultValue: defaultSelected,
158170
value: selectedProp,
159-
// @ts-ignore: The useControlledValue expects onChange value parameter type is the same as the value parameter, but in our case, onSelect always receives DateRange | undefined.
160-
onChange: onSelect,
171+
onChange,
161172
} );
162173

163174
const [ hoveredDate, setHoveredDate ] = useState< Date | undefined >(

packages/components/src/calendar/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ type DayOfWeek = {
153153
* @param {Modifiers} modifiers - The modifiers associated with the event.
154154
* @param {React.MouseEvent | React.KeyboardEvent} e - The event object.
155155
*/
156-
type OnSelectHandler< T > = (
156+
export type OnSelectHandler< T > = (
157157
selected: T,
158158
triggerDate: Date,
159159
modifiers: Modifiers,

packages/components/src/toggle-group-control/toggle-group-control/as-button-group.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ function UnforwardedToggleGroupControlAsButtonGroup(
4848
const { value, defaultValue } =
4949
useComputeControlledOrUncontrolledValue( valueProp );
5050

51-
const [ selectedValue, setSelectedValue ] = useControlledValue( {
51+
const [ selectedValue, setSelectedValue ] = useControlledValue<
52+
typeof value
53+
>( {
5254
defaultValue,
5355
value,
5456
onChange,

packages/components/src/utils/hooks/use-controlled-value.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@ export function useControlledValue< T >( {
4848
setValue = setState;
4949
}
5050

51-
return [ value, setValue as typeof setState ] as const;
51+
return [ value, setValue ] as const;
5252
}

0 commit comments

Comments
 (0)