Skip to content

Conversation

@plebcity
Copy link
Contributor

@plebcity plebcity commented Jun 3, 2025

Refactored calendarfetcherutils to remove as many of the date conversions as possible and use moment tz when calculating recurring events, this will make debugging a lot easier and fixes problems from the past with offsets and DST not being handled properly. Also added some tests to test the behavior of the refactored methodes to make sure the correct event dates are returned.

Refactored calendar.js aswell to make sure the unix UTC start and end date of events are properly converted to a local timezone and displayed correctly for the user.

This PR relates to: #3797

@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from d7ce842 to d4cd5a1 Compare June 3, 2025 20:45
@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from 6b2d17d to 4cc7cab Compare June 4, 2025 20:10
@plebcity
Copy link
Contributor Author

plebcity commented Jun 4, 2025

There is something broken, I will try to fix it tomorrow. I now have an ics calendar to test all cases locally so that should make it easier to find the bug. I took a quick look and it looks like some events might not have a timezone in the start field (probably full day events)

@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from 4cc7cab to 93e1bbc Compare June 4, 2025 20:59
@sdetweil
Copy link
Collaborator

sdetweil commented Jun 4, 2025

correct, full day events are always considered to be local time

today, wherever you are

there can be local time events as well without timezone

all of the test cases use ics files from the mock folder with specific clock dates and times set in the testcase runner

@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from 611b7b5 to ed08eb0 Compare June 5, 2025 11:31
plebcity and others added 4 commits June 5, 2025 13:47
…ions as possible and use moment tz when calculating recurring events, this will make debugging a lot easier and fixes problems from the past with offsets and DST not being handled properly. Also added some tests to test the behavior of the refactored methodes to make sure the correct event dates are returned
…ate of an event to the proper timezone. This should now display the correct times in the DOM
…ta should be loaded. Also fixed a bug when determining new recurring events with an original timezone
@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from ed08eb0 to 7f22e9a Compare June 5, 2025 11:47
@sdetweil
Copy link
Collaborator

sdetweil commented Jun 5, 2025

have you tested w modules that use the calendar broadcast

MMM-CalendarExt3 (there are multiple modules in the family)
MMM-MonthlyCalendar

i think there are more.
if the data changed, they are broken

im guessing they will be broken as you changed to calendar ui side too

@plebcity
Copy link
Contributor Author

plebcity commented Jun 5, 2025

have you tested w modules that use the calendar broadcast

MMM-CalendarExt3 (there are multiple modules in the family) MMM-MonthlyCalendar

i think there are more. if the data changed, they are broken

im guessing they will be broken as you changed to calendar ui side too

No I haven't tested those yet. They could be broken because the timestamps of startDate and endDate are now always in UTC timezone and they use the proper unix timestamp instead of the format('x') which adds 3 extra 0's at the end for milliseconds. Locally everything works fine with my own calendar's now but can't seem te figure out why electron shows errors.

Koen Konst added 3 commits June 5, 2025 19:54
… wasn't expecting the correct result since Sydney is +10 but the asserted time was only +2 from Berlin so +4 in total
@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from c1f6b22 to 0fb0be0 Compare June 6, 2025 08:53
…running events, now subtracted the event duration from the searchFromDate
@plebcity
Copy link
Contributor Author

plebcity commented Jun 6, 2025

have you tested w modules that use the calendar broadcast

MMM-CalendarExt3 (there are multiple modules in the family) MMM-MonthlyCalendar

i think there are more. if the data changed, they are broken

im guessing they will be broken as you changed to calendar ui side too

Do you think it's important to stay backwards compatible with millisecond timestamps instead of using the second based unix timestamp? If so then I will change the return timestamps back to milliseconds and change the calendar.js to first convert it back to unix.

…at(x) so the timestamps returned will be in milliseconds again instead of the unix timestamp in seconds, changed calendar.js accordingly
@plebcity plebcity force-pushed the fix-calendar-fetcher-util-for-dst branch from 505632b to 7e2690f Compare June 6, 2025 10:01
@plebcity
Copy link
Contributor Author

plebcity commented Jun 6, 2025

@sdetweil All tests have passed and I have made the necessary changes to make this backwards compatible with the old event broadcast, so timestamps are milliseconds and strings again. This will hopefully make it much easier to work with and more robust to edge cases in timezones.
Also after this PR is merged I will create an issue to migrate magicmirror to Luxon since moment and moment-timezone is in maintenance mode right now. I thought it was too much of change to introduce Luxon to magicmirror right now since moment and moment-timezone were already being used.

Copy link
Collaborator

@KristjanESPERANTO KristjanESPERANTO left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good work 👍

Also after this PR is merged I will create an issue to migrate magicmirror to Luxon since moment and moment-timezone is in maintenance mode right now.

I recommend opening a general issue for replacing 'moment' because Luxon is not the only option. We should talk about all options before we decide.

@plebcity
Copy link
Contributor Author

plebcity commented Jun 6, 2025

Good work 👍
I recommend opening a general issue for replacing 'moment' because Luxon is not the only option. We should talk about all options before we decide.

Thanks! I created a new issue for it with a broader scope: #3808

let d1;
let d2;

// TODO This should be a seperate function.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so why not do it in this PR?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I felt like this was too much of a change right now so I left a TODO for somebody else to fix in the future or whenever I have some more time to fix this myself. What I meant with this TODO is change the entire flow of the createEventList method to seperate recurring events from single events. Then you probably also want to extract the push to newEvents aswell.

@rejas rejas merged commit faf15ad into MagicMirrorOrg:develop Jun 7, 2025
12 of 15 checks passed
@plebcity plebcity deleted the fix-calendar-fetcher-util-for-dst branch June 7, 2025 13:20
rejas pushed a commit that referenced this pull request Jun 9, 2025
In PR #3806 I noticed that ESLint did not complain about the use of
`console`. Then I realised that the rule `no-console` was not activated.
I have now changed this and replaced a few places where `console` was
used.

We can't apply the rule to all .js files because not all of them use our
logger. Therefore I had to add an extra config block for it.
@khassel khassel mentioned this pull request Jun 30, 2025
khassel added a commit that referenced this pull request Jun 30, 2025
## [2.32.0] - 2025-07-01

Thanks to: @bughaver, @bugsounet, @khassel, @KristjanESPERANTO,
@plebcity, @rejas, @sdetweil.

> ⚠️ This release needs nodejs version `v22.14.0 or higher`

### Added

- [config] Allow to change module order for final renderer (or
dynamically with CSS): Feature `order` in config (#3762)
- [clock] Added option 'disableNextEvent' to hide next sun event (#3769)
- [clock] Implement short syntax for clock week (#3775)

### Changed

- [refactor] Simplify module loading process (#3766)
- Use `node --run` instead of `npm run` (#3764) and adapt `start:dev`
script (#3773)
- [workflow] Run linter and spellcheck with LTS node version (#3767)
- [workflow] Split "Run test" step into two steps for more clarity
(#3767)
- [linter] Review linter setup (#3783)
  - Fix command to lint markdown in `CONTRIBUTING.md`
  - Re-activate JSDoc linting and fix linting issues
  - Refactor ESLint config to use `defineConfig` and `globalIgnores`
  - Replace `eslint-plugin-import` with `eslint-plugin-import-x`
- Switch Stylelint config to flat format and simplify Stylelint scripts
- [workflow] Replace Node.js version v23 with v24 (#3770)
- [refactor] Replace deprecated constants `fs.F_OK` and `fs.R_OK`
(#3789)
- [refactor] Replace `ansis` with built-in function `util.styleText`
(#3793)
- [core] Integrate stuff from `vendor` and `fonts` folders into main
`package.json`, simplifies install and maintaining dependencies (#3795,
#3805)
- [l10n] Complete translations (with the help of translation tools)
(#3794)
- [refactor] Refactored `calendarfetcherutils` in Calendar module to
handle timezones better (#3806)
  - Removed as many of the date conversions as possible
- Use `moment-timezone` when calculating recurring events, this will fix
problems from the past with offsets and DST not being handled properly
- Added some tests to test the behavior of the refactored methods to
make sure the correct event dates are returned
- [linter] Enable ESLint rule `no-console` and replace `console` with
`Log` in some files (#3810)
- [tests] Review and refactor translation tests (#3792)

### Fixed

- [fix] Handle spellcheck issues (#3783)
- [calendar] fix fullday event rrule until with timezone offset (#3781)
- [feat] Add rule `no-undef` in config file validation to fix #3785
(#3786)
- [fonts] Fix `roboto.css` to avoid error message `Unknown descriptor
'var(' in @font-face rule.` in firefox console (#3787)
- [tests] Fix and refactor e2e test `Same keys` in
`translations_spec.js` (#3809)
- [tests] Fix e2e tests newsfeed and calendar to exit without open
handles (#3817)

### Updated

- [core] Update dependencies including electron to v36 (#3774, #3788,
#3811, #3804, #3815, #3823)
- [core] Update package type to `commonjs`
- [logger] Review factory code part: use `switch/case` instead of
`if/else if` (#3812)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Michael Teeuw <michael@xonaymedia.nl>
Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ross Younger <crazyscot@gmail.com>
Co-authored-by: Veeck <github@veeck.de>
Co-authored-by: Bugsounet - Cédric <github@bugsounet.fr>
Co-authored-by: jkriegshauser <joshuakr@nvidia.com>
Co-authored-by: illimarkangur <116028111+illimarkangur@users.noreply.github.com>
Co-authored-by: sam detweiler <sdetweil@gmail.com>
Co-authored-by: vppencilsharpener <tim.pray@gmail.com>
Co-authored-by: veeck <michael.veeck@nebenan.de>
Co-authored-by: Paranoid93 <6515818+Paranoid93@users.noreply.github.com>
Co-authored-by: Brian O'Connor <btoconnor@users.noreply.github.com>
Co-authored-by: WallysWellies <59727507+WallysWellies@users.noreply.github.com>
Co-authored-by: Jason Stieber <jrstieber@gmail.com>
Co-authored-by: jargordon <50050429+jargordon@users.noreply.github.com>
Co-authored-by: Daniel <32464403+dkallen78@users.noreply.github.com>
Co-authored-by: Ryan Williams <65094007+ryan-d-williams@users.noreply.github.com>
Co-authored-by: Panagiotis Skias <panagiotis.skias@gmail.com>
Co-authored-by: Marc Landis <dirk.rettschlag@gmail.com>
Co-authored-by: HeikoGr <20295490+HeikoGr@users.noreply.github.com>
Co-authored-by: Pedro Lamas <pedrolamas@gmail.com>
Co-authored-by: veeck <gitkraken@veeck.de>
Co-authored-by: Magnus <34011212+MagMar94@users.noreply.github.com>
Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com>
Co-authored-by: DevIncomin <56730075+Developer-Incoming@users.noreply.github.com>
Co-authored-by: Nathan <n8nyoung@gmail.com>
Co-authored-by: mixasgr <mixasgr@users.noreply.github.com>
Co-authored-by: Savvas Adamtziloglou <savvas-gr@greeklug.gr>
Co-authored-by: Konstantinos <geraki@gmail.com>
Co-authored-by: OWL4C <124401812+OWL4C@users.noreply.github.com>
Co-authored-by: BugHaver <43462320+bughaver@users.noreply.github.com>
Co-authored-by: BugHaver <43462320+lsaadeh@users.noreply.github.com>
Co-authored-by: Koen Konst <koenspero@gmail.com>
Co-authored-by: Koen Konst <c.h.konst@avisi.nl>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants