Skip to content

Commit bfeec14

Browse files
authored
Merge pull request #439 from aldabil21/min-max-arrow-disabled
feat: add useArrowDisable hook to manage navigation button states
2 parents dd047d2 + 3a4c9b9 commit bfeec14

File tree

4 files changed

+65
-6
lines changed

4 files changed

+65
-6
lines changed

src/lib/components/nav/DayDateBtn.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Button, Popover } from "@mui/material";
55
import { format, addDays } from "date-fns";
66
import { LocaleArrow } from "../common/LocaleArrow";
77
import useStore from "../../hooks/useStore";
8+
import useArrowDisable from "../../hooks/useArrowDisable";
89

910
interface DayDateBtnProps {
1011
selectedDate: Date;
@@ -14,6 +15,7 @@ interface DayDateBtnProps {
1415
const DayDateBtn = ({ selectedDate, onChange }: DayDateBtnProps) => {
1516
const { locale, navigationPickerProps } = useStore();
1617
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
18+
const { prevDisabled, nextDisabled } = useArrowDisable();
1719

1820
const handleOpen = (event: React.MouseEvent<HTMLButtonElement>) => {
1921
setAnchorEl(event.currentTarget);
@@ -31,13 +33,20 @@ const DayDateBtn = ({ selectedDate, onChange }: DayDateBtnProps) => {
3133
const prevDay = addDays(selectedDate, -1);
3234
onChange(prevDay);
3335
};
36+
3437
const handleNext = () => {
3538
const nexDay = addDays(selectedDate, 1);
3639
onChange(nexDay);
3740
};
41+
3842
return (
3943
<>
40-
<LocaleArrow type="prev" onClick={handlePrev} aria-label="previous day" />
44+
<LocaleArrow
45+
type="prev"
46+
onClick={handlePrev}
47+
disabled={prevDisabled}
48+
aria-label="previous day"
49+
/>
4150
<Button style={{ padding: 4 }} onClick={handleOpen} aria-label="selected date">
4251
{format(selectedDate, "dd MMMM yyyy", { locale })}
4352
</Button>
@@ -60,7 +69,7 @@ const DayDateBtn = ({ selectedDate, onChange }: DayDateBtnProps) => {
6069
/>
6170
</DateProvider>
6271
</Popover>
63-
<LocaleArrow type="next" onClick={handleNext} aria-label="next day" />
72+
<LocaleArrow type="next" onClick={handleNext} disabled={nextDisabled} aria-label="next day" />
6473
</>
6574
);
6675
};

src/lib/components/nav/MonthDateBtn.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Button, Popover } from "@mui/material";
55
import { format, getMonth, setMonth } from "date-fns";
66
import { LocaleArrow } from "../common/LocaleArrow";
77
import useStore from "../../hooks/useStore";
8+
import useArrowDisable from "../../hooks/useArrowDisable";
89

910
interface MonthDateBtnProps {
1011
selectedDate: Date;
@@ -15,6 +16,7 @@ const MonthDateBtn = ({ selectedDate, onChange }: MonthDateBtnProps) => {
1516
const { locale, navigationPickerProps } = useStore();
1617
const currentMonth = getMonth(selectedDate);
1718
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
19+
const { prevDisabled, nextDisabled } = useArrowDisable();
1820

1921
const handleOpen = (event: React.MouseEvent<HTMLButtonElement>) => {
2022
setAnchorEl(event.currentTarget);
@@ -37,7 +39,12 @@ const MonthDateBtn = ({ selectedDate, onChange }: MonthDateBtnProps) => {
3739
};
3840
return (
3941
<>
40-
<LocaleArrow type="prev" onClick={handlePrev} aria-label="previous month" />
42+
<LocaleArrow
43+
type="prev"
44+
onClick={handlePrev}
45+
disabled={prevDisabled}
46+
aria-label="previous month"
47+
/>
4148
<Button style={{ padding: 4 }} onClick={handleOpen} aria-label="selected month">
4249
{format(selectedDate, "MMMM yyyy", { locale })}
4350
</Button>
@@ -60,7 +67,12 @@ const MonthDateBtn = ({ selectedDate, onChange }: MonthDateBtnProps) => {
6067
/>
6168
</DateProvider>
6269
</Popover>
63-
<LocaleArrow type="next" onClick={handleNext} aria-label="next month" />
70+
<LocaleArrow
71+
type="next"
72+
onClick={handleNext}
73+
disabled={nextDisabled}
74+
aria-label="next month"
75+
/>
6476
</>
6577
);
6678
};

src/lib/components/nav/WeekDateBtn.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { WeekProps } from "../../views/Week";
66
import { LocaleArrow } from "../common/LocaleArrow";
77
import { DateCalendar } from "@mui/x-date-pickers";
88
import useStore from "../../hooks/useStore";
9+
import useArrowDisable from "../../hooks/useArrowDisable";
910

1011
interface WeekDateBtnProps {
1112
selectedDate: Date;
@@ -19,6 +20,7 @@ const WeekDateBtn = ({ selectedDate, onChange, weekProps }: WeekDateBtnProps) =>
1920
const { weekStartOn } = weekProps;
2021
const weekStart = startOfWeek(selectedDate, { weekStartsOn: weekStartOn });
2122
const weekEnd = endOfWeek(selectedDate, { weekStartsOn: weekStartOn });
23+
const { prevDisabled, nextDisabled } = useArrowDisable();
2224

2325
const handleOpen = (event: React.MouseEvent<HTMLButtonElement>) => {
2426
setAnchorEl(event.currentTarget);
@@ -44,7 +46,12 @@ const WeekDateBtn = ({ selectedDate, onChange, weekProps }: WeekDateBtnProps) =>
4446

4547
return (
4648
<>
47-
<LocaleArrow type="prev" onClick={handlePrev} aria-label="previous week" />
49+
<LocaleArrow
50+
type="prev"
51+
onClick={handlePrev}
52+
disabled={prevDisabled}
53+
aria-label="previous week"
54+
/>
4855
<Button style={{ padding: 4 }} onClick={handleOpen} aria-label="selected week">
4956
{`${format(weekStart, "dd", { locale })} - ${format(weekEnd, "dd MMM yyyy", {
5057
locale,
@@ -69,7 +76,12 @@ const WeekDateBtn = ({ selectedDate, onChange, weekProps }: WeekDateBtnProps) =>
6976
/>
7077
</DateProvider>
7178
</Popover>
72-
<LocaleArrow type="next" onClick={handleNext} aria-label="next week" />
79+
<LocaleArrow
80+
type="next"
81+
onClick={handleNext}
82+
disabled={nextDisabled}
83+
aria-label="next week"
84+
/>
7385
</>
7486
);
7587
};

src/lib/hooks/useArrowDisable.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { endOfMonth, endOfWeek, startOfMonth, startOfWeek } from "date-fns";
2+
import useStore from "./useStore";
3+
4+
const useArrowDisable = () => {
5+
const { selectedDate, week, navigationPickerProps, view } = useStore();
6+
const minDate = navigationPickerProps?.minDate;
7+
const maxDate = navigationPickerProps?.maxDate;
8+
const endDate =
9+
view === "month"
10+
? endOfMonth(selectedDate)
11+
: view === "week"
12+
? endOfWeek(selectedDate, { weekStartsOn: week?.weekStartOn })
13+
: selectedDate;
14+
const startDate =
15+
view === "month"
16+
? startOfMonth(selectedDate)
17+
: view === "week"
18+
? startOfWeek(selectedDate, { weekStartsOn: week?.weekStartOn })
19+
: selectedDate;
20+
const prevDisabled = minDate ? startDate <= minDate : false;
21+
const nextDisabled = maxDate ? endDate >= maxDate : false;
22+
23+
return { prevDisabled, nextDisabled };
24+
};
25+
26+
export default useArrowDisable;

0 commit comments

Comments
 (0)