diff --git a/packages/react-meteor-data/suspense/useTracker.tests.js b/packages/react-meteor-data/suspense/useTracker.tests.js index e1c07c77..5a37f9ea 100644 --- a/packages/react-meteor-data/suspense/useTracker.tests.js +++ b/packages/react-meteor-data/suspense/useTracker.tests.js @@ -428,3 +428,29 @@ Meteor.isClient && ); } ); + +Meteor.isClient && + runForVariants( + 'suspense/useTracker - component unmount in Strict Mode', + async function (test, useTrackerFn) { + const { simpleFetch } = setupTest(); + + const Test = () => { + useTrackerFn('TestDocs', simpleFetch); + + return null; + }; + + const { queryByText, findByText, unmount } = render(, { + container: document.createElement('container'), + wrapper: TestSuspense, + reactStrictMode: true, + }); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + unmount(); + + test.isTrue(true, 'should handle unmount correctly in Strict Mode'); + } + ); diff --git a/packages/react-meteor-data/suspense/useTracker.ts b/packages/react-meteor-data/suspense/useTracker.ts index 24b29620..9f6367f9 100644 --- a/packages/react-meteor-data/suspense/useTracker.ts +++ b/packages/react-meteor-data/suspense/useTracker.ts @@ -131,8 +131,11 @@ export function useTrackerSuspenseNoDeps(key: string, reactiveFn: IReac // stop the computation on unmount return () => { - refs.computation?.stop() - delete refs.computation + if (refs.computation) { + refs.computation.stop() + delete refs.computation + } + refs.isMounted = false } }, []) @@ -192,8 +195,11 @@ export const useTrackerSuspenseWithDeps = refs.isMounted = true return () => { - refs.computation.stop() - delete refs.computation + if (refs.computation) { + refs.computation.stop() + delete refs.computation + } + refs.isMounted = false } }, deps)