diff --git a/src/components/viewManager/ViewManagerPage.tsx b/src/components/viewManager/ViewManagerPage.tsx new file mode 100644 index 0000000000..30ab177306 --- /dev/null +++ b/src/components/viewManager/ViewManagerPage.tsx @@ -0,0 +1,71 @@ +import React, { FunctionComponent, useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; + +import globalize from '../../scripts/globalize'; +import viewManager from './viewManager'; + +interface ViewManagerPageProps { + controller: string + view: string + type?: string + isFullscreen?: boolean + isNowPlayingBarEnabled?: boolean + isThemeMediaSupported?: boolean + transition?: string +} + +/** + * Page component that renders legacy views via the ViewManager. + */ +const ViewManagerPage: FunctionComponent = ({ + controller, + view, + type, + isFullscreen = false, + isNowPlayingBarEnabled = true, + isThemeMediaSupported = false, + transition +}) => { + const location = useLocation(); + + useEffect(() => { + const loadPage = async () => { + const controllerFactory = await import(/* webpackChunkName: "[request]" */ `../../controllers/${controller}`); + + let viewHtml = await import(/* webpackChunkName: "[request]" */ `../../controllers/${view}`); + viewHtml = globalize.translateHtml(viewHtml); + + viewManager.loadView({ + url: location.pathname + location.search, + controllerFactory, + view: viewHtml, + type, + state: location.state, + autoFocus: false, + fullscreen: isFullscreen, + transition, + options: { + supportsThemeMedia: isThemeMediaSupported, + enableMediaControl: isNowPlayingBarEnabled + } + }); + }; + + loadPage(); + }, [ + controller, + view, + type, + isFullscreen, + isNowPlayingBarEnabled, + isThemeMediaSupported, + transition, + location.pathname, + location.search, + location.state + ]); + + return <>; +}; + +export default ViewManagerPage; diff --git a/src/routes/index.tsx b/src/routes/index.tsx index d18ce561e1..97dcdc679e 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { Navigate, Route, Routes } from 'react-router-dom'; import ConnectionRequired from '../components/ConnectionRequired'; +import ViewManagerPage from '../components/viewManager/ViewManagerPage'; import UserNew from './user/usernew'; import Search from './search'; import UserEdit from './user/useredit'; @@ -22,6 +23,9 @@ const AppRoutes = () => ( } /> } /> } /> + + } /> {/* Admin routes */} diff --git a/src/scripts/routes.js b/src/scripts/routes.js index a92ef28e1a..db43d45926 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -345,13 +345,6 @@ import { appRouter } from '../components/appRouter'; controller: 'livetvtuner' }); - defineRoute({ - alias: '/music.html', - path: 'music/music.html', - controller: 'music/musicrecommended', - autoFocus: false - }); - defineRoute({ alias: '/installedplugins.html', path: 'dashboard/plugins/installed/index.html',