Skip to content

Commit

Permalink
refactor: more hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
zombieJ committed Dec 6, 2023
1 parent 42e6fbe commit c0bc3e5
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 44 deletions.
70 changes: 34 additions & 36 deletions src/NewPicker/PickerInput/RangePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import omit from 'rc-util/lib/omit';
import pickAttrs from 'rc-util/lib/pickAttrs';
import warning from 'rc-util/lib/warning';
import * as React from 'react';
import useLocale from '../hooks/useLocale';
import useTimeConfig from '../hooks/useTimeConfig';
import type {
BaseInfo,
Expand Down Expand Up @@ -131,16 +130,28 @@ function RangePicker<DateType extends object = any>(
props: RangePickerProps<DateType>,
ref: React.Ref<PickerRef>,
) {
// ========================= Prop =========================
const filledProps = useFilledProps(props, () => {
const { disabled, allowEmpty } = props;

const mergedDisabled = separateConfig(disabled, false);
const mergedAllowEmpty = separateConfig(allowEmpty, false);

return {
disabled: mergedDisabled,
allowEmpty: mergedAllowEmpty,
};
});

const {
// Style
prefixCls = 'rc-picker',
styles = {},
classNames = {},
prefixCls,
styles,
classNames,

// Value
defaultValue,
value,
order = true,
needConfirm,

// Disabled
Expand All @@ -160,7 +171,7 @@ function RangePicker<DateType extends object = any>(
// Picker
locale,
generateConfig,
picker = 'date',
picker,
showNow,
showToday,

Expand Down Expand Up @@ -197,34 +208,21 @@ function RangePicker<DateType extends object = any>(
clearIcon,

// Render
components = {},
components,
cellRender,
dateRender,
monthCellRender,

// Native
onClick,
} = props;
} = filledProps;

// ========================= Refs =========================
const selectorRef = usePickerRef(ref);

// ======================== Locale ========================
const filledLocale = useLocale(locale);

// =================== Disabled & Empty ===================
const mergedDisabled = separateConfig(disabled, false);
const mergedAllowEmpty = separateConfig(allowEmpty, false);

// ========================= Icon =========================
const mergedClearIcon = useClearIcon(prefixCls, allowClear, clearIcon);

// ========================= Prop =========================
const filledProps = useFilledProps(props, {
allowEmpty: mergedAllowEmpty,
order,
});

// ======================= ShowTime =======================
const mergedShowTime = useTimeConfig(filledProps);

Expand All @@ -235,7 +233,7 @@ function RangePicker<DateType extends object = any>(

const triggerOpen: OnOpenChange = (nextOpen, config?: OpenConfig) => {
// No need to open if all disabled
if (mergedDisabled.some((fieldDisabled) => !fieldDisabled) || !nextOpen) {
if (disabled.some((fieldDisabled) => !fieldDisabled) || !nextOpen) {
setMergeOpen(nextOpen, config);
}
};
Expand All @@ -249,7 +247,7 @@ function RangePicker<DateType extends object = any>(
const mergedNeedConfirm = needConfirm ?? complexPicker;

// ======================== Format ========================
const [formatList, maskFormat] = useFieldFormat(internalPicker, filledLocale, format);
const [formatList, maskFormat] = useFieldFormat(internalPicker, locale, format);

// ======================== Values ========================
const [mergedValue, setInnerValue, getCalendarValue, triggerCalendarChange] = useInnerValue(
Expand All @@ -272,7 +270,7 @@ function RangePicker<DateType extends object = any>(
lastOperation,
nextActiveIndex,
activeIndexList,
] = useRangeActive(mergedOpen, mergedDisabled, mergedAllowEmpty);
] = useRangeActive(mergedOpen, disabled, allowEmpty);

const onSharedFocus = (event: React.FocusEvent<HTMLElement>, index?: number) => {
triggerFocus(true);
Expand Down Expand Up @@ -339,7 +337,7 @@ function RangePicker<DateType extends object = any>(
setInnerValue,
getCalendarValue,
triggerCalendarChange,
mergedDisabled,
disabled,
formatList,
focused,
mergedOpen,
Expand All @@ -349,10 +347,10 @@ function RangePicker<DateType extends object = any>(
// ===================== DisabledDate =====================
const mergedDisabledDate = useRangeDisabledDate(
calendarValue,
mergedDisabled,
disabled,
activeIndexList,
generateConfig,
filledLocale,
locale,
disabledBoundaryDate,
// minDate,
// maxDate,
Expand Down Expand Up @@ -386,7 +384,7 @@ function RangePicker<DateType extends object = any>(
}

// Not allow empty
if (!mergedAllowEmpty[index] && !current) {
if (!allowEmpty[index] && !current) {
return true;
}

Expand All @@ -397,12 +395,12 @@ function RangePicker<DateType extends object = any>(

return false;
}) as [boolean, boolean];
}, [calendarValue, fieldsInvalidates, isInvalidateDate, mergedAllowEmpty]);
}, [calendarValue, fieldsInvalidates, isInvalidateDate, allowEmpty]);

// ===================== Picker Value =====================
const [currentPickerValue, setCurrentPickerValue] = useRangePickerValue(
generateConfig,
filledLocale,
locale,
calendarValue,
mergedOpen,
activeIndex,
Expand Down Expand Up @@ -473,7 +471,7 @@ function RangePicker<DateType extends object = any>(
const onSelectorClick: React.MouseEventHandler<HTMLDivElement> = (event) => {
if (!selectorRef.current.nativeElement.contains(document.activeElement)) {
// Click to focus the enabled input
const enabledIndex = mergedDisabled.findIndex((d) => !d);
const enabledIndex = disabled.findIndex((d) => !d);
if (enabledIndex >= 0) {
selectorRef.current.focus(enabledIndex);
}
Expand Down Expand Up @@ -675,12 +673,12 @@ function RangePicker<DateType extends object = any>(
const context = React.useMemo(
() => ({
prefixCls,
locale: filledLocale,
locale,
generateConfig,
button: components.button,
input: components.input,
}),
[prefixCls, filledLocale, generateConfig, components.button, components.input],
[prefixCls, locale, generateConfig, components.button, components.input],
);

// ======================== Effect ========================
Expand Down Expand Up @@ -722,8 +720,8 @@ function RangePicker<DateType extends object = any>(
};

if (
mergedDisabled.some(
(fieldDisabled, index) => fieldDisabled && isIndexEmpty(index) && !mergedAllowEmpty[index],
disabled.some(
(fieldDisabled, index) => fieldDisabled && isIndexEmpty(index) && !allowEmpty[index],
)
) {
warning(
Expand Down Expand Up @@ -777,7 +775,7 @@ function RangePicker<DateType extends object = any>(
format={formatList}
inputReadOnly={mergedInputReadOnly}
// Disabled
disabled={mergedDisabled}
disabled={disabled}
// Open
onOpenChange={triggerOpen}
// Click
Expand Down
37 changes: 29 additions & 8 deletions src/NewPicker/PickerInput/hooks/useFilledProps.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,43 @@
import * as React from 'react';
import useLocale from '../../hooks/useLocale';
import type { Locale, PickerMode } from '../../interface';
import type { RangePickerProps } from '../RangePicker';

export default function useFilledProps<T extends { locale: Locale; picker?: PickerMode }>(
props: T,
additionalProps?: Partial<T>,
): T {
const { locale, picker = 'date' } = props;
type PickedProps<DateType extends object = any> = Pick<
RangePickerProps<DateType>,
'locale' | 'picker' | 'prefixCls' | 'styles' | 'classNames' | 'order' | 'components'
>;

export default function useFilledProps<
DateType extends object = any,
InProps extends PickedProps<DateType> = PickedProps<DateType>,
UpdaterProps = any,
>(props: InProps, updater?: () => UpdaterProps): Omit<InProps, keyof UpdaterProps> & UpdaterProps {
const {
locale,
picker = 'date',
prefixCls = 'rc-picker',
styles = {},
classNames = {},
order = true,
components = {},
} = props;

const filledLocale = useLocale(locale);

return React.useMemo(
const filledProps = React.useMemo(
() => ({
...props,
prefixCls,
locale: filledLocale,
picker,
...additionalProps,
styles,
classNames,
order,
components,
...updater?.(),
}),
[props],
);

return filledProps;
}

0 comments on commit c0bc3e5

Please sign in to comment.