Skip to content

Commit cf4faee

Browse files
committed
refactor: extract draft form handling into separate hook
This change extracts the form-related logic from useDraftUtil into a new useDraftForm hook, improving separation of concerns and making the draft utility more modular. The new hook encapsulates form open/close behavior and form props management.
1 parent a79cdb2 commit cf4faee

File tree

2 files changed

+55
-44
lines changed

2 files changed

+55
-44
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { OpenChangeReason } from "@floating-ui/react";
2+
import { useEventForm } from "@web/views/Forms/hooks/useEventForm";
3+
4+
export const useDraftForm = (
5+
isFormOpen: boolean,
6+
reset: () => void,
7+
discard: () => void,
8+
setIsFormOpen: (isOpen: boolean) => void
9+
) => {
10+
const onIsFormOpenChange = (isOpen: boolean, reason?: OpenChangeReason) => {
11+
const formAlreadyOpen = isFormOpen === true;
12+
13+
if (formAlreadyOpen) {
14+
reset();
15+
16+
// Not including click or outside press reasons
17+
// to avoid conflicting with custom mouse
18+
// handlers (useMouseHandlers.ts)
19+
if (reason === "escape-key") {
20+
discard();
21+
}
22+
return;
23+
}
24+
setIsFormOpen(isOpen);
25+
26+
if (isOpen === false) {
27+
reset();
28+
discard();
29+
}
30+
};
31+
const formProps = useEventForm("grid", isFormOpen, onIsFormOpenChange);
32+
return { formProps };
33+
};

packages/web/src/views/Calendar/hooks/draft/useDraftUtil.ts

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { MouseEvent, useCallback, useEffect, useState } from "react";
22
import dayjs, { Dayjs } from "dayjs";
3-
import { OpenChangeReason } from "@floating-ui/react";
43
import {
54
Priorities,
65
SOMEDAY_WEEK_LIMIT_MSG,
@@ -26,7 +25,6 @@ import {
2625
selectDraftStatus,
2726
} from "@web/ducks/events/selectors/draft.selectors";
2827
import { GRID_TIME_STEP } from "@web/views/Calendar/layout.constants";
29-
import { useEventForm } from "@web/views/Forms/hooks/useEventForm";
3028
import {
3129
selectIsAtWeeklyLimit,
3230
selectSomedayWeekCount,
@@ -35,6 +33,7 @@ import { getUserId } from "@web/auth/auth.util";
3533

3634
import { DateCalcs } from "../grid/useDateCalcs";
3735
import { WeekProps } from "../useWeek";
36+
import { useDraftForm } from "./form/useDraftForm";
3837
export interface Status_Drag {
3938
durationMin: number;
4039
hasMoved?: boolean;
@@ -71,38 +70,6 @@ export const useDraftUtil = (
7170
"startDate" | "endDate" | null
7271
>("endDate");
7372
const [isFormOpen, setIsFormOpen] = useState(false);
74-
const onIsFormOpenChange = (isOpen: boolean, reason?: OpenChangeReason) => {
75-
const formAlreadyOpen = isFormOpen === true;
76-
77-
if (formAlreadyOpen) {
78-
reset();
79-
80-
// Not including click or outside press reasons
81-
// to avoid conflicting with custom mouse
82-
// handlers (useMouseHandlers.ts)
83-
if (reason === "escape-key") {
84-
discard();
85-
}
86-
return;
87-
}
88-
setIsFormOpen(isOpen);
89-
90-
if (isOpen === false) {
91-
reset();
92-
discard();
93-
}
94-
};
95-
const formProps = useEventForm("grid", isFormOpen, onIsFormOpenChange);
96-
97-
const reset = () => {
98-
setDraft(null);
99-
setIsDragging(false);
100-
setIsFormOpen(false);
101-
setIsResizing(false);
102-
setDragStatus(null);
103-
setResizeStatus(null);
104-
setDateBeingChanged(null);
105-
};
10673

10774
useEffect(() => {
10875
reset();
@@ -124,6 +91,25 @@ export const useDraftUtil = (
12491
}
12592
}, [isDrafting, isFormOpen]);
12693

94+
const reset = () => {
95+
setDraft(null);
96+
setIsDragging(false);
97+
setIsFormOpen(false);
98+
setIsResizing(false);
99+
setDragStatus(null);
100+
setResizeStatus(null);
101+
setDateBeingChanged(null);
102+
};
103+
const discard = useCallback(() => {
104+
if (draft) {
105+
setDraft(null);
106+
}
107+
108+
if (reduxDraft || reduxDraftType) {
109+
dispatch(draftSlice.actions.discard());
110+
}
111+
}, [dispatch, draft, reduxDraft, reduxDraftType]);
112+
127113
const handleResizing = useCallback(() => {
128114
console.log("-setting local draft to:", reduxDraft);
129115
setDraft(reduxDraft);
@@ -225,16 +211,6 @@ export const useDraftUtil = (
225211
discard();
226212
};
227213

228-
const discard = useCallback(() => {
229-
if (draft) {
230-
setDraft(null);
231-
}
232-
233-
if (reduxDraft || reduxDraftType) {
234-
dispatch(draftSlice.actions.discard());
235-
}
236-
}, [dispatch, draft, reduxDraft, reduxDraftType]);
237-
238214
const drag = useCallback(
239215
(e: MouseEvent) => {
240216
const updateTimesDuringDrag = (e: MouseEvent) => {
@@ -445,6 +421,8 @@ export const useDraftUtil = (
445421
discard();
446422
};
447423

424+
const { formProps } = useDraftForm(isFormOpen, reset, discard, setIsFormOpen);
425+
448426
return {
449427
draftState: {
450428
draft,

0 commit comments

Comments
 (0)