1 | import { toUTCDate } from 'nodemod/dist/calendar/helpers/to-utc-date.js';
|
2 | import { navigationKeySetDayNext, navigationKeySetDayPrevious } from '../constants.js';
|
3 | import { toDayDiffInclusive } from './to-day-diff-inclusive.js';
|
4 | export function toNextSelectableDate({ date, disabledDatesSet, disabledDaysSet, key, maxTime, minTime, }) {
|
5 | if (toDayDiffInclusive(minTime, maxTime) <= 1)
|
6 | return date;
|
7 | const focusedDateTime = +date;
|
8 | let isBeforeMinTime = focusedDateTime < minTime;
|
9 | let iaAfterMaxTime = focusedDateTime > maxTime;
|
10 | let isDisabledDay = isBeforeMinTime ||
|
11 | iaAfterMaxTime ||
|
12 | disabledDaysSet.has(date.getUTCDay()) ||
|
13 | disabledDatesSet.has(focusedDateTime);
|
14 | if (!isDisabledDay)
|
15 | return date;
|
16 | let newSelectableDate = isBeforeMinTime === iaAfterMaxTime ?
|
17 | date : new Date(isBeforeMinTime ? minTime - 864e5 : 864e5 + maxTime);
|
18 | let newSelectableDateTime = +newSelectableDate;
|
19 | const fy = newSelectableDate.getUTCFullYear();
|
20 | const m = newSelectableDate.getUTCMonth();
|
21 | let d = newSelectableDate.getUTCDate();
|
22 | while (isDisabledDay) {
|
23 | if (isBeforeMinTime || (!iaAfterMaxTime && navigationKeySetDayNext.has(key)))
|
24 | d += 1;
|
25 | if (iaAfterMaxTime || (!isBeforeMinTime && navigationKeySetDayPrevious.has(key)))
|
26 | d -= 1;
|
27 | newSelectableDate = toUTCDate(fy, m, d);
|
28 | newSelectableDateTime = +newSelectableDate;
|
29 | if (!isBeforeMinTime) {
|
30 | isBeforeMinTime = newSelectableDateTime < minTime;
|
31 | if (isBeforeMinTime) {
|
32 | newSelectableDate = new Date(minTime);
|
33 | d = newSelectableDate.getUTCDate();
|
34 | }
|
35 | }
|
36 | if (!iaAfterMaxTime) {
|
37 | iaAfterMaxTime = newSelectableDateTime > maxTime;
|
38 | if (iaAfterMaxTime) {
|
39 | newSelectableDate = new Date(maxTime);
|
40 | d = newSelectableDate.getUTCDate();
|
41 | }
|
42 | }
|
43 | isDisabledDay =
|
44 | disabledDaysSet.has(newSelectableDate.getUTCDay()) ||
|
45 | disabledDatesSet.has(+newSelectableDate);
|
46 | }
|
47 | return newSelectableDate;
|
48 | }
|