2022-10-22 03:28:15 -04:00
|
|
|
import React, { FunctionComponent, useEffect } from 'react';
|
|
|
|
import { useLocation } from 'react-router-dom';
|
|
|
|
|
|
|
|
import globalize from '../../scripts/globalize';
|
2023-04-26 11:30:57 -04:00
|
|
|
import type { RestoreViewFailResponse } from '../../types/viewManager';
|
2022-10-22 03:28:15 -04:00
|
|
|
import viewManager from './viewManager';
|
|
|
|
|
2022-10-24 02:17:35 -04:00
|
|
|
export interface ViewManagerPageProps {
|
2022-10-22 03:28:15 -04:00
|
|
|
controller: string
|
|
|
|
view: string
|
|
|
|
type?: string
|
|
|
|
isFullscreen?: boolean
|
|
|
|
isNowPlayingBarEnabled?: boolean
|
|
|
|
isThemeMediaSupported?: boolean
|
|
|
|
transition?: string
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Page component that renders legacy views via the ViewManager.
|
2022-10-25 12:39:12 -04:00
|
|
|
* NOTE: Any new pages should use the generic Page component instead.
|
2022-10-22 03:28:15 -04:00
|
|
|
*/
|
|
|
|
const ViewManagerPage: FunctionComponent<ViewManagerPageProps> = ({
|
|
|
|
controller,
|
|
|
|
view,
|
|
|
|
type,
|
|
|
|
isFullscreen = false,
|
|
|
|
isNowPlayingBarEnabled = true,
|
|
|
|
isThemeMediaSupported = false,
|
|
|
|
transition
|
|
|
|
}) => {
|
|
|
|
const location = useLocation();
|
|
|
|
|
|
|
|
useEffect(() => {
|
2022-11-04 12:27:14 -04:00
|
|
|
const loadPage = () => {
|
2022-10-24 02:17:35 -04:00
|
|
|
const viewOptions = {
|
2022-10-22 03:28:15 -04:00
|
|
|
url: location.pathname + location.search,
|
|
|
|
type,
|
|
|
|
state: location.state,
|
|
|
|
autoFocus: false,
|
|
|
|
fullscreen: isFullscreen,
|
|
|
|
transition,
|
|
|
|
options: {
|
|
|
|
supportsThemeMedia: isThemeMediaSupported,
|
|
|
|
enableMediaControl: isNowPlayingBarEnabled
|
|
|
|
}
|
2022-10-24 02:17:35 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
viewManager.tryRestoreView(viewOptions)
|
2023-04-26 11:30:57 -04:00
|
|
|
.catch(async (result?: RestoreViewFailResponse) => {
|
2023-07-06 13:39:48 -04:00
|
|
|
if (!result?.cancelled) {
|
2022-11-04 12:27:14 -04:00
|
|
|
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
|
|
|
|
});
|
2022-10-24 02:17:35 -04:00
|
|
|
}
|
|
|
|
});
|
2022-10-22 03:28:15 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
loadPage();
|
2023-04-26 16:53:31 -04:00
|
|
|
},
|
|
|
|
// location.state is NOT included as a dependency here since dialogs will update state while the current view stays the same
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
[
|
2022-10-22 03:28:15 -04:00
|
|
|
controller,
|
|
|
|
view,
|
|
|
|
type,
|
|
|
|
isFullscreen,
|
|
|
|
isNowPlayingBarEnabled,
|
|
|
|
isThemeMediaSupported,
|
|
|
|
transition,
|
|
|
|
location.pathname,
|
2022-11-02 13:38:43 -04:00
|
|
|
location.search
|
2022-10-22 03:28:15 -04:00
|
|
|
]);
|
|
|
|
|
|
|
|
return <></>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ViewManagerPage;
|