|
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