1- import React , { FC , MouseEvent } from "react" ;
1+ import React , { FC , MouseEvent , useCallback , useMemo , useState } from "react" ;
22import { FloatingFocusManager } from "@floating-ui/react" ;
33import { YEAR_MONTH_DAY_FORMAT } from "@core/constants/date.constants" ;
4- import { Categories_Event } from "@core/types/event.types" ;
4+ import {
5+ Categories_Event ,
6+ RecurringEventUpdateScope ,
7+ } from "@core/types/event.types" ;
58import { PartialMouseEvent } from "@web/common/types/util.types" ;
69import { Schema_GridEvent } from "@web/common/types/web.event.types" ;
710import { getEventDragOffset } from "@web/common/utils/event.util" ;
11+ import { useDraftContext } from "@web/views/Calendar/components/Draft/context/useDraftContext" ;
12+ import { GridEvent } from "@web/views/Calendar/components/Event/Grid" ;
813import { useGridEventMouseDown } from "@web/views/Calendar/hooks/grid/useGridEventMouseDown" ;
914import { Measurements_Grid } from "@web/views/Calendar/hooks/grid/useGridLayout" ;
1015import { WeekProps } from "@web/views/Calendar/hooks/useWeek" ;
1116import { EventForm } from "@web/views/Forms/EventForm/EventForm" ;
17+ import { RecurringEventUpdateScopeDialog } from "@web/views/Forms/EventForm/RecurringEventUpdateScopeDialog" ;
1218import { StyledFloatContainer } from "@web/views/Forms/SomedayEventForm/styled" ;
13- import { GridEvent } from "../../Event/Grid" ;
14- import { useDraftContext } from "../context/useDraftContext" ;
1519
1620interface Props {
1721 draft : Schema_GridEvent ;
@@ -23,8 +27,9 @@ interface Props {
2327
2428export const GridDraft : FC < Props > = ( { measurements, weekProps } ) => {
2529 const { actions, setters, state } = useDraftContext ( ) ;
26- const { discard, deleteEvent, duplicateEvent, submit, startDragging } =
27- actions ;
30+ const { discard, deleteEvent, duplicateEvent, submit } = actions ;
31+ const { startDragging, isRecurrenceChanged } = actions ;
32+ const { isInstance, isRecurrence, isEventDirty } = actions ;
2833 const { setDraft, setDateBeingChanged, setIsResizing } = setters ;
2934 const { draft, isDragging, formProps, isFormOpen, isResizing } = state ;
3035 const { context, getReferenceProps, getFloatingProps, x, y, refs, strategy } =
@@ -55,6 +60,46 @@ export const GridDraft: FC<Props> = ({ measurements, weekProps }) => {
5560 startDragging ( ) ;
5661 } ;
5762
63+ const [
64+ isRecurrenceUpdateScopeDialogOpen ,
65+ setRecurrenceUpdateScopeDialogOpen ,
66+ ] = useState < boolean > ( false ) ;
67+
68+ const [ finalDraft , setFinalDraft ] = useState < Schema_GridEvent | null > ( null ) ;
69+
70+ const onUpdateScopeChange = useCallback (
71+ ( applyTo : RecurringEventUpdateScope ) => {
72+ if ( finalDraft ) {
73+ submit ( finalDraft , applyTo ) ;
74+ setFinalDraft ( null ) ;
75+ discard ( ) ;
76+ }
77+ } ,
78+ [ finalDraft , submit , setFinalDraft , discard ] ,
79+ ) ;
80+
81+ const onSubmit = useCallback (
82+ async ( _draft : Schema_GridEvent ) => {
83+ if ( isEventDirty ( _draft ) && isRecurrence ( _draft ) ) {
84+ setFinalDraft ( _draft ) ;
85+
86+ return setRecurrenceUpdateScopeDialogOpen ( true ) ;
87+ }
88+
89+ submit ( _draft ) ;
90+ discard ( ) ;
91+ } ,
92+ [
93+ submit ,
94+ setRecurrenceUpdateScopeDialogOpen ,
95+ isRecurrenceChanged ,
96+ setFinalDraft ,
97+ isEventDirty ,
98+ isRecurrence ,
99+ discard ,
100+ ] ,
101+ ) ;
102+
58103 const { onMouseDown } = useGridEventMouseDown (
59104 draft ?. isAllDay ? Categories_Event . ALLDAY : Categories_Event . TIMED ,
60105 handleClick ,
@@ -78,7 +123,7 @@ export const GridDraft: FC<Props> = ({ measurements, weekProps }) => {
78123 onMouseDown ( e , event ) ;
79124 } }
80125 onScalerMouseDown = { (
81- event : Schema_GridEvent ,
126+ _event : Schema_GridEvent ,
82127 e : MouseEvent ,
83128 dateToChange : "startDate" | "endDate" ,
84129 ) => {
@@ -108,13 +153,25 @@ export const GridDraft: FC<Props> = ({ measurements, weekProps }) => {
108153 onConvert = { onConvert }
109154 onDelete = { deleteEvent }
110155 onDuplicate = { duplicateEvent }
111- onSubmit = { ( _draft : Schema_GridEvent ) => submit ( _draft ) }
156+ onSubmit = { onSubmit }
112157 setEvent = { setDraft }
113158 />
114159 </ StyledFloatContainer >
115160 </ FloatingFocusManager >
116161 ) }
117162 </ div >
163+
164+ { useMemo (
165+ ( ) => (
166+ < RecurringEventUpdateScopeDialog
167+ open = { isRecurrenceUpdateScopeDialogOpen }
168+ priority = { draft . priority }
169+ onOpenChange = { setRecurrenceUpdateScopeDialogOpen }
170+ onSubmit = { onUpdateScopeChange }
171+ />
172+ ) ,
173+ [ isRecurrenceUpdateScopeDialogOpen , setRecurrenceUpdateScopeDialogOpen ] ,
174+ ) }
118175 </ >
119176 ) ;
120177} ;
0 commit comments