Merge pull request #6205 from thornbill/no-rerender-hack
Some checks are pending
Push & Release 🌍 / Automation 🎛️ (push) Waiting to run
Push & Release 🌍 / Unstable release 🚀⚠️ (push) Waiting to run
Push & Release 🌍 / Quality checks 👌🧪 (push) Waiting to run
Push & Release 🌍 / GitHub CodeQL 🔬 (push) Waiting to run
Push & Release 🌍 / Deploy 🚀 (push) Blocked by required conditions

Add hack to prevent rerendering legacy views in development
This commit is contained in:
Bill Thornton 2024-10-17 16:34:37 -04:00 committed by GitHub
commit d3fc3689c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,5 +1,5 @@
import { Action } from 'history';
import { FunctionComponent, useEffect } from 'react';
import { FunctionComponent, useEffect, useRef } from 'react';
import { useLocation, useNavigationType } from 'react-router-dom';
import globalize from 'lib/globalize';
@ -58,6 +58,13 @@ const ViewManagerPage: FunctionComponent<ViewManagerPageProps> = ({
isThemeMediaSupported = false,
transition
}) => {
/**
* HACK: This is a hack to workaround intentional behavior in React strict mode when running in development.
* Legacy views will break if loaded twice so we need to avoid that. This will likely stop working in React 19.
* refs: https://stackoverflow.com/a/72238236
*/
const isLoaded = useRef(false);
const location = useLocation();
const navigationType = useNavigationType();
@ -91,9 +98,13 @@ const ViewManagerPage: FunctionComponent<ViewManagerPageProps> = ({
});
};
loadPage();
if (!isLoaded.current) loadPage();
return () => {
isLoaded.current = true;
};
},
// location.state and navigationType are NOT included as dependencies here since dialogs will update state while the current view stays the same
// location.state and navigationType are NOT included as dependencies here since dialogs will update state while the current view stays the same
// eslint-disable-next-line react-hooks/exhaustive-deps
[
controller,