Frontmatter
| id | 8563 |
| title | Prevent race condition in TimelineCanvas by making sections store update optional |
| state | Closed |
| labels | bugairefactoring |
| assignees | tobiu |
| createdAt | Jan 12, 2026, 12:19 AM |
| updatedAt | Jan 12, 2026, 12:27 AM |
| githubUrl | https://github.com/neomjs/neo/issues/8563 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 8398 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Jan 12, 2026, 12:27 AM |
Prevent race condition in TimelineCanvas by making sections store update optional
tobiu assigned to @tobiu on Jan 12, 2026, 12:27 AM

tobiu
Jan 12, 2026, 12:27 AM
Input from Gemini 3 Pro:
✦ I have implemented the fix to prevent the "sections" store race condition.
Changes:
- Shared Component: Added
updateSectionsStoreconfig (defaulttrue) toapps/portal/view/shared/content/Component.mjs. ModifiedmodifyMarkdownto only update the store if this flag is true.- Tickets Component: Set
updateSectionsStore: falseinapps/portal/view/news/tickets/Component.mjs. This prevents the base class from pushing Headlines to the store, allowing the subclass to exclusively manage the store with Timeline data.- Tickets Component: Added
constructto initializecontentComponentIdin the state provider, fixing the underlying ID resolution issue forTimelineCanvas.This ensures
TimelineCanvasonly receives valid Timeline updates and no longer gets "flashed" with headline data during navigation.
tobiu added parent issue #8398 on Jan 12, 2026, 12:27 AM
tobiu closed this issue on Jan 12, 2026, 12:27 AM
Portal.view.shared.content.Componentautomatically updates thesectionsstore with extracted headlines inmodifyMarkdown.Portal.view.news.tickets.Componentextends this class but overrides thesectionsstore with Timeline Data instead.This creates a race condition:
super.modifyMarkdown()runs and pushes Headlines to the store.TimelineCanvas(listening to the store) tries to render these Headlines as timeline events, causing glitches (or successfully finding a stray element and rendering a bogus graph).Tickets.Componentfinishes parsing and pushes Timeline Data to the store.TimelineCanvasupdates correctly.To fix this, we need to make the store update in the base class optional.
Proposed Change:
updateSectionsStore: trueconfig toPortal.view.shared.content.Component.modifyMarkdownwithif (this.updateSectionsStore).updateSectionsStore: falseinPortal.view.news.tickets.Component.