1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/routes/home.tsx

170 lines
5.5 KiB
TypeScript
Raw Normal View History

2022-12-14 17:19:19 -05:00
import React, { FunctionComponent, useCallback, useEffect, useMemo, useRef } from 'react';
2022-12-13 10:23:48 -05:00
import { useSearchParams } from 'react-router-dom';
2022-07-29 20:52:45 +03:00
import globalize from '../scripts/globalize';
import LibraryMenu from '../scripts/libraryMenu';
import { clearBackdrop } from '../components/backdrop/backdrop';
import layoutManager from '../components/layoutManager';
import * as mainTabsManager from '../components/maintabsmanager';
import '../elements/emby-tabs/emby-tabs';
import '../elements/emby-button/emby-button';
import '../elements/emby-scroller/emby-scroller';
import Page from '../components/Page';
type OnResumeOptions = {
autoFocus?: boolean;
refresh?: boolean
2023-05-02 15:54:53 -04:00
};
2022-07-29 20:52:45 +03:00
type ControllerProps = {
onResume: (
options: OnResumeOptions
) => void;
refreshed: boolean;
onPause: () => void;
destroy: () => void;
2023-05-02 15:54:53 -04:00
};
2022-07-29 20:52:45 +03:00
2022-12-13 10:23:48 -05:00
const Home: FunctionComponent = () => {
const [ searchParams ] = useSearchParams();
const initialTabIndex = parseInt(searchParams.get('tab') || '0', 10);
2022-07-29 20:52:45 +03:00
const tabController = useRef<ControllerProps | null>();
const tabControllers = useMemo<ControllerProps[]>(() => [], []);
const element = useRef<HTMLDivElement>(null);
const setTitle = () => {
LibraryMenu.setTitle(null);
};
const getTabs = () => {
return [{
name: globalize.translate('Home')
}, {
name: globalize.translate('Favorites')
}];
};
const getTabContainers = () => {
return element.current?.querySelectorAll('.tabContent');
};
const getTabController = useCallback((index: number) => {
if (index == null) {
throw new Error('index cannot be null');
}
let depends = '';
switch (index) {
case 0:
depends = 'hometab';
break;
case 1:
depends = 'favorites';
}
return import(/* webpackChunkName: "[request]" */ `../controllers/${depends}`).then(({ default: controllerFactory }) => {
let controller = tabControllers[index];
if (!controller) {
const tabContent = element.current?.querySelector(".tabContent[data-index='" + index + "']");
2022-12-13 10:23:48 -05:00
controller = new controllerFactory(tabContent, null);
2022-07-29 20:52:45 +03:00
tabControllers[index] = controller;
}
return controller;
});
2022-12-13 10:23:48 -05:00
}, [ tabControllers ]);
2022-07-29 20:52:45 +03:00
const onViewDestroy = useCallback(() => {
if (tabControllers) {
tabControllers.forEach(function (t) {
if (t.destroy) {
t.destroy();
}
});
}
tabController.current = null;
2022-12-13 10:23:48 -05:00
}, [ tabControllers ]);
2022-07-29 20:52:45 +03:00
const loadTab = useCallback((index: number, previousIndex: number | null) => {
getTabController(index).then((controller) => {
const refresh = !controller.refreshed;
controller.onResume({
autoFocus: previousIndex == null && layoutManager.tv,
refresh: refresh
});
controller.refreshed = true;
tabController.current = controller;
});
2022-12-13 10:23:48 -05:00
}, [ getTabController ]);
2022-07-29 20:52:45 +03:00
const onTabChange = useCallback((e: { detail: { selectedTabIndex: string; previousIndex: number | null }; }) => {
2022-12-13 10:23:48 -05:00
const newIndex = parseInt(e.detail.selectedTabIndex, 10);
2022-07-29 20:52:45 +03:00
const previousIndex = e.detail.previousIndex;
const previousTabController = previousIndex == null ? null : tabControllers[previousIndex];
if (previousTabController && previousTabController.onPause) {
previousTabController.onPause();
}
loadTab(newIndex, previousIndex);
2022-12-13 10:23:48 -05:00
}, [ loadTab, tabControllers ]);
2022-07-29 20:52:45 +03:00
const onResume = useCallback(() => {
setTitle();
clearBackdrop();
const currentTabController = tabController.current;
if (!currentTabController) {
2022-12-13 10:23:48 -05:00
mainTabsManager.selectedTabIndex(initialTabIndex);
2022-07-29 20:52:45 +03:00
} else if (currentTabController && currentTabController.onResume) {
currentTabController.onResume({});
}
(document.querySelector('.skinHeader') as HTMLDivElement).classList.add('noHomeButtonHeader');
2022-12-13 10:23:48 -05:00
}, [ initialTabIndex ]);
2022-07-29 20:52:45 +03:00
const onPause = useCallback(() => {
const currentTabController = tabController.current;
if (currentTabController && currentTabController.onPause) {
currentTabController.onPause();
}
(document.querySelector('.skinHeader') as HTMLDivElement).classList.remove('noHomeButtonHeader');
}, []);
useEffect(() => {
2022-12-13 10:23:48 -05:00
mainTabsManager.setTabs(element.current, initialTabIndex, getTabs, getTabContainers, null, onTabChange, false);
2022-07-29 20:52:45 +03:00
onResume();
return () => {
onPause();
};
2022-12-13 10:23:48 -05:00
}, [ initialTabIndex, onPause, onResume, onTabChange, onViewDestroy ]);
2022-07-29 20:52:45 +03:00
return (
<div ref={element}>
<Page
id='indexPage'
className='mainAnimatedPage homePage libraryPage allLibraryPage backdropPage pageWithAbsoluteTabs withTabs'
2022-09-02 21:34:06 +03:00
isBackButtonEnabled={false}
2022-07-29 20:52:45 +03:00
backDropType='movie,series,book'
>
<div className='tabContent pageTabContent' id='homeTab' data-index='0'>
<div className='sections'></div>
</div>
<div className='tabContent pageTabContent' id='favoritesTab' data-index='1'>
<div className='sections'></div>
</div>
</Page>
</div>
);
};
export default Home;