|
1 |
| -import React, { useMemo, useRef } from "react"; |
| 1 | +import React, { useMemo, useRef, useState } from "react"; |
2 | 2 | import DateObject from "react-date-object";
|
3 | 3 | import WeekDays from "../week_days/week_days";
|
4 | 4 | import selectDate from "../../shared/selectDate";
|
5 | 5 | import isSameDate from "../../shared/isSameDate";
|
6 | 6 | import getRangeClass from "../../shared/getRangeClass";
|
7 | 7 | import getRangeHoverClass from "../../shared/getRangeHoverClass";
|
8 |
| -import { useState } from "react"; |
| 8 | +import handleFocus from "../../shared/handleFocus"; |
9 | 9 |
|
10 | 10 | const ariaLabelFormat = "dddd MMMM DD of YYYY";
|
11 | 11 |
|
12 |
| -let timeout; |
13 |
| - |
14 | 12 | export default function DayPicker({
|
15 | 13 | state,
|
16 |
| - setState, |
17 | 14 | onChange,
|
18 | 15 | showOtherDays = false,
|
19 | 16 | mapDays,
|
@@ -44,11 +41,11 @@ export default function DayPicker({
|
44 | 41 | selectedDate,
|
45 | 42 | onlyMonthPicker,
|
46 | 43 | onlyYearPicker,
|
| 44 | + mustShowMonthPicker, |
| 45 | + mustShowYearPicker, |
47 | 46 | } = state,
|
48 | 47 | mustShowDayPicker = !onlyMonthPicker && !onlyYearPicker,
|
49 |
| - [dateHovered, setDateHovered] = useState(), |
50 |
| - isDateSelected = |
51 |
| - multiple || range ? selectedDate?.length > 0 : !!selectedDate; |
| 48 | + [dateHovered, setDateHovered] = useState(); |
52 | 49 |
|
53 | 50 | ref.current.date = date;
|
54 | 51 |
|
@@ -80,6 +77,9 @@ export default function DayPicker({
|
80 | 77 | className={`rmdp-day-picker ${fullYear ? "rmdp-full-year" : ""}`}
|
81 | 78 | style={{ display: fullYear ? "grid" : "flex" }}
|
82 | 79 | onMouseLeave={() => rangeHover && setDateHovered()}
|
| 80 | + data-active={ |
| 81 | + mustShowDayPicker && !mustShowMonthPicker && !mustShowYearPicker |
| 82 | + } |
83 | 83 | >
|
84 | 84 | {months.map((weeks, monthIndex) => (
|
85 | 85 | <div
|
@@ -134,23 +134,20 @@ export default function DayPicker({
|
134 | 134 | className = className.replace("sd", "");
|
135 | 135 | }
|
136 | 136 |
|
137 |
| - const hasTabIndex = isDateSelected |
138 |
| - ? parentClassName.includes("selected") || |
139 |
| - parentClassName.includes("range") |
140 |
| - : parentClassName.includes("today"); |
141 |
| - |
142 | 137 | return (
|
143 | 138 | <div
|
144 | 139 | key={i}
|
145 |
| - tabIndex={hasTabIndex ? 0 : -1} |
| 140 | + tabIndex={-1} |
146 | 141 | aria-label={`Choose ${object.date.format(
|
147 | 142 | ariaLabelFormat
|
148 | 143 | )}`}
|
149 | 144 | className={parentClassName}
|
150 | 145 | onMouseEnter={() =>
|
151 | 146 | rangeHover && setDateHovered(object.date)
|
152 | 147 | }
|
153 |
| - onKeyDown={(e) => handleKeyDown(e, object)} |
| 148 | + onKeyDown={(e) => |
| 149 | + handleFocus(e, object, { format: ariaLabelFormat }) |
| 150 | + } |
154 | 151 | onClick={() => {
|
155 | 152 | if (!mustDisplayDay(object) || object.disabled) {
|
156 | 153 | return;
|
@@ -304,49 +301,6 @@ export default function DayPicker({
|
304 | 301 |
|
305 | 302 | return allProps;
|
306 | 303 | }
|
307 |
| - |
308 |
| - function handleKeyDown(e, object) { |
309 |
| - const { currentTarget, key, code } = e; |
310 |
| - const numbers = { ArrowRight: 1, ArrowLeft: -1, ArrowUp: -7, ArrowDown: 7 }; |
311 |
| - |
312 |
| - if (code === "Space" || key === " ") { |
313 |
| - e.preventDefault(); |
314 |
| - currentTarget.click(); |
315 |
| - } else if (Object.keys(numbers).includes(key)) { |
316 |
| - e.preventDefault(); |
317 |
| - |
318 |
| - const number = numbers[key]; |
319 |
| - const date = new DateObject(object.date).add(number, "day"); |
320 |
| - const div = getNode(date); |
321 |
| - |
322 |
| - focus(div); |
323 |
| - |
324 |
| - function focus(node) { |
325 |
| - if (!node) return next(); |
326 |
| - |
327 |
| - const classes = node.getAttribute("class"); |
328 |
| - |
329 |
| - if (!classes.includes("hidden") && !classes.includes("disabled")) { |
330 |
| - node.focus(); |
331 |
| - } else { |
332 |
| - next(); |
333 |
| - } |
334 |
| - } |
335 |
| - |
336 |
| - function next() { |
337 |
| - setState({ ...state, date }); |
338 |
| - clearTimeout(timeout); |
339 |
| - |
340 |
| - timeout = setTimeout(() => focus(getNode(date)), 100); |
341 |
| - } |
342 |
| - } |
343 |
| - } |
344 |
| - |
345 |
| - function getNode(date) { |
346 |
| - return divRef.current.querySelector( |
347 |
| - `[aria-label*='${date.format(ariaLabelFormat)}']` |
348 |
| - ); |
349 |
| - } |
350 | 304 | }
|
351 | 305 |
|
352 | 306 | function getMonths(date, showOtherDays, numberOfMonths, weekStartDayIndex) {
|
|
0 commit comments