fix: Lazily polyfill ResizeObserver for old iOS (#3629)
* fix: Lazily polyfill ResizeObserver for old iOS * fix: Prevent child rendering until polyfills are loaded * tsc
This commit is contained in:
23
app/components/LazyPolyfills.tsx
Normal file
23
app/components/LazyPolyfills.tsx
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
import { loadPolyfills } from "~/utils/polyfills";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asyncronously load required polyfills. Should wrap the React tree.
|
||||||
|
*/
|
||||||
|
export const LazyPolyfill: React.FC = ({ children }) => {
|
||||||
|
const [isLoaded, setIsLoaded] = React.useState(false);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
loadPolyfills().then(() => {
|
||||||
|
setIsLoaded(true);
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (!isLoaded) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>{children}</>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LazyPolyfill;
|
||||||
@@ -15,6 +15,7 @@ import ScrollToTop from "~/components/ScrollToTop";
|
|||||||
import Theme from "~/components/Theme";
|
import Theme from "~/components/Theme";
|
||||||
import Toasts from "~/components/Toasts";
|
import Toasts from "~/components/Toasts";
|
||||||
import env from "~/env";
|
import env from "~/env";
|
||||||
|
import LazyPolyfill from "./components/LazyPolyfills";
|
||||||
import Routes from "./routes";
|
import Routes from "./routes";
|
||||||
import Logger from "./utils/Logger";
|
import Logger from "./utils/Logger";
|
||||||
import history from "./utils/history";
|
import history from "./utils/history";
|
||||||
@@ -75,18 +76,20 @@ if (element) {
|
|||||||
<Theme>
|
<Theme>
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
<KBarProvider actions={[]} options={commandBarOptions}>
|
<KBarProvider actions={[]} options={commandBarOptions}>
|
||||||
<LazyMotion features={loadFeatures}>
|
<LazyPolyfill>
|
||||||
<Router history={history}>
|
<LazyMotion features={loadFeatures}>
|
||||||
<>
|
<Router history={history}>
|
||||||
<PageTheme />
|
<>
|
||||||
<ScrollToTop>
|
<PageTheme />
|
||||||
<Routes />
|
<ScrollToTop>
|
||||||
</ScrollToTop>
|
<Routes />
|
||||||
<Toasts />
|
</ScrollToTop>
|
||||||
<Dialogs />
|
<Toasts />
|
||||||
</>
|
<Dialogs />
|
||||||
</Router>
|
</>
|
||||||
</LazyMotion>
|
</Router>
|
||||||
|
</LazyMotion>
|
||||||
|
</LazyPolyfill>
|
||||||
</KBarProvider>
|
</KBarProvider>
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
</Theme>
|
</Theme>
|
||||||
|
|||||||
31
app/utils/polyfills.ts
Normal file
31
app/utils/polyfills.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Loads required polyfills.
|
||||||
|
*
|
||||||
|
* @returns A promise that resolves when all required polyfills are loaded
|
||||||
|
*/
|
||||||
|
export async function loadPolyfills() {
|
||||||
|
const polyfills = [];
|
||||||
|
|
||||||
|
if (!supportsResizeObserver()) {
|
||||||
|
polyfills.push(
|
||||||
|
import("@juggle/resize-observer").then((module) => {
|
||||||
|
window.ResizeObserver = module.ResizeObserver;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.all(polyfills);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect ResizeObserver compatability.
|
||||||
|
*
|
||||||
|
* @returns true if the current browser supports ResizeObserver
|
||||||
|
*/
|
||||||
|
function supportsResizeObserver() {
|
||||||
|
return (
|
||||||
|
"ResizeObserver" in global &&
|
||||||
|
"ResizeObserverEntry" in global &&
|
||||||
|
"contentRect" in ResizeObserverEntry.prototype
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -57,6 +57,7 @@
|
|||||||
"@hocuspocus/provider": "^1.0.0-alpha.36",
|
"@hocuspocus/provider": "^1.0.0-alpha.36",
|
||||||
"@hocuspocus/server": "^1.0.0-alpha.102",
|
"@hocuspocus/server": "^1.0.0-alpha.102",
|
||||||
"@joplin/turndown-plugin-gfm": "^1.0.44",
|
"@joplin/turndown-plugin-gfm": "^1.0.44",
|
||||||
|
"@juggle/resize-observer": "^3.3.1",
|
||||||
"@outlinewiki/koa-passport": "^4.1.4",
|
"@outlinewiki/koa-passport": "^4.1.4",
|
||||||
"@outlinewiki/passport-azure-ad-oauth2": "^0.1.0",
|
"@outlinewiki/passport-azure-ad-oauth2": "^0.1.0",
|
||||||
"@renderlesskit/react": "^0.6.0",
|
"@renderlesskit/react": "^0.6.0",
|
||||||
|
|||||||
@@ -1818,6 +1818,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@joplin/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.44.tgz#028e4c56bf58e57a4d0d923bb7d10a21c30d5c7d"
|
resolved "https://registry.yarnpkg.com/@joplin/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.44.tgz#028e4c56bf58e57a4d0d923bb7d10a21c30d5c7d"
|
||||||
integrity sha512-lpVI/fpj0CKzWzpsOxsmqwjWlIrw+IZlIEz3h8Vqoviz8dCYbqSSY/4VxpiUDmBpxX/3Xk73R5BfzqiAHBmYqA==
|
integrity sha512-lpVI/fpj0CKzWzpsOxsmqwjWlIrw+IZlIEz3h8Vqoviz8dCYbqSSY/4VxpiUDmBpxX/3Xk73R5BfzqiAHBmYqA==
|
||||||
|
|
||||||
|
"@juggle/resize-observer@^3.3.1":
|
||||||
|
version "3.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0"
|
||||||
|
integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==
|
||||||
|
|
||||||
"@lifeomic/attempt@^3.0.2":
|
"@lifeomic/attempt@^3.0.2":
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/@lifeomic/attempt/-/attempt-3.0.3.tgz#e742a5b85eb673e2f1746b0f39cb932cbc6145bb"
|
resolved "https://registry.yarnpkg.com/@lifeomic/attempt/-/attempt-3.0.3.tgz#e742a5b85eb673e2f1746b0f39cb932cbc6145bb"
|
||||||
|
|||||||
Reference in New Issue
Block a user