diff --git a/src/store.ts b/src/store.ts index 7288c8f..6d77e3b 100644 --- a/src/store.ts +++ b/src/store.ts @@ -516,7 +516,16 @@ export const useStoryStore = create()( const startPassage = storyData.passagesById.get(storyData.startNode); if (!startPassage) return; + // Reset renderDeferred before firing beforerestart so we can detect + // if a handler called deferRender() during the callback. + set((state) => { + state.renderDeferred = false; + }); + fireBeforeRestart(); + + const keepDeferred = get().renderDeferred; + resetPRNG(); resetTriggers(); const initialVars = deepClone(variableDefaults); @@ -535,7 +544,9 @@ export const useStoryStore = create()( state.historyIndex = 0; state.visitCounts = { [startPassage.name]: 1 }; state.renderCounts = { [startPassage.name]: 1 }; - state.renderDeferred = false; + if (!keepDeferred) { + state.renderDeferred = false; + } }); lastNavigationVars = get().variables; diff --git a/test/unit/store.test.ts b/test/unit/store.test.ts index b0e4ccb..72b08c5 100644 --- a/test/unit/store.test.ts +++ b/test/unit/store.test.ts @@ -1,6 +1,6 @@ // @vitest-environment happy-dom import { describe, it, expect, beforeEach } from 'vitest'; -import { useStoryStore } from '../../src/store'; +import { useStoryStore, onBeforeRestart } from '../../src/store'; import { executeStoryInit } from '../../src/story-init'; import type { StoryData, Passage } from '../../src/parser'; import { registerClass, clearRegistry } from '../../src/class-registry'; @@ -870,5 +870,16 @@ describe('useStoryStore', () => { useStoryStore.getState().restart(); expect(useStoryStore.getState().renderDeferred).toBe(false); }); + + it('restart() preserves renderDeferred if set during beforerestart', () => { + const story = makeStoryData([makePassage(1, 'Start', '')]); + useStoryStore.getState().init(story); + const unsub = onBeforeRestart(() => { + useStoryStore.getState().deferRender(); + }); + useStoryStore.getState().restart(); + expect(useStoryStore.getState().renderDeferred).toBe(true); + unsub(); + }); }); });