Skip to content

Commit

Permalink
Fix overly aggressive view caching
Browse files Browse the repository at this point in the history
  • Loading branch information
thornbill committed Aug 1, 2024
1 parent 7acdb66 commit 4de2a05
Showing 1 changed file with 42 additions and 14 deletions.
56 changes: 42 additions & 14 deletions src/components/viewManager/ViewManagerPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Action } from 'history';
import { FunctionComponent, useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import { useLocation, useNavigationType } from 'react-router-dom';

import globalize from '../../scripts/globalize';
import type { RestoreViewFailResponse } from '../../types/viewManager';
Expand All @@ -15,6 +16,34 @@ export interface ViewManagerPageProps {
transition?: string
}

interface ViewOptions {
url: string
type?: string
// eslint-disable-next-line @typescript-eslint/no-explicit-any
state: any
autoFocus: boolean
fullscreen?: boolean
transition?: string
options: {
supportsThemeMedia?: boolean
enableMediaControl?: boolean
}
}

const loadView = async (controller: string, view: string, viewOptions: ViewOptions) => {
const [ controllerFactory, viewHtml ] = await Promise.all([
import(/* webpackChunkName: "[request]" */ `../../controllers/${controller}`),
import(/* webpackChunkName: "[request]" */ `../../controllers/${view}`)
.then(html => globalize.translateHtml(html))
]);

viewManager.loadView({
...viewOptions,
controllerFactory,
view: viewHtml
});
};

/**
* Page component that renders legacy views via the ViewManager.
* NOTE: Any new pages should use the generic Page component instead.
Expand All @@ -29,6 +58,7 @@ const ViewManagerPage: FunctionComponent<ViewManagerPageProps> = ({
transition
}) => {
const location = useLocation();
const navigationType = useNavigationType();

useEffect(() => {
const loadPage = () => {
Expand All @@ -45,20 +75,17 @@ const ViewManagerPage: FunctionComponent<ViewManagerPageProps> = ({
}
};

viewManager.tryRestoreView(viewOptions)
if (navigationType !== Action.Pop) {
console.debug('[ViewManagerPage] loading view [%s]', view);
return loadView(controller, view, viewOptions);
}

console.debug('[ViewManagerPage] restoring view [%s]', view);
return viewManager.tryRestoreView(viewOptions)
.catch(async (result?: RestoreViewFailResponse) => {
if (!result?.cancelled) {
const [ controllerFactory, viewHtml ] = await Promise.all([
import(/* webpackChunkName: "[request]" */ `../../controllers/${controller}`),
import(/* webpackChunkName: "[request]" */ `../../controllers/${view}`)
.then(html => globalize.translateHtml(html))
]);

viewManager.loadView({
...viewOptions,
controllerFactory,
view: viewHtml
});
console.debug('[ViewManagerPage] restore failed; loading view [%s]', view);
return loadView(controller, view, viewOptions);
}
});
};
Expand All @@ -76,7 +103,8 @@ const ViewManagerPage: FunctionComponent<ViewManagerPageProps> = ({
isThemeMediaSupported,
transition,
location.pathname,
location.search
location.search,
navigationType
]);

return null;
Expand Down

0 comments on commit 4de2a05

Please sign in to comment.