Skip to content

Commit

Permalink
refactor: migrated to dayjs (#214)
Browse files Browse the repository at this point in the history
* refactor: migrating to dayjs

* test: fixed tests and updated setters

* chore: minor changes

* chore: reorganize functions

* refactor: migrate format strings to dayjs

* refactor: migrate parseDate (failing)

* refactor: migrate closestTo

* refactor: revert parseDate and fix closestTo types
  • Loading branch information
anuraghazra authored Aug 13, 2021
1 parent ad8c77a commit 623cc56
Show file tree
Hide file tree
Showing 19 changed files with 255 additions and 80 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
"@react-aria/spinbutton": "3.0.0",
"@react-aria/utils": "3.8.1",
"date-fns": "2.22.1",
"dayjs": "^1.10.6",
"reakit-system": "0.15.1",
"reakit-utils": "0.15.1",
"reakit-warning": "^0.6.1"
Expand Down
9 changes: 7 additions & 2 deletions src/calendar/CalendarCell.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@ import { useCallback } from "react";
import { callAllHandlers } from "@chakra-ui/utils";
import { RoleHTMLProps, RoleOptions, useRole } from "reakit";
import { createComponent, createHook } from "reakit-system";
import { getDaysInMonth, isSameDay, isWeekend } from "date-fns";

import { dataAttr, ariaAttr } from "../utils";
import {
dataAttr,
ariaAttr,
getDaysInMonth,
isSameDay,
isWeekend,
} from "../utils";
import { CALENDAR_CELL_KEYS } from "./__keys";
import { CalendarStateReturn } from "./CalendarState";
import { RangeCalendarStateReturn } from "./RangeCalendarState";
Expand Down
3 changes: 1 addition & 2 deletions src/calendar/CalendarCellButton.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
* to work with Reakit System
*/
import * as React from "react";
import { isSameDay } from "date-fns";
import { callAllHandlers } from "@chakra-ui/utils";
import { useDateFormatter } from "@react-aria/i18n";
import { ensureFocus, useForkRef } from "reakit-utils";
import { createComponent, createHook } from "reakit-system";
import { ButtonHTMLProps, ButtonOptions, useButton } from "reakit";

import { isInvalidDateRange } from "../utils";
import { isInvalidDateRange, isSameDay } from "../utils";
import { CALENDAR_CELL_BUTTON_KEYS } from "./__keys";
import { CalendarStateReturn } from "./CalendarState";
import { RangeCalendarStateReturn } from "./RangeCalendarState";
Expand Down
24 changes: 11 additions & 13 deletions src/calendar/CalendarState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {
addMonths,
addWeeks,
addYears,
closestTo,
endOfMonth,
format,
getDaysInMonth,
Expand All @@ -20,19 +19,18 @@ import {
subMonths,
subWeeks,
subYears,
} from "date-fns";
parseDate,
stringifyDate,
isInvalidDateRange,
useControllableState,
} from "../utils";
import { closestTo } from "../utils";
import * as React from "react";
import { unstable_useId as useId } from "reakit";
import { useUpdateEffect } from "@chakra-ui/hooks";
import { useDateFormatter } from "@react-aria/i18n";
import { InputBase } from "@react-types/shared";

import {
parseDate,
stringifyDate,
isInvalidDateRange,
useControllableState,
} from "../utils";
import { announce } from "../utils/LiveAnnouncer";
import { useWeekStart, useWeekDays, generateDaysInMonthArray } from "./helpers";

Expand Down Expand Up @@ -77,7 +75,7 @@ export function useCalendarState(
const weekStart = useWeekStart();
const weekDays = useWeekDays(weekStart);

let monthStartsAt = (startOfMonth(currentMonth).getDay() - weekStart) % 7;
let monthStartsAt = (startOfMonth(currentMonth).get("day") - weekStart) % 7;
if (monthStartsAt < 0) {
monthStartsAt += 7;
}
Expand All @@ -103,7 +101,7 @@ export function useCalendarState(

const nextDate = closestTo(date, [minValue, maxValue]);
if (!isSameMonth(nextDate, currentMonth)) {
setCurrentMonth(startOfMonth(nextDate));
setCurrentMonth(startOfMonth(nextDate).toDate());
}
setFocusedDate(nextDate);
}
Expand All @@ -112,7 +110,7 @@ export function useCalendarState(
}

if (!isSameMonth(date, currentMonth)) {
setCurrentMonth(startOfMonth(date));
setCurrentMonth(startOfMonth(date).toDate());
}

setFocusedDate(date);
Expand Down Expand Up @@ -181,10 +179,10 @@ export function useCalendarState(
focusCell(subMonths(focusedDate, 1));
},
focusStartOfMonth() {
focusCell(startOfMonth(focusedDate));
focusCell(startOfMonth(focusedDate).toDate());
},
focusEndOfMonth() {
focusCell(endOfMonth(startOfDay(focusedDate)));
focusCell(endOfMonth(startOfDay(focusedDate).toDate()).toDate());
},
focusNextYear() {
focusCell(addYears(focusedDate, 1));
Expand Down
19 changes: 12 additions & 7 deletions src/calendar/RangeCalendarState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@
* to work with Reakit System
*/
import * as React from "react";
import { format, isSameDay } from "date-fns";
import { InputBase, RangeValue } from "@react-types/shared";

import { makeRange } from "./helpers";
import { announce } from "../utils/LiveAnnouncer";
import { useCalendarState } from "./CalendarState";
import { CalendarActions, CalendarState } from "./CalendarState";
import { parseRangeDate, stringifyDate, useControllableState } from "../utils";
import {
format,
isSameDay,
parseRangeDate,
stringifyDate,
useControllableState,
} from "../utils";

export function useRangeCalendarState(
props: RangeCalendarInitialState = {},
Expand Down Expand Up @@ -56,15 +61,15 @@ export function useRangeCalendarState(
announce(
`Selected range, from ${format(
highlightedRange.start,
"do MMM yyyy",
)} to ${format(highlightedRange.start, "do MMM yyyy")}`,
"Do MMM YYYY",
)} to ${format(highlightedRange.start, "Do MMM YYYY")}`,
);
} else {
announce(
`Selected range, from ${format(
highlightedRange.start,
"do MMM yyyy",
)} to ${format(highlightedRange.end, "do MMM yyyy")}`,
"Do MMM YYYY",
)} to ${format(highlightedRange.end, "Do MMM YYYY")}`,
);
}
}, [highlightedRange]);
Expand All @@ -76,7 +81,7 @@ export function useRangeCalendarState(

if (!anchorDate) {
setAnchorDate(date);
announce(`Starting range from ${format(date, "do MMM yyyy")}`);
announce(`Starting range from ${format(date, "Do MMM YYYY")}`);
} else {
setValue(makeRange(anchorDate, date));
announceRange();
Expand Down
20 changes: 10 additions & 10 deletions src/calendar/__tests__/Calendar.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as React from "react";
import MockDate from "mockdate";
import { subWeeks, addWeeks, format } from "date-fns";
import { axe, render, press, screen } from "reakit-test-utils";

import {
Expand All @@ -16,6 +15,7 @@ import {
} from "../index";
import { repeat } from "../../utils/test-utils";
import { cleanup } from "@testing-library/react";
import { addWeeks, format, subWeeks } from "../../utils";

export const CalendarComp: React.FC<CalendarInitialState> = props => {
const state = useCalendarState(props);
Expand Down Expand Up @@ -152,9 +152,9 @@ describe("Calendar", () => {
test("should have min/max values", () => {
render(
<CalendarComp
defaultValue={format(new Date(2020, 10, 7), "yyyy-MM-dd")}
minValue={format(subWeeks(new Date(2020, 10, 7), 1), "yyyy-MM-dd")}
maxValue={format(addWeeks(new Date(2020, 10, 7), 1), "yyyy-MM-dd")}
defaultValue={format(new Date(2020, 10, 7), "YYYY-MM-DD")}
minValue={format(subWeeks(new Date(2020, 10, 7), 1), "YYYY-MM-DD")}
maxValue={format(addWeeks(new Date(2020, 10, 7), 1), "YYYY-MM-DD")}
/>,
);
const { getByLabelText: label } = screen;
Expand All @@ -173,9 +173,9 @@ describe("Calendar", () => {
test("should be able to go to prev/next month when min/max values are set", () => {
render(
<CalendarComp
defaultValue={format(new Date(2020, 10, 7), "yyyy-MM-dd")}
minValue={format(subWeeks(new Date(2020, 10, 7), 1), "yyyy-MM-dd")}
maxValue={format(addWeeks(new Date(2020, 10, 7), 1), "yyyy-MM-dd")}
defaultValue={format(new Date(2020, 10, 7), "YYYY-MM-DD")}
minValue={format(subWeeks(new Date(2020, 10, 7), 1), "YYYY-MM-DD")}
maxValue={format(addWeeks(new Date(2020, 10, 7), 1), "YYYY-MM-DD")}
/>,
);
const { getByLabelText: label } = screen;
Expand All @@ -199,9 +199,9 @@ describe("Calendar", () => {
test("should be able to go to prev/next year when min/max values are set", () => {
render(
<CalendarComp
defaultValue={format(new Date(2020, 10, 7), "yyyy-MM-dd")}
minValue={format(subWeeks(new Date(2020, 10, 7), 1), "yyyy-MM-dd")}
maxValue={format(addWeeks(new Date(2021, 10, 7), 1), "yyyy-MM-dd")}
defaultValue={format(new Date(2020, 10, 7), "YYYY-MM-DD")}
minValue={format(subWeeks(new Date(2020, 10, 7), 1), "YYYY-MM-DD")}
maxValue={format(addWeeks(new Date(2021, 10, 7), 1), "YYYY-MM-DD")}
/>,
);

Expand Down
6 changes: 4 additions & 2 deletions src/calendar/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@
* All credit goes to [React Spectrum](https://github.com/adobe/react-spectrum)
* for these utils inspiration
*/
import { setDay } from "date-fns";
import { RangeValue } from "@react-types/shared";
import { useDateFormatter } from "@react-aria/i18n";
import dayjs from "dayjs";

export function useWeekDays(weekStart: number) {
const dayFormatter = useDateFormatter({ weekday: "short" });
const dayFormatterLong = useDateFormatter({ weekday: "long" });

return [0, 1, 2, 3, 4, 5, 6].map(index => {
const dateDay = setDay(Date.now(), (index + weekStart) % 7);
const dateDay = dayjs(Date.now())
.set("day", (index + weekStart) % 7)
.toDate();
const day = dayFormatter.format(dateDay);
const dayLong = dayFormatterLong.format(dateDay);
return { title: dayLong, abbr: day } as const;
Expand Down
13 changes: 7 additions & 6 deletions src/calendar/stories/CalendarBase.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as React from "react";
import { Meta, Story } from "@storybook/react";
import { useArgs } from "@storybook/client-api";
import { addWeeks, format } from "date-fns";

import "./CalendarBase.css";
import {
Expand All @@ -13,6 +12,8 @@ import {
} from "./templates";
import { App as Calendar } from "./CalendarBase.component";
import { createPreviewTabs } from "../../../scripts/create-preview-tabs";
import { format } from "util";
import { addWeeks } from "@renderlesskit/react/utils";

export default {
component: Calendar,
Expand All @@ -36,18 +37,18 @@ export default {
} as Meta;

const Base: Story = args => {
args.value &&= format(new Date(args.value), "yyyy-MM-dd");
args.defaultValue &&= format(new Date(args.defaultValue), "yyyy-MM-dd");
args.minValue &&= format(new Date(args.minValue), "yyyy-MM-dd");
args.maxValue &&= format(new Date(args.maxValue), "yyyy-MM-dd");
args.value &&= format(new Date(args.value), "YYYY-MM-DD");
args.defaultValue &&= format(new Date(args.defaultValue), "YYYY-MM-DD");
args.minValue &&= format(new Date(args.minValue), "YYYY-MM-DD");
args.maxValue &&= format(new Date(args.maxValue), "YYYY-MM-DD");

const [{ value }, updateArgs] = useArgs();

return (
<Calendar
value={value}
onChange={date =>
updateArgs({ value: format(new Date(date), "yyyy-MM-dd") })
updateArgs({ value: format(new Date(date), "YYYY-MM-DD") })
}
{...args}
/>
Expand Down
28 changes: 17 additions & 11 deletions src/calendar/stories/CalendarRange.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as React from "react";
import { Meta, Story } from "@storybook/react";
import { useArgs } from "@storybook/client-api";
import { addDays, addWeeks, subDays, format, subWeeks } from "date-fns";

import "./CalendarRange.css";
import {
Expand All @@ -13,6 +12,13 @@ import {
} from "./templates";
import { App as RangeCalendar } from "./CalendarRange.component";
import { createPreviewTabs } from "../../../scripts/create-preview-tabs";
import {
addDays,
addWeeks,
format,
subDays,
subWeeks,
} from "@renderlesskit/react/utils";

export default {
title: "Calendar/Range",
Expand Down Expand Up @@ -45,16 +51,16 @@ export default {

const Base: Story = args => {
args.value = {
start: args.start && format(new Date(args.start), "yyyy-MM-dd"),
end: args.end && format(new Date(args.end), "yyyy-MM-dd"),
start: args.start && format(new Date(args.start), "YYYY-MM-DD"),
end: args.end && format(new Date(args.end), "YYYY-MM-DD"),
};
args.defaultValue = {
start:
args.defaultStart && format(new Date(args.defaultStart), "yyyy-MM-dd"),
end: args.defaultEnd && format(new Date(args.defaultEnd), "yyyy-MM-dd"),
args.defaultStart && format(new Date(args.defaultStart), "YYYY-MM-DD"),
end: args.defaultEnd && format(new Date(args.defaultEnd), "YYYY-MM-DD"),
};
args.minValue &&= format(new Date(args.minValue), "yyyy-MM-dd");
args.maxValue &&= format(new Date(args.maxValue), "yyyy-MM-dd");
args.minValue &&= format(new Date(args.minValue), "YYYY-MM-DD");
args.maxValue &&= format(new Date(args.maxValue), "YYYY-MM-DD");

const [argProps, updateArgs] = useArgs();

Expand All @@ -63,8 +69,8 @@ const Base: Story = args => {
value={{ start: argProps["start"], end: argProps["nd"] }}
onChange={date => {
updateArgs({
start: format(new Date(date.start), "yyyy-MM-dd"),
end: format(new Date(date.end), "yyyy-MM-dd"),
start: format(new Date(date.start), "YYYY-MM-DD"),
end: format(new Date(date.end), "YYYY-MM-DD"),
});
}}
{...args}
Expand Down Expand Up @@ -115,10 +121,10 @@ ControlledStory.args = {

export const ControlledInput = () => {
const [start, setStart] = React.useState(
format(subDays(new Date(), 1), "yyyy-MM-dd"),
format(subDays(new Date(), 1), "YYYY-MM-DD"),
);
const [end, setEnd] = React.useState(
format(addDays(new Date(), 1), "yyyy-MM-dd"),
format(addDays(new Date(), 1), "YYYY-MM-DD"),
);

return (
Expand Down
8 changes: 4 additions & 4 deletions src/datepicker/__tests__/DatePicker.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as React from "react";
import { cleanup } from "@testing-library/react";
import { format, addWeeks, subWeeks } from "date-fns";

import { axe, render, press, screen } from "reakit-test-utils";
import {
Expand All @@ -24,6 +23,7 @@ import {
CalendarCellButton,
} from "../../calendar";
import { repeat } from "../../utils/test-utils";
import { addWeeks, format, subWeeks } from "../../utils";

/*
// Mocking useId otherwise snapshots will change each time
Expand Down Expand Up @@ -227,9 +227,9 @@ describe("DatePicker", () => {
it("should be invalid on out of range value", () => {
render(
<DatePickerComp
defaultValue={format(addWeeks(new Date(), 2), "yyyy-MM-dd")}
minValue={format(subWeeks(new Date(), 1), "yyyy-MM-dd")}
maxValue={format(addWeeks(new Date(), 1), "yyyy-MM-dd")}
defaultValue={format(addWeeks(new Date(), 2), "YYYY-MM-DD")}
minValue={format(subWeeks(new Date(), 1), "YYYY-MM-DD")}
maxValue={format(addWeeks(new Date(), 1), "YYYY-MM-DD")}
/>,
);

Expand Down
Loading

1 comment on commit 623cc56

@vercel
Copy link

@vercel vercel bot commented on 623cc56 Aug 13, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.