UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

383 lines (382 loc) • 13 kB
var view_1 = require("ui/core/view"); var page_1 = require("ui/page"); var types_1 = require("utils/types"); var trace = require("trace"); var file_name_resolver_1 = require("file-system/file-name-resolver"); var fs = require("file-system"); var platform = require("platform"); var builder; function ensureBuilder() { if (!builder) { builder = require("ui/builder"); } } var frameStack = []; function buildEntryFromArgs(arg) { var entry; if (arg instanceof page_1.Page) { throw new Error("Navigating to a Page instance is no longer supported. Please navigate by using either a module name or a page factory function."); } else if (types_1.isString(arg)) { entry = { moduleName: arg }; } else if (types_1.isFunction(arg)) { entry = { create: arg }; } else { entry = arg; } return entry; } function reloadPage() { var frame = exports.topmost(); if (frame) { var currentEntry = frame._currentEntry.entry; var newEntry = { animated: false, clearHistory: true, context: currentEntry.context, create: currentEntry.create, moduleName: currentEntry.moduleName, backstackVisible: currentEntry.backstackVisible }; frame.navigate(newEntry); } } exports.reloadPage = reloadPage; function resolvePageFromEntry(entry) { var page; if (entry.create) { page = entry.create(); if (!(page && page instanceof page_1.Page)) { throw new Error("Failed to create Page with entry.create() function."); } } else if (entry.moduleName) { var currentAppPath = fs.knownFolders.currentApp().path; var moduleNamePath = fs.path.join(currentAppPath, entry.moduleName); var moduleExports; if (global.moduleExists(entry.moduleName)) { trace.write("Loading pre-registered JS module: " + entry.moduleName, trace.categories.Navigation); moduleExports = global.loadModule(entry.moduleName); } else { var moduleExportsResolvedPath = file_name_resolver_1.resolveFileName(moduleNamePath, "js"); if (moduleExportsResolvedPath) { trace.write("Loading JS file: " + moduleExportsResolvedPath, trace.categories.Navigation); moduleExportsResolvedPath = moduleExportsResolvedPath.substr(0, moduleExportsResolvedPath.length - 3); moduleExports = global.loadModule(moduleExportsResolvedPath); } } if (moduleExports && moduleExports.createPage) { trace.write("Calling createPage()", trace.categories.Navigation); page = moduleExports.createPage(); } else { page = pageFromBuilder(moduleNamePath, moduleExports); } if (!(page && page instanceof page_1.Page)) { throw new Error("Failed to load Page from entry.moduleName: " + entry.moduleName); } var cssFileName = file_name_resolver_1.resolveFileName(moduleNamePath, "css"); if (cssFileName && !page["cssFile"]) { page.addCssFile(cssFileName); } } return page; } exports.resolvePageFromEntry = resolvePageFromEntry; function pageFromBuilder(moduleNamePath, moduleExports) { var page; var element; var fileName = file_name_resolver_1.resolveFileName(moduleNamePath, "xml"); if (fileName) { trace.write("Loading XML file: " + fileName, trace.categories.Navigation); ensureBuilder(); element = builder.load(fileName, moduleExports); if (element instanceof page_1.Page) { page = element; } } return page; } var Frame = (function (_super) { __extends(Frame, _super); function Frame() { _super.call(this); this._isInFrameStack = false; this._backStack = new Array(); this._navigationQueue = new Array(); } Frame.prototype.canGoBack = function () { return this._backStack.length > 0; }; Frame.prototype.goBack = function (backstackEntry) { trace.write("GO BACK", trace.categories.Navigation); if (!this.canGoBack()) { return; } if (!backstackEntry) { backstackEntry = this._backStack.pop(); } else { var backIndex = this._backStack.indexOf(backstackEntry); if (backIndex < 0) { return; } this._backStack.splice(backIndex); } var navigationContext = { entry: backstackEntry, isBackNavigation: true }; this._navigationQueue.push(navigationContext); if (this._navigationQueue.length === 1) { this._processNavigationContext(navigationContext); } else { trace.write("Going back scheduled", trace.categories.Navigation); } }; Frame.prototype.navigate = function (param) { trace.write("NAVIGATE", trace.categories.Navigation); var entry = buildEntryFromArgs(param); var page = resolvePageFromEntry(entry); this._pushInFrameStack(); var backstackEntry = { entry: entry, resolvedPage: page, }; var navigationContext = { entry: backstackEntry, isBackNavigation: false }; this._navigationQueue.push(navigationContext); if (this._navigationQueue.length === 1) { this._processNavigationContext(navigationContext); } else { trace.write("Navigation scheduled", trace.categories.Navigation); } }; Frame.prototype._processNavigationQueue = function (page) { if (this._navigationQueue.length === 0) { return; } var entry = this._navigationQueue[0].entry; var currentNavigationPage = entry.resolvedPage; if (page !== currentNavigationPage) { throw new Error("Corrupted navigation stack; page: " + page.id + "; currentNavigationPage: " + currentNavigationPage.id); } this._navigationQueue.shift(); if (this._navigationQueue.length > 0) { var navigationContext = this._navigationQueue[0]; this._processNavigationContext(navigationContext); } this._updateActionBar(); }; Frame.prototype.navigationQueueIsEmpty = function () { return this._navigationQueue.length === 0; }; Frame.prototype._isEntryBackstackVisible = function (entry) { if (!entry) { return false; } var backstackVisibleValue = entry.entry.backstackVisible; var backstackHidden = types_1.isDefined(backstackVisibleValue) && !backstackVisibleValue; return !backstackHidden; }; Frame.prototype._updateActionBar = function (page) { }; Frame.prototype._processNavigationContext = function (navigationContext) { if (navigationContext.isBackNavigation) { this.performGoBack(navigationContext); } else { this.performNavigation(navigationContext); } }; Frame.prototype.performNavigation = function (navigationContext) { var navContext = navigationContext.entry; this._onNavigatingTo(navContext, navigationContext.isBackNavigation); if (navigationContext.entry.entry.clearHistory) { this._backStack.length = 0; } else if (this._isEntryBackstackVisible(this._currentEntry)) { this._backStack.push(this._currentEntry); } this._navigateCore(navContext); this._onNavigatedTo(navContext, false); }; Frame.prototype.performGoBack = function (navigationContext) { var navContext = navigationContext.entry; this._onNavigatingTo(navContext, navigationContext.isBackNavigation); this._goBackCore(navContext); this._onNavigatedTo(navContext, true); }; Frame.prototype._goBackCore = function (backstackEntry) { }; Frame.prototype._navigateCore = function (backstackEntry) { }; Frame.prototype._onNavigatingTo = function (backstackEntry, isBack) { if (this.currentPage) { this.currentPage.onNavigatingFrom(isBack); } backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack); }; Frame.prototype._onNavigatedTo = function (backstackEntry, isBack) { if (this.currentPage) { this.currentPage.onNavigatedFrom(isBack); } }; Object.defineProperty(Frame.prototype, "animated", { get: function () { return this._animated; }, set: function (value) { this._animated = value; }, enumerable: true, configurable: true }); Object.defineProperty(Frame.prototype, "transition", { get: function () { return this._transition; }, set: function (value) { this._transition = value; }, enumerable: true, configurable: true }); Object.defineProperty(Frame.prototype, "backStack", { get: function () { return this._backStack.slice(); }, enumerable: true, configurable: true }); Object.defineProperty(Frame.prototype, "currentPage", { get: function () { if (this._currentEntry) { return this._currentEntry.resolvedPage; } return null; }, enumerable: true, configurable: true }); Object.defineProperty(Frame.prototype, "currentEntry", { get: function () { return this._currentEntry.entry; }, enumerable: true, configurable: true }); Frame.prototype._pushInFrameStack = function () { if (this._isInFrameStack) { return; } frameStack.push(this); this._isInFrameStack = true; }; Frame.prototype._popFromFrameStack = function () { if (!this._isInFrameStack) { return; } var top = _topmost(); if (top !== this) { throw new Error("Cannot pop a Frame which is not at the top of the navigation stack."); } frameStack.pop(); this._isInFrameStack = false; }; Object.defineProperty(Frame.prototype, "_childrenCount", { get: function () { if (this.currentPage) { return 1; } return 0; }, enumerable: true, configurable: true }); Frame.prototype._eachChildView = function (callback) { if (this.currentPage) { callback(this.currentPage); } }; Frame.prototype._getIsAnimatedNavigation = function (entry) { if (entry && types_1.isDefined(entry.animated)) { return entry.animated; } if (types_1.isDefined(this.animated)) { return this.animated; } return Frame.defaultAnimatedNavigation; }; Frame.prototype._getNavigationTransition = function (entry) { if (entry) { if (platform.device.os === platform.platformNames.ios && types_1.isDefined(entry.transitioniOS)) { return entry.transitioniOS; } if (platform.device.os === platform.platformNames.android && types_1.isDefined(entry.transitionAndroid)) { return entry.transitionAndroid; } if (entry && types_1.isDefined(entry.transition)) { return entry.transition; } } if (types_1.isDefined(this.transition)) { return this.transition; } return Frame.defaultTransition; }; Object.defineProperty(Frame.prototype, "navigationBarHeight", { get: function () { return 0; }, enumerable: true, configurable: true }); Frame.prototype._getNavBarVisible = function (page) { throw new Error(); }; Frame.prototype._addViewToNativeVisualTree = function (child) { return true; }; Frame.prototype._removeViewFromNativeVisualTree = function (child) { child._isAddedToNativeVisualTree = false; }; Frame.androidOptionSelectedEvent = "optionSelected"; Frame.defaultAnimatedNavigation = true; return Frame; }(view_1.CustomLayoutView)); exports.Frame = Frame; var _topmost = function () { if (frameStack.length > 0) { return frameStack[frameStack.length - 1]; } return undefined; }; exports.topmost = _topmost; function goBack() { var top = _topmost(); if (top.canGoBack()) { top.goBack(); return true; } if (frameStack.length > 1) { top._popFromFrameStack(); } return false; } exports.goBack = goBack; function stack() { return frameStack; } exports.stack = stack;