1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/dashboard-ui/bower_components/emby-webcomponents/router.js

416 lines
19 KiB
JavaScript
Raw Normal View History

2018-10-23 01:05:09 +03:00
define(["loading", "globalize", "events", "viewManager", "layoutManager", "skinManager", "pluginManager", "backdrop", "browser", "pageJs", "appSettings", "apphost", "connectionManager"], function(loading, globalize, events, viewManager, layoutManager, skinManager, pluginManager, backdrop, browser, page, appSettings, appHost, connectionManager) {
"use strict";
function beginConnectionWizard() {
backdrop.clear(), loading.show(), connectionManager.connect({
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) {
handleConnectionResult(result, loading)
})
}
function handleConnectionResult(result, loading) {
switch (result.State) {
case "SignedIn":
loading.hide(), skinManager.loadUserSkin();
break;
case "ServerSignIn":
result.ApiClient.getPublicUsers().then(function(users) {
users.length ? appRouter.showLocalLogin(result.Servers[0].Id) : appRouter.showLocalLogin(result.Servers[0].Id, !0)
});
break;
case "ServerSelection":
appRouter.showSelectServer();
break;
case "ConnectSignIn":
appRouter.showWelcome();
break;
case "ServerUpdateNeeded":
require(["alert"], function(alert) {
alert({
text: globalize.translate("sharedcomponents#ServerUpdateNeeded", "https://emby.media"),
html: globalize.translate("sharedcomponents#ServerUpdateNeeded", '<a href="https://emby.media">https://emby.media</a>')
}).then(function() {
appRouter.showSelectServer()
})
})
}
}
function loadContentUrl(ctx, next, route, request) {
var url;
url = route.contentPath && "function" == typeof route.contentPath ? route.contentPath(ctx.querystring) : route.contentPath || route.path, -1 === url.indexOf("://") && (0 !== url.indexOf("/") && (url = "/" + url), url = baseUrl() + url), ctx.querystring && route.enableContentQueryString && (url += "?" + ctx.querystring), require(["text!" + url], function(html) {
loadContent(ctx, route, html, request)
})
}
function handleRoute(ctx, next, route) {
authenticate(ctx, route, function() {
initRoute(ctx, next, route)
})
}
function initRoute(ctx, next, route) {
var onInitComplete = function(controllerFactory) {
sendRouteToViewManager(ctx, next, route, controllerFactory)
};
require(route.dependencies || [], function() {
route.controller ? require([route.controller], onInitComplete) : onInitComplete()
})
}
function cancelCurrentLoadRequest() {
var currentRequest = currentViewLoadRequest;
currentRequest && (currentRequest.cancel = !0)
}
function sendRouteToViewManager(ctx, next, route, controllerFactory) {
if (isDummyBackToHome && "home" === route.type) return void(isDummyBackToHome = !1);
cancelCurrentLoadRequest();
var isBackNav = ctx.isBack,
currentRequest = {
url: baseUrl() + ctx.path,
transition: route.transition,
isBack: isBackNav,
state: ctx.state,
type: route.type,
fullscreen: route.fullscreen,
controllerFactory: controllerFactory,
options: {
supportsThemeMedia: route.supportsThemeMedia || !1,
enableMediaControl: !1 !== route.enableMediaControl
},
autoFocus: route.autoFocus
};
currentViewLoadRequest = currentRequest;
var onNewViewNeeded = function() {
"string" == typeof route.path ? loadContentUrl(ctx, next, route, currentRequest) : next()
};
if (!isBackNav) return void onNewViewNeeded();
viewManager.tryRestoreView(currentRequest, function() {
currentRouteInfo = {
route: route,
path: ctx.path
}
}).catch(function(result) {
result && result.cancelled || onNewViewNeeded()
})
}
function onForcedLogoutMessageTimeout() {
var msg = forcedLogoutMsg;
forcedLogoutMsg = null, msg && require(["alert"], function(alert) {
alert(msg)
})
}
function showForcedLogoutMessage(msg) {
forcedLogoutMsg = msg, msgTimeout && clearTimeout(msgTimeout), msgTimeout = setTimeout(onForcedLogoutMessageTimeout, 100)
}
function onRequestFail(e, data) {
var apiClient = this;
if (401 === data.status && "ParentalControl" === data.errorCode) {
!currentRouteInfo || (currentRouteInfo.route.anonymous || currentRouteInfo.route.startup) || (showForcedLogoutMessage(globalize.translate("sharedcomponents#AccessRestrictedTryAgainLater")), connectionManager.isLoggedIntoConnect() ? appRouter.showConnectLogin() : appRouter.showLocalLogin(apiClient.serverId()))
}
}
function onBeforeExit(e) {
browser.web0s && page.restorePreviousState()
}
function normalizeImageOptions(options) {
var setQuality, scaleFactor = browser.tv ? .8 : 1;
if (options.maxWidth && (options.maxWidth = Math.round(options.maxWidth * scaleFactor), setQuality = !0), options.width && (options.width = Math.round(options.width * scaleFactor), setQuality = !0), options.maxHeight && (options.maxHeight = Math.round(options.maxHeight * scaleFactor), setQuality = !0), options.height && (options.height = Math.round(options.height * scaleFactor), setQuality = !0), setQuality) {
var quality = 100,
type = options.type || "Primary";
quality = browser.tv || browser.slow ? browser.chrome ? "Primary" === type ? 40 : 50 : "Backdrop" === type ? 60 : 50 : "Backdrop" === type ? 70 : 90, options.quality = quality
}
}
function getMaxBandwidth() {
if (navigator.connection) {
var max = navigator.connection.downlinkMax;
if (max && max > 0 && max < Number.POSITIVE_INFINITY) return max /= 8, max *= 1e6, max *= .7, max = parseInt(max)
}
return null
}
function getMaxBandwidthIOS() {
return 8e5
}
function onApiClientCreated(e, newApiClient) {
newApiClient.normalizeImageOptions = normalizeImageOptions, browser.iOS ? newApiClient.getMaxBandwidth = getMaxBandwidthIOS : newApiClient.getMaxBandwidth = getMaxBandwidth, events.off(newApiClient, "requestfail", onRequestFail), events.on(newApiClient, "requestfail", onRequestFail)
}
function initApiClient(apiClient) {
onApiClientCreated({}, apiClient)
}
function initApiClients() {
connectionManager.getApiClients().forEach(initApiClient), events.on(connectionManager, "apiclientcreated", onApiClientCreated)
}
function onAppResume() {
var apiClient = connectionManager.currentApiClient();
apiClient && apiClient.ensureWebSocket()
}
function start(options) {
loading.show(), initApiClients(), events.on(appHost, "beforeexit", onBeforeExit), events.on(appHost, "resume", onAppResume), connectionManager.connect({
enableAutoLogin: appSettings.enableAutoLogin()
}).then(function(result) {
firstConnectionResult = result, loading.hide(), options = options || {}, page({
click: !1 !== options.click,
hashbang: !1 !== options.hashbang,
enableHistory: enableHistory()
})
})
}
function enableHistory() {
return !browser.xboxOne && !browser.orsay
}
function enableNativeHistory() {
return page.enableNativeHistory()
}
function authenticate(ctx, route, callback) {
var firstResult = firstConnectionResult;
if (firstResult && (firstConnectionResult = null, "SignedIn" !== firstResult.State && !route.anonymous)) return void handleConnectionResult(firstResult, loading);
var apiClient = connectionManager.currentApiClient(),
pathname = ctx.pathname.toLowerCase();
console.log("appRouter - processing path request " + pathname);
var isCurrentRouteStartup = !currentRouteInfo || currentRouteInfo.route.startup,
shouldExitApp = ctx.isBack && route.isDefaultRoute && isCurrentRouteStartup;
if (!(shouldExitApp || apiClient && apiClient.isLoggedIn() || route.anonymous)) return console.log("appRouter - route does not allow anonymous access, redirecting to login"), void beginConnectionWizard();
if (shouldExitApp) {
if (appHost.supports("exit")) return void appHost.exit()
} else {
if (apiClient && apiClient.isLoggedIn()) {
if (console.log("appRouter - user is authenticated"), ctx.isBack && (route.isDefaultRoute || route.startup) && !isCurrentRouteStartup) return void handleBackToDefault();
if (route.isDefaultRoute) return console.log("appRouter - loading skin home page"), void loadUserSkinWithOptions(ctx);
if (route.roles) return void validateRoles(apiClient, route.roles).then(function() {
callback()
}, beginConnectionWizard)
}
console.log("appRouter - proceeding to " + pathname), callback()
}
}
function loadUserSkinWithOptions(ctx) {
require(["queryString"], function(queryString) {
var params = queryString.parse(ctx.querystring);
skinManager.loadUserSkin({
start: params.start
})
})
}
function validateRoles(apiClient, roles) {
return Promise.all(roles.split(",").map(function(role) {
return validateRole(apiClient, role)
}))
}
function validateRole(apiClient, role) {
return "admin" === role ? apiClient.getCurrentUser().then(function(user) {
return user.Policy.IsAdministrator ? Promise.resolve() : Promise.reject()
}) : Promise.resolve()
}
function handleBackToDefault() {
if (!appHost.supports("exitmenu") && appHost.supports("exit")) return void appHost.exit();
isDummyBackToHome = !0, skinManager.loadUserSkin(), isHandlingBackToDefault || skinManager.getCurrentSkin().showBackMenu().then(function() {
isHandlingBackToDefault = !1
})
}
function loadContent(ctx, route, html, request) {
html = globalize.translateDocument(html, route.dictionary), request.view = html, viewManager.loadView(request), currentRouteInfo = {
route: route,
path: ctx.path
}, ctx.handled = !0
}
function getRequestFile() {
var path = self.location.pathname || "",
index = path.lastIndexOf("/");
return path = -1 !== index ? path.substring(index) : "/" + path, path && "/" !== path || (path = "/index.html"), path
}
function endsWith(str, srch) {
return str.lastIndexOf(srch) === srch.length - 1
}
function baseUrl() {
return baseRoute
}
function getHandler(route) {
return function(ctx, next) {
handleRoute(ctx, next, route)
}
}
function getWindowLocationSearch(win) {
var currentPath = currentRouteInfo ? currentRouteInfo.path || "" : "",
index = currentPath.indexOf("?"),
search = "";
return -1 !== index && (search = currentPath.substring(index)), search || ""
}
function param(name, url) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)",
regex = new RegExp(regexS, "i"),
results = regex.exec(url || getWindowLocationSearch());
return null == results ? "" : decodeURIComponent(results[1].replace(/\+/g, " "))
}
function back() {
page.back()
}
function canGoBack() {
var curr = current();
return !!curr && ("home" !== curr.type && page.canGoBack())
}
function show(path, options) {
0 !== path.indexOf("/") && -1 === path.indexOf("://") && (path = "/" + path);
var baseRoute = baseUrl();
return path = path.replace(baseRoute, ""), currentRouteInfo && currentRouteInfo.path === path && "home" !== currentRouteInfo.route.type ? (loading.hide(), Promise.resolve()) : new Promise(function(resolve, reject) {
resolveOnNextShow = resolve, page.show(path, options)
})
}
function current() {
return currentRouteInfo ? currentRouteInfo.route : null
}
function goHome() {
var skin = skinManager.getCurrentSkin();
if (skin.getHomeRoute) {
var homePath = skin.getHomeRoute();
return show(pluginManager.mapRoute(skin, homePath))
}
var homeRoute = skin.getRoutes().filter(function(r) {
return "home" === r.type
})[0];
return show(pluginManager.mapRoute(skin, homeRoute))
}
function getRouteUrl(item, options) {
return "downloads" === item ? "offline/offline.html" : "managedownloads" === item ? "offline/managedownloads.html" : "settings" === item ? "settings/settings.html" : skinManager.getCurrentSkin().getRouteUrl(item, options)
}
function showItem(item, serverId, options) {
if ("string" == typeof item) {
var apiClient = serverId ? connectionManager.getApiClient(serverId) : connectionManager.currentApiClient();
apiClient.getItem(apiClient.getCurrentUserId(), item).then(function(item) {
appRouter.showItem(item, options)
})
} else {
2 === arguments.length && (options = arguments[1]);
var url = appRouter.getRouteUrl(item, options);
appRouter.show(url, {
item: item
})
}
}
function setTitle(title) {
skinManager.getCurrentSkin().setTitle(title)
}
function showVideoOsd() {
var skin = skinManager.getCurrentSkin(),
homeRoute = skin.getRoutes().filter(function(r) {
return "video-osd" === r.type
})[0];
return show(pluginManager.mapRoute(skin, homeRoute))
}
function addRoute(path, newRoute) {
page(path, getHandler(newRoute)), allRoutes.push(newRoute)
}
function getRoutes() {
return allRoutes
}
function setTransparency(level) {
backdropContainer || (backdropContainer = document.querySelector(".backdropContainer")), backgroundContainer || (backgroundContainer = document.querySelector(".backgroundContainer")), "full" === level || 2 === level ? (backdrop.clear(!0), document.documentElement.classList.add("transparentDocument"), backgroundContainer.classList.add("backgroundContainer-transparent"), backdropContainer.classList.add("hide")) : "backdrop" === level || 1 === level ? (backdrop.externalBackdrop(!0), document.documentElement.classList.add("transparentDocument"), backgroundContainer.classList.add("backgroundContainer-transparent"), backdropContainer.classList.add("hide")) : (backdrop.externalBackdrop(!1), document.documentElement.classList.remove("transparentDocument"), backgroundContainer.classList.remove("backgroundContainer-transparent"), backdropContainer.classList.remove("hide"))
}
function pushState(state, title, url) {
state.navigate = !1, page.pushState(state, title, url)
}
function invokeShortcut(id) {
0 === id.indexOf("library-") ? (id = id.replace("library-", ""), id = id.split("_"), appRouter.showItem(id[0], id[1])) : 0 === id.indexOf("item-") ? (id = id.replace("item-", ""), id = id.split("_"), appRouter.showItem(id[0], id[1])) : (id = id.split("_"), appRouter.show(appRouter.getRouteUrl(id[0], {
serverId: id[1]
})))
}
var currentViewLoadRequest, msgTimeout, forcedLogoutMsg, firstConnectionResult, isHandlingBackToDefault, isDummyBackToHome, appRouter = {
showLocalLogin: function(serverId, manualLogin) {
show("/startup/" + (manualLogin ? "manuallogin" : "login") + ".html?serverid=" + serverId)
},
showSelectServer: function() {
show("/startup/selectserver.html")
},
showWelcome: function() {
show("/startup/welcome.html")
},
showConnectLogin: function() {
show("/startup/connectlogin.html")
},
showSettings: function() {
show("/settings/settings.html")
},
showSearch: function() {
skinManager.getCurrentSkin().search()
},
showGenre: function(options) {
skinManager.getCurrentSkin().showGenre(options)
},
showGuide: function() {
skinManager.getCurrentSkin().showGuide({
serverId: connectionManager.currentApiClient().serverId()
})
},
showLiveTV: function() {
skinManager.getCurrentSkin().showLiveTV({
serverId: connectionManager.currentApiClient().serverId()
})
},
showRecordedTV: function() {
skinManager.getCurrentSkin().showRecordedTV()
},
showFavorites: function() {
skinManager.getCurrentSkin().showFavorites()
},
showNowPlaying: function() {
skinManager.getCurrentSkin().showNowPlaying()
}
},
baseRoute = self.location.href.split("?")[0].replace(getRequestFile(), "");
baseRoute = baseRoute.split("#")[0], endsWith(baseRoute, "/") && !endsWith(baseRoute, "://") && (baseRoute = baseRoute.substring(0, baseRoute.length - 1));
var resolveOnNextShow;
document.addEventListener("viewshow", function() {
var resolve = resolveOnNextShow;
resolve && (resolveOnNextShow = null, resolve())
});
var currentRouteInfo, backdropContainer, backgroundContainer, allRoutes = [];
return function() {
var baseRoute = self.location.pathname.replace(getRequestFile(), "");
baseRoute.lastIndexOf("/") === baseRoute.length - 1 && (baseRoute = baseRoute.substring(0, baseRoute.length - 1)), console.log("Setting page base to " + baseRoute), page.base(baseRoute)
}(), appRouter.addRoute = addRoute, appRouter.param = param, appRouter.back = back, appRouter.show = show, appRouter.start = start, appRouter.baseUrl = baseUrl, appRouter.canGoBack = canGoBack, appRouter.current = current, appRouter.beginConnectionWizard = beginConnectionWizard, appRouter.goHome = goHome, appRouter.showItem = showItem, appRouter.setTitle = setTitle, appRouter.setTransparency = setTransparency, appRouter.getRoutes = getRoutes, appRouter.getRouteUrl = getRouteUrl, appRouter.pushState = pushState, appRouter.enableNativeHistory = enableNativeHistory, appRouter.showVideoOsd = showVideoOsd, appRouter.handleAnchorClick = page.handleAnchorClick, appRouter.TransparencyLevel = {
None: 0,
Backdrop: 1,
Full: 2
}, appRouter.invokeShortcut = invokeShortcut, appRouter
});