@@ -323,29 +323,66 @@ registerBlockType('simple-events/event-info', {
323323 } ;
324324 } , [ ] ) ;
325325
326- // Trigger date save when post is being saved
326+ // Save dates before post save begins
327327 useEffect ( ( ) => {
328- const saveDatesOnPostSave = async ( ) => {
329- if ( isSavingPost && ! isAutosavingPost && dateManagerState ?. getCurrentDates ( ) ?. dates ) {
330- try {
331- await saveEventDatesOnPostSave ( dateManagerState . getCurrentDates ( ) . dates , dateManagerState ) ;
332- } catch ( error ) {
333- console . error ( 'Failed to save event dates on post save:' , error ) ;
334- }
328+ let wasSaving = false ;
329+ let dateSavePromise = null ;
330+
331+ const unsubscribe = window . wp . data . subscribe ( ( ) => {
332+ const { isSavingPost, isAutosavingPost } = window . wp . data . select ( 'core/editor' ) ;
333+ const currentSaving = isSavingPost ( ) ;
334+ const currentAutosaving = isAutosavingPost ( ) ;
335+
336+ // Detect when save is about to start (transition from false to true)
337+ if ( currentSaving && ! currentAutosaving && ! wasSaving && dateManagerState ?. getCurrentDates ( ) ?. dates ) {
338+ // Save dates immediately before post save continues
339+ dateSavePromise = saveEventDatesOnPostSave ( dateManagerState . getCurrentDates ( ) . dates , dateManagerState )
340+ . then ( ( savedDates ) => {
341+ if ( savedDates && savedDates . dates ) {
342+ setAttributes ( {
343+ eventDates : savedDates . dates
344+ } ) ;
345+ }
346+ dateSavePromise = null ;
347+ } )
348+ . catch ( ( error ) => {
349+ console . error ( 'Failed to save event dates before post save:' , error ) ;
350+ dateSavePromise = null ;
351+ } ) ;
352+ }
353+
354+ // Detect when save finishes but date sync is still in progress
355+ if ( ! currentSaving && wasSaving && dateSavePromise ) {
356+ // Wait for date sync to complete, then save again
357+ dateSavePromise . then ( ( ) => {
358+ // Trigger another post save to include the updated dates
359+ window . wp . data . dispatch ( 'core/editor' ) . savePost ( ) ;
360+ } ) ;
335361 }
336- } ;
337362
338- saveDatesOnPostSave ( ) ;
339- } , [ isSavingPost , isAutosavingPost , dateManagerState ] ) ;
363+ wasSaving = currentSaving ;
364+ } ) ;
365+
366+ return ( ) => unsubscribe ( ) ;
367+ } , [ dateManagerState , setAttributes ] ) ;
340368
341369 // Sync dateManagerState dates to block attributes
342370 useEffect ( ( ) => {
343371 if ( dateManagerState ?. getCurrentDates ( ) ?. dates ) {
344- setAttributes ( {
345- eventDates : dateManagerState . getCurrentDates ( ) . dates
346- } ) ;
372+ // Get current block attributes
373+ const currentEventDates = attributes . eventDates || [ ] ;
374+ const newEventDates = dateManagerState . getCurrentDates ( ) . dates ;
375+
376+ // Compare the dates to see if they're actually different
377+ const datesChanged = JSON . stringify ( currentEventDates ) !== JSON . stringify ( newEventDates ) ;
378+
379+ if ( datesChanged ) {
380+ setAttributes ( {
381+ eventDates : newEventDates
382+ } ) ;
383+ }
347384 }
348- } , [ dateManagerState , refreshCounter , setAttributes ] ) ;
385+ } , [ dateManagerState , refreshCounter , setAttributes , attributes . eventDates ] ) ;
349386
350387 // Check if we should be in edit mode based on missing data
351388 useEffect ( ( ) => {
@@ -372,7 +409,7 @@ registerBlockType('simple-events/event-info', {
372409 setDateManagerReady ( true ) ;
373410 setDateManagerState ( manager ) ;
374411 } catch ( error ) {
375- console . error ( 'Failed to initialize date manager:' , error ) ;
412+ console . error ( '❌ Failed to initialize date manager:' , error ) ;
376413 } finally {
377414 setIsGettingDates ( false ) ;
378415 }
@@ -534,7 +571,9 @@ registerBlockType('simple-events/event-info', {
534571 * @return {JSX.Element|null } Warning component or null if no unsaved changes.
535572 */
536573 const UnsavedChangesWarning = ( ) => {
537- if ( ! dateManagerState ?. getCurrentDates ( ) ?. isDirty ) {
574+ const isDirty = dateManagerState ?. getCurrentDates ( ) ?. isDirty ;
575+
576+ if ( ! isDirty ) {
538577 return null ;
539578 }
540579
@@ -618,30 +657,33 @@ registerBlockType('simple-events/event-info', {
618657 *
619658 * @return {JSX.Element } The preview component with ServerSideRender.
620659 */
621- const renderPreview = ( ) => (
622- < div { ...useBlockProps ( ) } >
623- { getBlockControls ( ) }
624- < UnsavedChangesWarning />
625- < Disabled >
626- < ServerSideRender
627- block = "simple-events/event-info"
628- additionalQueryArgs = { {
629- context : 'edit'
630- } }
631- attributes = { {
632- eventVenue : meta ?. se_event_venue ,
633- eventLocation : meta ?. se_event_location ,
634- eventDates : dateManagerState ?. getCurrentDates ( ) ?. dates ,
635- eventTimezone : dateManagerState ?. getCurrentDates ( ) ?. timezone ?? meta ?. se_event_timezone ,
636- externalLink : meta ?. se_event_external_link ,
637- externalLinkLabel : meta ?. se_event_external_link_label ,
638- addCalendarLinks : meta ?. se_event_add_calendar_links ,
639- } }
660+ const renderPreview = ( ) => {
661+ const attributes = {
662+ eventVenue : meta ?. se_event_venue ,
663+ eventLocation : meta ?. se_event_location ,
664+ eventDates : dateManagerState ?. getCurrentDates ( ) ?. dates ,
665+ eventTimezone : dateManagerState ?. getCurrentDates ( ) ?. timezone ?? meta ?. se_event_timezone ,
666+ externalLink : meta ?. se_event_external_link ,
667+ externalLinkLabel : meta ?. se_event_external_link_label ,
668+ addCalendarLinks : meta ?. se_event_add_calendar_links ,
669+ } ;
640670
641- />
642- </ Disabled >
643- </ div >
644- ) ;
671+ return (
672+ < div { ...useBlockProps ( ) } >
673+ { getBlockControls ( ) }
674+ < UnsavedChangesWarning />
675+ < Disabled >
676+ < ServerSideRender
677+ block = "simple-events/event-info"
678+ additionalQueryArgs = { {
679+ context : 'edit'
680+ } }
681+ attributes = { attributes }
682+ />
683+ </ Disabled >
684+ </ div >
685+ ) ;
686+ } ;
645687
646688 if ( ! editMode ) {
647689 return renderPreview ( ) ;
0 commit comments