diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index 8b634e8387dec..b40b6792c4216 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -248,6 +248,7 @@ const CONST = {
POPOVER_MENU_MAX_HEIGHT: 496,
POPOVER_MENU_MAX_HEIGHT_MOBILE: 432,
POPOVER_DATE_WIDTH: 338,
+ POPOVER_DATE_RANGE_WIDTH: 672,
POPOVER_DATE_MAX_HEIGHT: 366,
POPOVER_DATE_MIN_HEIGHT: 322,
TOOLTIP_ANIMATION_DURATION: 500,
@@ -7408,6 +7409,7 @@ const CONST = {
EQUAL_TO: 'eq',
CONTAINS: 'contains',
NOT_EQUAL_TO: 'neq',
+ RANGE: 'range',
GREATER_THAN: 'gt',
GREATER_THAN_OR_EQUAL_TO: 'gte',
LOWER_THAN: 'lt',
@@ -7482,6 +7484,7 @@ const CONST = {
ON_PREFIX: 'reportFieldOn-',
AFTER_PREFIX: 'reportFieldAfter-',
BEFORE_PREFIX: 'reportFieldBefore-',
+ RANGE_PREFIX: 'reportFieldRange-',
},
TAG_EMPTY_VALUE: 'none',
CATEGORY_EMPTY_VALUE: 'none',
@@ -7610,6 +7613,7 @@ const CONST = {
ON: 'On',
AFTER: 'After',
BEFORE: 'Before',
+ RANGE: 'Range',
},
AMOUNT_MODIFIERS: {
LESS_THAN: 'LessThan',
diff --git a/src/components/DatePicker/CalendarPicker/Day.tsx b/src/components/DatePicker/CalendarPicker/Day.tsx
index 3db884bb7fdc0..ed57ddb5bf025 100644
--- a/src/components/DatePicker/CalendarPicker/Day.tsx
+++ b/src/components/DatePicker/CalendarPicker/Day.tsx
@@ -27,13 +27,9 @@ function Day({disabled, selected, pressed, hovered, children}: DayProps) {
const StyleUtils = useStyleUtils();
return (
- {children}
+ {children}
);
}
diff --git a/src/components/DatePicker/CalendarPicker/index.tsx b/src/components/DatePicker/CalendarPicker/index.tsx
index b520650c8c74c..0364dc61c5ec9 100644
--- a/src/components/DatePicker/CalendarPicker/index.tsx
+++ b/src/components/DatePicker/CalendarPicker/index.tsx
@@ -1,6 +1,7 @@
import {addMonths, endOfDay, endOfMonth, format, getYear, isSameDay, parseISO, setDate, setYear, startOfDay, startOfMonth, subMonths} from 'date-fns';
import {Str} from 'expensify-common';
import React, {useCallback, useEffect, useRef, useState} from 'react';
+import type {StyleProp, ViewStyle} from 'react-native';
import {View} from 'react-native';
import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated';
import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
@@ -35,6 +36,9 @@ type CalendarPickerProps = {
/** A function called when the date is selected */
onSelected?: (selectedDate: string) => void;
+
+ /** Optional style override for the header container */
+ headerContainerStyle?: StyleProp;
};
function getInitialCurrentDateView(value: Date | string, minDate: Date, maxDate: Date) {
@@ -56,6 +60,7 @@ function CalendarPicker({
onSelected,
DayComponent = Day,
selectableDates,
+ headerContainerStyle,
}: CalendarPickerProps) {
// eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
const {isSmallScreenWidth} = useResponsiveLayout();
@@ -175,13 +180,14 @@ function CalendarPicker({
const webOnlyMarginStyle = isSmallScreenWidth ? {} : styles.mh1;
const calendarContainerStyle = isSmallScreenWidth ? [webOnlyMarginStyle, themeStyles.calendarBodyContainer] : [webOnlyMarginStyle, animatedStyle];
+ const headerPaddingStyle = headerContainerStyle ?? themeStyles.ph5;
const getAccessibilityState = useCallback((isSelected: boolean) => ({selected: isSelected}), []);
return (
(null);
+ const [shouldShowRangeError, setShouldShowRangeError] = useState(false);
const dateOnKey = dateKey.startsWith(CONST.SEARCH.REPORT_FIELD.GLOBAL_PREFIX)
? (dateKey.replace(CONST.SEARCH.REPORT_FIELD.DEFAULT_PREFIX, CONST.SEARCH.REPORT_FIELD.ON_PREFIX) as ReportFieldDateKey)
@@ -43,19 +47,36 @@ function DateFilterBase({title, dateKey, back, onSubmit}: DateFilterBaseProps) {
? (dateKey.replace(CONST.SEARCH.REPORT_FIELD.DEFAULT_PREFIX, CONST.SEARCH.REPORT_FIELD.AFTER_PREFIX) as ReportFieldDateKey)
: (`${dateKey}${CONST.SEARCH.DATE_MODIFIERS.AFTER}` as const);
+ const dateRangeKey = dateKey.startsWith(CONST.SEARCH.REPORT_FIELD.GLOBAL_PREFIX)
+ ? (`${CONST.SEARCH.REPORT_FIELD.RANGE_PREFIX}${dateKey.replace(CONST.SEARCH.REPORT_FIELD.DEFAULT_PREFIX, '')}` as ReportFieldDateKey)
+ : (`${dateKey}${CONST.SEARCH.DATE_MODIFIERS.RANGE}` as const);
+
const dateOnValue = searchAdvancedFiltersForm?.[dateOnKey];
const dateBeforeValue = searchAdvancedFiltersForm?.[dateBeforeKey];
const dateAfterValue = searchAdvancedFiltersForm?.[dateAfterKey];
+ const dateRangeValue = searchAdvancedFiltersForm?.[dateRangeKey];
const defaultDateValues = useMemo(
() => ({
[CONST.SEARCH.DATE_MODIFIERS.ON]: dateOnValue,
[CONST.SEARCH.DATE_MODIFIERS.BEFORE]: dateBeforeValue,
[CONST.SEARCH.DATE_MODIFIERS.AFTER]: dateAfterValue,
+ [CONST.SEARCH.DATE_MODIFIERS.RANGE]: dateRangeValue,
}),
- [dateAfterValue, dateBeforeValue, dateOnValue],
+ [dateAfterValue, dateBeforeValue, dateOnValue, dateRangeValue],
+ );
+ const [rangeDisplayText, setRangeDisplayText] = useState(() =>
+ getDateRangeDisplayValueFromFormValue(
+ defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE],
+ defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER],
+ defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE],
+ ),
);
+ const handleDateValuesChange = useCallback(() => {
+ setRangeDisplayText(searchDatePresetFilterBaseRef.current?.getRangeDisplayText() ?? '');
+ }, []);
+
const presets = useMemo(() => {
const hasFeed = !!searchAdvancedFiltersForm?.feed?.length;
return getDatePresets(dateKey, hasFeed);
@@ -76,11 +97,14 @@ function DateFilterBase({title, dateKey, back, onSubmit}: DateFilterBaseProps) {
if (selectedDateModifier) {
searchDatePresetFilterBaseRef.current.clearDateValueOfSelectedDateModifier();
+ setRangeDisplayText(searchDatePresetFilterBaseRef.current.getRangeDisplayText());
setSelectedDateModifier(null);
+ setShouldShowRangeError(false);
return;
}
searchDatePresetFilterBaseRef.current.clearDateValues();
+ setRangeDisplayText('');
}, [selectedDateModifier]);
const save = useCallback(() => {
@@ -89,36 +113,49 @@ function DateFilterBase({title, dateKey, back, onSubmit}: DateFilterBaseProps) {
}
if (selectedDateModifier) {
+ if (!searchDatePresetFilterBaseRef.current.validate()) {
+ return;
+ }
+
searchDatePresetFilterBaseRef.current.setDateValueOfSelectedDateModifier();
+ setRangeDisplayText(searchDatePresetFilterBaseRef.current.getRangeDisplayText());
setSelectedDateModifier(null);
+ setShouldShowRangeError(false);
return;
}
const dateValues = searchDatePresetFilterBaseRef.current.getDateValues();
-
onSubmit({
[dateOnKey]: dateValues[CONST.SEARCH.DATE_MODIFIERS.ON] ?? null,
[dateBeforeKey]: dateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE] ?? null,
[dateAfterKey]: dateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER] ?? null,
+ [dateRangeKey]: dateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE] ?? null,
});
- }, [selectedDateModifier, dateOnKey, dateBeforeKey, dateAfterKey, onSubmit]);
+ }, [selectedDateModifier, dateOnKey, dateBeforeKey, dateAfterKey, dateRangeKey, onSubmit]);
const goBack = () => {
if (selectedDateModifier) {
+ if (searchDatePresetFilterBaseRef.current && selectedDateModifier === CONST.SEARCH.DATE_MODIFIERS.RANGE) {
+ searchDatePresetFilterBaseRef.current.resetDateValuesToDefault();
+ setRangeDisplayText(searchDatePresetFilterBaseRef.current.getRangeDisplayText());
+ }
setSelectedDateModifier(null);
+ setShouldShowRangeError(false);
return;
}
back();
};
+ const hasRangeInput = !!rangeDisplayText;
+
return (
- <>
+
-
+
+ {selectedDateModifier === CONST.SEARCH.DATE_MODIFIERS.RANGE && hasRangeInput && (
+
+ {`${translate('common.range')}: `}
+ {rangeDisplayText}
+
+ )}
+
+
+
-
-
- >
+
);
}
diff --git a/src/components/Search/FilterComponents/DatePresetFilterBase.tsx b/src/components/Search/FilterComponents/DatePresetFilterBase.tsx
index bb0465ea20195..0c4618190ded0 100644
--- a/src/components/Search/FilterComponents/DatePresetFilterBase.tsx
+++ b/src/components/Search/FilterComponents/DatePresetFilterBase.tsx
@@ -1,4 +1,4 @@
-import React, {useCallback, useEffect, useImperativeHandle, useMemo, useState} from 'react';
+import React, {useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState} from 'react';
import type {Ref} from 'react';
import CalendarPicker from '@components/DatePicker/CalendarPicker';
import MenuItem from '@components/MenuItem';
@@ -9,9 +9,11 @@ import useLocalize from '@hooks/useLocalize';
import useStyleUtils from '@hooks/useStyleUtils';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
-import {isSearchDatePreset} from '@libs/SearchQueryUtils';
+import {getDateRangeDisplayValueFromFormValue, getRangeBoundariesFromFormValue, getRangeQueryValue, isSearchDatePreset} from '@libs/SearchQueryUtils';
import type {SearchDateModifier} from '@libs/SearchUIUtils';
import CONST from '@src/CONST';
+import RangeDatePicker from './RangeDatePicker';
+import SearchDatePickerDay from './SearchDatePickerDay';
type SearchDateValues = Record;
@@ -19,6 +21,9 @@ type DatePresetFilterBaseHandle = {
/** Gets date values */
getDateValues: () => SearchDateValues;
+ /** Gets the formatted range display text for current date values */
+ getRangeDisplayText: () => string;
+
/** Clears date values */
clearDateValues: () => void;
@@ -27,6 +32,12 @@ type DatePresetFilterBaseHandle = {
/** Clears the date value of the selected date modifier */
clearDateValueOfSelectedDateModifier: () => void;
+
+ /** Resets date values to the provided defaults */
+ resetDateValuesToDefault: () => void;
+
+ /** Validates the selected date modifier input */
+ validate: () => boolean;
};
type DatePresetFilterBaseProps = {
@@ -45,6 +56,21 @@ type DatePresetFilterBaseProps = {
/** Whether the search advanced filters form Onyx data is loading or not */
isSearchAdvancedFiltersFormLoading?: boolean;
+ /** Whether to show the range validation error */
+ shouldShowRangeError?: boolean;
+
+ /** Whether the range error should be rendered inside the picker */
+ shouldShowRangeErrorInPicker?: boolean;
+
+ /** Callback when date values change (useful for parent to track range display text) */
+ onDateValuesChange?: (dateValues: SearchDateValues) => void;
+
+ /** Callback when range validation error changes */
+ onRangeValidationErrorChange?: (shouldShowRangeError: boolean) => void;
+
+ /** Force vertical stacking of calendars in range picker */
+ forceVerticalCalendars?: boolean;
+
/** The ref handle */
ref: Ref;
};
@@ -59,7 +85,19 @@ type DatePresetFilterBaseProps = {
* - On save: if a date modifier is selected (i.e. user clicked save at the calendar picker) you should `setDateValueOfSelectedDateModifier` otherwise `getDateValues`
* - On reset: if a date modifier is selected (i.e. user clicked reset at the calendar picker) you should `clearDateValueOfSelectedDateModifier` otherwise `clearDateValues`
*/
-function DatePresetFilterBase({defaultDateValues, selectedDateModifier, onSelectDateModifier, presets, isSearchAdvancedFiltersFormLoading, ref}: DatePresetFilterBaseProps) {
+function DatePresetFilterBase({
+ defaultDateValues,
+ selectedDateModifier,
+ onSelectDateModifier,
+ presets,
+ isSearchAdvancedFiltersFormLoading,
+ shouldShowRangeError = false,
+ shouldShowRangeErrorInPicker = true,
+ onDateValuesChange,
+ onRangeValidationErrorChange,
+ forceVerticalCalendars = false,
+ ref,
+}: DatePresetFilterBaseProps) {
const theme = useTheme();
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
@@ -67,48 +105,67 @@ function DatePresetFilterBase({defaultDateValues, selectedDateModifier, onSelect
const shouldShowHorizontalRule = !!presets?.length;
+ const getRangeDisplayTextFromDateValues = useCallback((dateValues: SearchDateValues) => {
+ const rangeValue = dateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE];
+ if (!rangeValue) {
+ return '';
+ }
+ return getDateRangeDisplayValueFromFormValue(rangeValue, dateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER], dateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE]);
+ }, []);
+
+ const onDateValuesChangeRef = useRef(onDateValuesChange);
+ useEffect(() => {
+ onDateValuesChangeRef.current = onDateValuesChange;
+ }, [onDateValuesChange]);
+
const [dateValues, setDateValues] = useState(defaultDateValues);
+ const dateValuesRef = useRef(defaultDateValues);
+ const updateDateValues = useCallback((updater: SearchDateValues | ((prevDateValues: SearchDateValues) => SearchDateValues)) => {
+ const nextDateValues = typeof updater === 'function' ? updater(dateValuesRef.current) : updater;
+ dateValuesRef.current = nextDateValues;
+ setDateValues(nextDateValues);
+ onDateValuesChangeRef.current?.(nextDateValues);
+ }, []);
useEffect(() => {
if (isSearchAdvancedFiltersFormLoading) {
return;
}
- setDateValues(defaultDateValues);
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isSearchAdvancedFiltersFormLoading]);
-
- const setDateValue = useCallback((dateModifier: SearchDateModifier, value: string | undefined) => {
- setDateValues((prevDateValues) => {
- if (dateModifier === CONST.SEARCH.DATE_MODIFIERS.ON && isSearchDatePreset(value)) {
- return {
- [CONST.SEARCH.DATE_MODIFIERS.ON]: value,
- [CONST.SEARCH.DATE_MODIFIERS.BEFORE]: undefined,
- [CONST.SEARCH.DATE_MODIFIERS.AFTER]: undefined,
- };
- }
+ const currentDateValues = dateValuesRef.current;
+ const hasDefaultValuesChanged =
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.ON] !== defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.ON] ||
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER] !== defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER] ||
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE] !== defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE] ||
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE] !== defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE];
- if (dateModifier !== CONST.SEARCH.DATE_MODIFIERS.ON && isSearchDatePreset(prevDateValues[CONST.SEARCH.DATE_MODIFIERS.ON])) {
- return {
- ...prevDateValues,
- [dateModifier]: value,
- [CONST.SEARCH.DATE_MODIFIERS.ON]: undefined,
- };
- }
+ if (!hasDefaultValuesChanged) {
+ return;
+ }
+ dateValuesRef.current = defaultDateValues;
+ // eslint-disable-next-line react-hooks/set-state-in-effect
+ setDateValues(defaultDateValues);
+ onDateValuesChangeRef.current?.(defaultDateValues);
+ }, [isSearchAdvancedFiltersFormLoading, defaultDateValues]);
- return {...prevDateValues, [dateModifier]: value};
- });
- }, []);
+ const setDateValue = useCallback(
+ (dateModifier: SearchDateModifier, value: string | undefined) => {
+ updateDateValues((prevDateValues) => {
+ return {...prevDateValues, [dateModifier]: value};
+ });
+ },
+ [updateDateValues],
+ );
const dateDisplayValues = useMemo(() => {
const dateOn = dateValues[CONST.SEARCH.DATE_MODIFIERS.ON];
const dateAfter = dateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER];
const dateBefore = dateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE];
-
return {
// dateOn could be a preset e.g. Last month which should not be displayed as the On field
[CONST.SEARCH.DATE_MODIFIERS.ON]: isSearchDatePreset(dateOn) ? undefined : dateOn,
[CONST.SEARCH.DATE_MODIFIERS.AFTER]: dateAfter,
[CONST.SEARCH.DATE_MODIFIERS.BEFORE]: dateBefore,
+ [CONST.SEARCH.DATE_MODIFIERS.RANGE]: dateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE] ? 'range' : undefined,
};
}, [dateValues]);
@@ -119,23 +176,80 @@ function DatePresetFilterBase({defaultDateValues, selectedDateModifier, onSelect
[getInitialEphemeralDateValue],
);
+ // Separate ephemeral state for Range mode calendar selections
+ const [rangeEphemeralValues, setRangeEphemeralValues] = useState<{from?: string; to?: string}>(() => {
+ const rangeBoundaries = getRangeBoundariesFromFormValue(defaultDateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE]);
+ return {
+ from: rangeBoundaries.from,
+ to: rangeBoundaries.to,
+ };
+ });
+
const selectDateModifier = useCallback(
(dateModifier: SearchDateModifier | null) => {
resetEphemeralDateValue(dateModifier);
+ onRangeValidationErrorChange?.(false);
+
+ if (dateModifier === CONST.SEARCH.DATE_MODIFIERS.RANGE) {
+ const currentDateValues = dateValuesRef.current;
+ const rangeBoundaries = getRangeBoundariesFromFormValue(
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.RANGE],
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.AFTER],
+ currentDateValues[CONST.SEARCH.DATE_MODIFIERS.BEFORE],
+ );
+ setRangeEphemeralValues({
+ from: rangeBoundaries.from,
+ to: rangeBoundaries.to,
+ });
+ }
+
onSelectDateModifier(dateModifier);
},
- [resetEphemeralDateValue, onSelectDateModifier],
+ [resetEphemeralDateValue, onSelectDateModifier, onRangeValidationErrorChange],
);
+ const validate = useCallback(() => {
+ if (selectedDateModifier !== CONST.SEARCH.DATE_MODIFIERS.RANGE) {
+ onRangeValidationErrorChange?.(false);
+ return true;
+ }
+
+ const isValid = !!(rangeEphemeralValues.from && rangeEphemeralValues.to);
+ onRangeValidationErrorChange?.(!isValid);
+ return isValid;
+ }, [onRangeValidationErrorChange, rangeEphemeralValues.from, rangeEphemeralValues.to, selectedDateModifier]);
+
useImperativeHandle(
ref,
() => ({
getDateValues() {
- return dateValues;
+ return dateValuesRef.current;
+ },
+
+ getRangeDisplayText() {
+ return getRangeDisplayTextFromDateValues(dateValuesRef.current);
+ },
+
+ resetDateValuesToDefault() {
+ dateValuesRef.current = defaultDateValues;
+ updateDateValues(defaultDateValues);
+ onRangeValidationErrorChange?.(false);
+ },
+
+ validate() {
+ return validate();
},
clearDateValues() {
- setDateValues({[CONST.SEARCH.DATE_MODIFIERS.ON]: undefined, [CONST.SEARCH.DATE_MODIFIERS.BEFORE]: undefined, [CONST.SEARCH.DATE_MODIFIERS.AFTER]: undefined});
+ const clearedValues = {
+ [CONST.SEARCH.DATE_MODIFIERS.ON]: undefined,
+ [CONST.SEARCH.DATE_MODIFIERS.BEFORE]: undefined,
+ [CONST.SEARCH.DATE_MODIFIERS.AFTER]: undefined,
+ [CONST.SEARCH.DATE_MODIFIERS.RANGE]: undefined,
+ };
+ dateValuesRef.current = clearedValues;
+ updateDateValues(clearedValues);
+ onRangeValidationErrorChange?.(false);
},
setDateValueOfSelectedDateModifier() {
@@ -143,6 +257,18 @@ function DatePresetFilterBase({defaultDateValues, selectedDateModifier, onSelect
return;
}
+ const currentDateValues = dateValuesRef.current;
+ // For Range, mark as Range mode without altering ON/AFTER/BEFORE values.
+ if (selectedDateModifier === CONST.SEARCH.DATE_MODIFIERS.RANGE) {
+ const rangeValue = getRangeQueryValue(rangeEphemeralValues.from, rangeEphemeralValues.to) || undefined;
+ const updatedValues = {...currentDateValues, [CONST.SEARCH.DATE_MODIFIERS.RANGE]: rangeValue};
+ dateValuesRef.current = updatedValues;
+ setDateValue(CONST.SEARCH.DATE_MODIFIERS.RANGE, rangeValue);
+ return;
+ }
+
+ const updatedValues = {...currentDateValues, [selectedDateModifier]: ephemeralDateValue};
+ dateValuesRef.current = updatedValues;
setDateValue(selectedDateModifier, ephemeralDateValue);
},
@@ -151,60 +277,125 @@ function DatePresetFilterBase({defaultDateValues, selectedDateModifier, onSelect
return;
}
+ const currentDateValues = dateValuesRef.current;
+ // Range flag is independent metadata and should not clear ON/AFTER/BEFORE values.
+ if (selectedDateModifier === CONST.SEARCH.DATE_MODIFIERS.RANGE) {
+ const updatedValues = {...currentDateValues, [CONST.SEARCH.DATE_MODIFIERS.RANGE]: undefined};
+ dateValuesRef.current = updatedValues;
+ setRangeEphemeralValues({});
+ setDateValue(CONST.SEARCH.DATE_MODIFIERS.RANGE, undefined);
+ onRangeValidationErrorChange?.(false);
+ return;
+ }
+
+ const updatedValues = {...currentDateValues, [selectedDateModifier]: undefined};
+ dateValuesRef.current = updatedValues;
setDateValue(selectedDateModifier, undefined);
+ onRangeValidationErrorChange?.(false);
},
}),
- [selectedDateModifier, dateValues, ephemeralDateValue, setDateValue],
+ [
+ selectedDateModifier,
+ defaultDateValues,
+ ephemeralDateValue,
+ rangeEphemeralValues.from,
+ rangeEphemeralValues.to,
+ getRangeDisplayTextFromDateValues,
+ setDateValue,
+ updateDateValues,
+ validate,
+ onRangeValidationErrorChange,
+ ],
);
- return !selectedDateModifier ? (
- <>
- {presets?.map((preset) => (
- setDateValue(CONST.SEARCH.DATE_MODIFIERS.ON, preset)}
- wrapperStyle={styles.flexReset}
+ const rangeDescription = getRangeDisplayTextFromDateValues(dateValues) || undefined;
+
+ if (!selectedDateModifier) {
+ return (
+ <>
+ {presets?.map((preset) => (
+ setDateValue(CONST.SEARCH.DATE_MODIFIERS.ON, preset)}
+ wrapperStyle={styles.flexReset}
+ />
+ ))}
+ {shouldShowHorizontalRule && (
+
+ )}
+