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

Update dialog history handling

This commit is contained in:
Bill Thornton 2022-04-27 15:14:35 -04:00
parent 2887639243
commit c49f53257c
3 changed files with 33 additions and 35 deletions

View file

@ -11,7 +11,7 @@ import ServerConnections from './ServerConnections';
import alert from './alert'; import alert from './alert';
import reactControllerFactory from './reactControllerFactory'; import reactControllerFactory from './reactControllerFactory';
const history = createHashHistory(); export const history = createHashHistory();
/** /**
* Page types of "no return" (when "Go back" should behave differently, probably quitting the application). * Page types of "no return" (when "Go back" should behave differently, probably quitting the application).
@ -20,14 +20,13 @@ const START_PAGE_TYPES = ['home', 'login', 'selectserver'];
class AppRouter { class AppRouter {
allRoutes = new Map(); allRoutes = new Map();
currentRouteInfo; currentRouteInfo = { route: {} };
currentViewLoadRequest; currentViewLoadRequest;
firstConnectionResult; firstConnectionResult;
forcedLogoutMsg; forcedLogoutMsg;
msgTimeout; msgTimeout;
promiseShow; promiseShow;
resolveOnNextShow; resolveOnNextShow;
previousRoute = {};
constructor() { constructor() {
document.addEventListener('viewshow', () => this.onViewShow()); document.addEventListener('viewshow', () => this.onViewShow());
@ -482,9 +481,9 @@ class AppRouter {
#getHandler(route) { #getHandler(route) {
return (ctx, next) => { return (ctx, next) => {
const ignore = route.dummyRoute === true || this.previousRoute.dummyRoute === true; const ignore = ctx.path === this.currentRouteInfo.path;
this.previousRoute = route;
if (ignore) { if (ignore) {
console.debug('[appRouter] path did not change, ignoring route change');
// Resolve 'show' promise // Resolve 'show' promise
this.onViewShow(); this.onViewShow();
return; return;

View file

@ -1,4 +1,4 @@
import { appRouter } from '../appRouter'; import { history } from '../appRouter';
import focusManager from '../focusManager'; import focusManager from '../focusManager';
import browser from '../../scripts/browser'; import browser from '../../scripts/browser';
import layoutManager from '../layoutManager'; import layoutManager from '../layoutManager';
@ -49,17 +49,19 @@ import '../../assets/css/scrollstyles.scss';
self.originalUrl = window.location.href; self.originalUrl = window.location.href;
const activeElement = document.activeElement; const activeElement = document.activeElement;
let removeScrollLockOnClose = false; let removeScrollLockOnClose = false;
let unlisten;
function onHashChange() { function onHashChange({ location }) {
const isBack = self.originalUrl === window.location.href; const dialogs = location.state?.dialogs || [];
const shouldClose = !dialogs.includes(hash);
if (isBack || !isOpened(dlg)) { if ((shouldClose || !isOpened(dlg)) && unlisten) {
window.removeEventListener('popstate', onHashChange); unlisten();
} }
if (isBack) { if (shouldClose) {
self.closedByBack = true; self.closedByBack = true;
closeDialog(dlg); close(dlg);
} }
} }
@ -68,7 +70,7 @@ import '../../assets/css/scrollstyles.scss';
self.closedByBack = true; self.closedByBack = true;
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
closeDialog(dlg); close(dlg);
} }
} }
@ -77,7 +79,9 @@ import '../../assets/css/scrollstyles.scss';
inputManager.off(dlg, onBackCommand); inputManager.off(dlg, onBackCommand);
} }
window.removeEventListener('popstate', onHashChange); if (unlisten) {
unlisten();
}
removeBackdrop(dlg); removeBackdrop(dlg);
dlg.classList.remove('opened'); dlg.classList.remove('opened');
@ -86,10 +90,10 @@ import '../../assets/css/scrollstyles.scss';
document.body.classList.remove('noScroll'); document.body.classList.remove('noScroll');
} }
if (!self.closedByBack && isHistoryEnabled(dlg)) { if (isHistoryEnabled(dlg)) {
const state = window.history.state || {}; const state = history.location.state || {};
if (state.dialogId === hash) { if (state.dialogs?.length > 0 && state.dialogs[0] === hash) {
appRouter.back(); history.back();
} }
} }
@ -144,9 +148,19 @@ import '../../assets/css/scrollstyles.scss';
animateDialogOpen(dlg); animateDialogOpen(dlg);
if (isHistoryEnabled(dlg)) { if (isHistoryEnabled(dlg)) {
appRouter.show(`/dialog?dlg=${hash}`, { dialogId: hash }); const state = history.location.state || {};
const dialogs = state.dialogs || [];
dialogs.push(hash);
window.addEventListener('popstate', onHashChange); history.push(
`${history.location.pathname}${history.location.search}`,
{
...state,
dialogs
}
);
unlisten = history.listen(onHashChange);
} else { } else {
inputManager.on(dlg, onBackCommand); inputManager.on(dlg, onBackCommand);
} }
@ -213,16 +227,6 @@ import '../../assets/css/scrollstyles.scss';
} }
export function close(dlg) { export function close(dlg) {
if (isOpened(dlg)) {
if (isHistoryEnabled(dlg)) {
appRouter.back();
} else {
closeDialog(dlg);
}
}
}
function closeDialog(dlg) {
if (!dlg.classList.contains('hide')) { if (!dlg.classList.contains('hide')) {
dlg.dispatchEvent(new CustomEvent('closing', { dlg.dispatchEvent(new CustomEvent('closing', {
bubbles: false, bubbles: false,

View file

@ -560,11 +560,6 @@ import { appRouter } from '../components/appRouter';
serverRequest: true serverRequest: true
}); });
defineRoute({
path: '/dialog',
dummyRoute: true
});
defineRoute({ defineRoute({
path: '/', path: '/',
autoFocus: false, autoFocus: false,