mo-framework
Version:
Hybrid mobile app framework with generators
141 lines (111 loc) • 4.12 kB
JavaScript
const pagesContext = require.context('pages/', false, /^\.\/\w+$/i);
const viewsContext = require.context('views/pages/', true, /\/[A-Z][A-Za-z]+$/);
define([
'config',
'jquery', './jqm', 'lodash',
'./pages/Base',
'./analytics'
], function (config, $, $mobile, _, BasePage, analytics) {
var pages = {},
// TODO => Config
nonReturnablePages = [];
function init () {
var keys = pagesContext.keys(),
pageClasses = {},
viewClasses = {};
_.each(keys, function (key, i) {
var pageClass = pagesContext(key),
name = _.lowerFirst(key.replace('./', ''));
pageClasses[name] = pageClass;
viewClasses[name] = viewsContext(key.replace('./', './' + name + '/'));
$(document.body).append(
'<div data-role="page"' +
' id="page-' + name + '"' +
' data-layout="' + (pageClass.LAYOUT || config.default_page_layout) + '"' +
' data-skin="' + (pageClass.SKIN || config.default_page_skin) + '"' +
' data-title="' + (pageClass.TITLE || '') + '"' +
'/>'
);
});
$mobile.initializePage();
$('[data-role=page]').each(function () {
$(document.body).pagecontainer('load', '#' + this.id, {showLoadMsg: false});
});
_.each(pageClasses, function (pageClass, name) {
pages[name] = new pageClass(name, viewClasses[name]);
});
$.mobile.changePage.defaults = _.extend($.mobile.changePage.defaults, {
changeHash: false,
allowSamePageTransition: true
});
}
function getPage (name) {
if (config.debug) {
if (!pages[name]) {
throw new Error('./pages.get: Page `' + name + '` not found.');
}
}
return pages[name];
}
function change (name, params, pageParams) {
if (config.debug) {
if (!pages[name]) {
throw new Error('./pages.change: Page `' + name + '` not found.');
}
}
var url = '#page-' + name;
if (!$(url).length) {
url = name + '.html';
}
analytics.hit(url, {
title: getTitle(name) || name,
referrer: getCurrentUrl()
});
getPage(name).setParams(pageParams);
// Workaround for #391.
if (url.replace('#', '') == $.mobile.firstPage.attr('id')) {
$.mobile.navigate.history.add(url, params);
}
$(document.body).pagecontainer('change', url, params);
$.mobile.navigate.history.getActive().pageParams = pageParams;
}
function back () {
if (nonReturnablePages.indexOf(getCurrent()) != -1) {
return;
}
var prevPage = $.mobile.navigate.history.getPrev();
if (prevPage && prevPage.pageUrl) {
var prevPageName = prevPage.pageUrl.replace('page-', '');
if (nonReturnablePages.indexOf(prevPageName) == -1) {
analytics.hit('#' + prevPage.pageUrl, {
title: getTitle(prevPageName),
referrer: getCurrentUrl()
});
if (prevPage.pageParams) {
getPage(prevPageName).setParams(prevPage.pageParams);
}
$.mobile.back();
return;
}
}
change('home', { direction: 'reverse' });
}
function getCurrent () {
return ($.mobile.navigate.history.getActive().pageUrl || $.mobile.activePage.attr('id'))
.replace('page-', '');
}
function getCurrentUrl () {
return '#' + ($.mobile.navigate.history.getActive().pageUrl || $.mobile.activePage.attr('id'));
}
function getTitle (name) {
return $('#page-' + name).data('title');
}
return {
init: init,
get: getPage,
change: change,
getCurrent: getCurrent,
getCurrentUrl: getCurrentUrl,
back: back
};
});