@@ -32,7 +32,7 @@ export default Router.extend({
}
},

// 'experiment' is a URL slug: for example, 'universal-search'
// 'experiment' is a URL slug: for example, 'universal_search'
experimentDetail(experiment) {
if (!app.me.user.id || !app.me.hasAddon) {
this.redirectTo('');
@@ -9,8 +9,10 @@ import ExperimentsCollection from './collections/experiments';
import Me from './models/me';
import PageManager from './lib/page-manager';
import Router from './lib/router';
import domReady from 'domready';

app.extend({
router: new Router(),

initialize() {
app.webChannel = webChannel;
@@ -19,31 +21,45 @@ app.extend({
credentials: 'same-origin'
}).then((response) => response.json()).then((userData) => {
app.me = new Me({
user: userData
user: userData,
hasAddon: Boolean(window.navigator.ideatownAddon)
});

app.experiments = new ExperimentsCollection();
app.experiments.fetch();

// session won't change without a hard refresh, but addon state could, so:
// if addon state changes, dump user back to '/' and let the router handle
// redirecting to the correct landing page
app.me.on('change:hasAddon', () => { app.router.reload(); });

app.pageManager = new PageManager({
pageContainer: document.querySelector('[data-hook=page-container]')
app.experiments.fetch({
success: app.blastOff,
error: (err) => {
console && console.error(err); // eslint-disable-line no-console
app.blastoff();
}
});

app.router = new Router();
app.router.history.start();
}).catch((err) => {
// for now, log the error in the console & do nothing in the UI
console && console.error(err); // eslint-disable-line no-console
});
},

blastOff(exp) {
if (exp && exp.models) {
app.experiments.set(exp.models);
}

app.pageManager = new PageManager({
pageContainer: document.querySelector('[data-hook=page-container]')
});

if (!app.router.history.started()) {
app.router.history.start();
}

app.me.on('change:hasAddon', () => {
app.router.reload();
});
}

});
app.initialize();

domReady(app.initialize);

// make app accessible from window for debuggin'
window.app = app;
@@ -22,10 +22,18 @@ export default State.extend({
},

initialize() {
// note: when the server exposes addon info, these listeners can go away
app.on('webChannel:addon-available', () => { this.hasAddon = true; });
app.on('webChannel:addon-self:installed', () => { app.me.hasAddon = true; });
app.on('webChannel:addon-self:uninstalled', () => { app.me.hasAddon = false; });
app.on('webChannel:addon-available', () => {
if (!app.me.hasAddon) app.me.hasAddon = true;
});

app.on('webChannel:addon-self:installed', () => {
if (!app.me.hasAddon) app.me.hasAddon = true;
});

app.on('webChannel:addon-self:uninstalled', () => {
if (app.me.hasAddon) app.me.hasAddon = false;
});

this.addonCheck();
},

@@ -7,6 +7,7 @@ import mustache from 'mustache';
export default AmpersandView.extend({
// override _template with a mustache template
_template: '',

template(ctx) {
return mustache.render(this._template, ctx);
},
@@ -17,6 +17,7 @@
"ampersand-state": "^4.5.6",
"ampersand-view": "^8.0.1",
"ampersand-view-switcher": "^2.0.0",
"domready": "^1.0.8",
"es6-promise": "^3.0.2",
"isomorphic-fetch": "^2.1.1",
"js-cookie": "^2.0.3",