Skip to main content
Version: 8.10.1

Custom Selections

Draft

This documentation is still a work in progress. If you have any questions, ask to the discussions page on Github.

If the built-in selection modes are not enough for your app’s requirements, you can control the selection behavior using onDayClick.

Examples

Week Selection

The following example shows how to select the whole week when a day is clicked.

Note the use of the startOfWeek and endOfWeek functions from date-fns and how the selectedWeek state is passed to the modifiers prop.

import { useState } from "react";

import { endOfWeek, isSameWeek, startOfWeek } from "date-fns";
import { DateRange, DayPicker } from "react-day-picker";

/** Select the whole week when the day is clicked. */
export function CustomWeek() {
const [selectedWeek, setSelectedWeek] = useState<DateRange | undefined>();

return (
<DayPicker
showWeekNumber
modifiers={{
selected: selectedWeek
}}
onDayClick={(day, modifiers) => {
if (modifiers.selected) {
setSelectedWeek(undefined); // clear the selection if the week is already selected
return;
}
setSelectedWeek({
from: startOfWeek(day),
to: endOfWeek(day)
});
}}
onWeekNumberClick={(weekNumber, dates) => {
if (selectedWeek?.from && isSameWeek(dates[0], selectedWeek.from)) {
setSelectedWeek(undefined); // clear the selection if the week is already selected
return;
}
setSelectedWeek({
from: startOfWeek(dates[0]),
to: endOfWeek(dates[dates.length - 1])
});
}}
footer={
selectedWeek && (
<p>
Week from {selectedWeek.from.toLocaleDateString()} to
{selectedWeek.to.toLocaleDateString()}
</p>
)
}
/>
);
}

Single Selection

For example, to implement the "single selection" behavior (like when mode="single"):

import { useState } from "react";

import { DayPicker, DayPickerProps } from "react-day-picker";

export function CustomSingle() {
const [selectedDate, setSelectedDate] = useState<Date | undefined>();

const modifiers: DayPickerProps["modifiers"] = {};
if (selectedDate) {
modifiers.selected = selectedDate;
}
return (
<DayPicker
modifiers={modifiers}
onDayClick={(day, modifiers) => {
if (modifiers.selected) {
setSelectedDate(undefined);
} else {
setSelectedDate(day);
}
}}
footer={selectedDate && `You selected ${selectedDate.toDateString()}`}
/>
);
}

Multi Selections

The case of a multi-days select is a bit more complex as it deals with an array. The following example replicates the mode="multiple" selection mode.

import { useState } from "react";

import { isSameDay } from "date-fns";
import { DayMouseEventHandler, DayPicker } from "react-day-picker";

export function CustomMultiple() {
const [value, setValue] = useState<Date[]>([]);

const handleDayClick: DayMouseEventHandler = (day, modifiers) => {
const newValue = [...value];
if (modifiers.selected) {
const index = value.findIndex((d) => isSameDay(day, d));
newValue.splice(index, 1);
} else {
newValue.push(day);
}
setValue(newValue);
};

const handleResetClick = () => setValue([]);

let footer = <>Please pick one or more days.</>;

if (value.length > 0)
footer = (
<>
You selected {value.length} days.{" "}
<button onClick={handleResetClick}>Reset</button>
</>
);

return (
<DayPicker
onDayClick={handleDayClick}
modifiers={{ selected: value }}
footer={footer}
/>
);
}