diff --git a/.changeset/fix-duplicate-interval.md b/.changeset/fix-duplicate-interval.md new file mode 100644 index 000000000..771298721 --- /dev/null +++ b/.changeset/fix-duplicate-interval.md @@ -0,0 +1,5 @@ +--- +"@stackflow/core": patch +--- + +fix(core): prevent duplicate setInterval in dispatchEvent diff --git a/core/src/makeCoreStore.ts b/core/src/makeCoreStore.ts index cbdc99aaa..0043055c5 100644 --- a/core/src/makeCoreStore.ts +++ b/core/src/makeCoreStore.ts @@ -84,6 +84,8 @@ export function makeCoreStore(options: MakeCoreStoreOptions): CoreStore { value: aggregate(events.value, new Date().getTime()), }; + let currentInterval: ReturnType | null = null; + const actions: StackflowActions = { getStack() { return stack.value; @@ -98,6 +100,10 @@ export function makeCoreStore(options: MakeCoreStoreOptions): CoreStore { events.value.push(newEvent); setStackValue(nextStackValue); + if (currentInterval !== null) { + clearInterval(currentInterval); + } + const interval = setInterval(() => { const nextStackValue = aggregate(events.value, new Date().getTime()); @@ -107,8 +113,12 @@ export function makeCoreStore(options: MakeCoreStoreOptions): CoreStore { if (nextStackValue.globalTransitionState === "idle") { clearInterval(interval); + if (currentInterval === interval) { + currentInterval = null; + } } }, INTERVAL_MS); + currentInterval = interval; }, push: () => {}, replace: () => {},