Skip to content

Commit 0494a38

Browse files
authored
Merge pull request #25 from gin0115/fix/2_0_0__release-bugs
Fixed issue where sometimes a timezone object is passed not a string …
2 parents 3640bc7 + 9d64863 commit 0494a38

File tree

3 files changed

+105
-47
lines changed

3 files changed

+105
-47
lines changed

src/blocks/event-info/event-manager.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { sortBy, isEqual, clone } from 'lodash';
22
import { getStartAndEndDate, createDefaultDate, getDstOffset, TIMEZONE, OFFSET } from './date-utils';
33
import moment from 'moment';
4+
import { select } from '@wordpress/data';
5+
46

57
/**
68
* Date Manager Service
@@ -25,11 +27,15 @@ import moment from 'moment';
2527
* @param {string} end The end time of the date.
2628
* @return {string} A unique hash for the date.
2729
*/
28-
const createDateHash = (start, end) => {
29-
// Get the current timestamp.
30-
const timestamp = Date.now();
30+
const createDateHash = (start, end, postId) => {
31+
// If the post id is not passed, use the editor post id.
32+
if (!postId) {
33+
// Generate a radom string with alphanumeric characters.
34+
const randomString = Math.random().toString(36).substring(2, 15);
35+
postId = select('core/editor').getCurrentPostId() + randomString;
36+
}
3137
// Create a hash using the start and end times along with the timestamp.
32-
const hash = `${start}-${end}-${timestamp}`;
38+
const hash = `${start}-${end}-${postId}`;
3339
return hash;
3440
}
3541

@@ -48,7 +54,6 @@ const createDateHash = (start, end) => {
4854
* @return {Object} Date management service with public interface.
4955
*/
5056
export const dateManager = (initialDates = [], timezone = '', metaSync = null) => {
51-
5257
// lOOP through dates and add a hash to each date
5358
initialDates.dates.forEach(date => {
5459
date.hash = createDateHash(date.start_date, date.end_date);
@@ -93,7 +98,6 @@ export const dateManager = (initialDates = [], timezone = '', metaSync = null) =
9398
originalTimezone = currentTimezone;
9499
}
95100

96-
97101
return getCurrentDates();
98102
};
99103

@@ -109,11 +113,13 @@ export const dateManager = (initialDates = [], timezone = '', metaSync = null) =
109113
*/
110114
const getCurrentDates = () => {
111115
const timezoneChanged = currentTimezone !== originalTimezone;
112-
return {
116+
const result = {
113117
dates: currentDates,
114118
timezone: currentTimezone,
115119
isDirty: isDirty || timezoneChanged,
116120
};
121+
122+
return result;
117123
}
118124

119125
/**

src/blocks/event-info/index.js

Lines changed: 82 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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();

src/event-functions.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,16 @@ function ( $date_id ) {
778778
* @return DateTime The created DateTime object.
779779
*/
780780
function se_create_date_time_from_timestamp( $timestamp, $timezone = null ): DateTime {
781+
// If we have a timezone instance, get its name.
782+
if ( $timezone instanceof DateTimeZone ) {
783+
$timezone = $timezone->getName();
784+
}
785+
786+
// If we still dont have a string or its empty, use the site timezone.
787+
if ( ! is_string( $timezone ) || empty( $timezone ) ) {
788+
$timezone = null;
789+
}
790+
781791
/**
782792
* If no timezone is passed, use the site timezone
783793
*/

0 commit comments

Comments
 (0)