|
@@ -0,0 +1,85 @@
|
|
|
+(function (Misago) {
|
|
|
+ 'use strict';
|
|
|
+
|
|
|
+ var noop = function() {};
|
|
|
+
|
|
|
+ Misago.route = function(component) {
|
|
|
+ /*
|
|
|
+ Boilerplate for Misago top-level components
|
|
|
+ */
|
|
|
+
|
|
|
+ // Component state
|
|
|
+ component.isActive = true;
|
|
|
+
|
|
|
+ // Wrap controller to store lifecycle methods
|
|
|
+ var __controller = component.controller || noop;
|
|
|
+ component.controller = function() {
|
|
|
+ component.isActive = true;
|
|
|
+
|
|
|
+ var controller = __controller.apply(component, arguments) || {};
|
|
|
+
|
|
|
+ // wrap onunload for lifestate
|
|
|
+ var __onunload = controller.onunload || noop;
|
|
|
+ controller.onunload = function() {
|
|
|
+ __onunload.apply(component, arguments);
|
|
|
+ controller.isActive = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ return controller;
|
|
|
+ };
|
|
|
+
|
|
|
+ // Add state callbacks to View-Model
|
|
|
+ if (component.vm && component.vm.init) {
|
|
|
+ // wrap vm.init in promise handler
|
|
|
+ component.vm._promise = null;
|
|
|
+
|
|
|
+ var __init = component.vm.init;
|
|
|
+ component.vm.init = function() {
|
|
|
+ var initArgs = arguments;
|
|
|
+ var promise = __init.apply(component.vm, initArgs);
|
|
|
+
|
|
|
+ if (promise) {
|
|
|
+ component.vm._promise = promise;
|
|
|
+ promise.then(function() {
|
|
|
+ if (component.vm._promise === promise && component.vm.ondata) {
|
|
|
+ var finalArgs = [];
|
|
|
+ for (var i = 0; i < arguments.length; i++) {
|
|
|
+ finalArgs.push(arguments[i]);
|
|
|
+ }
|
|
|
+ for (var f = 0; f < initArgs.length; f++) {
|
|
|
+ finalArgs.push(initArgs[f]);
|
|
|
+ }
|
|
|
+
|
|
|
+ component.vm.ondata.apply(component.vm, finalArgs);
|
|
|
+ }
|
|
|
+ }, function(error) {
|
|
|
+ if (component.vm._promise === promise) {
|
|
|
+ component.container.router.errorPage(error);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // setup default loading view
|
|
|
+ if (!component.loading) {
|
|
|
+ component.loading = function () {
|
|
|
+ var _ = this.container;
|
|
|
+ return m('.page.page-loading',
|
|
|
+ _.component(Misago.Loader)
|
|
|
+ );
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ var __view = component.view;
|
|
|
+ component.view = function() {
|
|
|
+ if (component.vm.isReady) {
|
|
|
+ return __view.apply(component, arguments);
|
|
|
+ } else {
|
|
|
+ return component.loading.apply(component, arguments);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ return component;
|
|
|
+ };
|
|
|
+}(Misago.prototype));
|