var AppRouteDelete = Store.createClass({ willInitialize: function () { this.props = { appID: this.id.appID, routeID: this.id.routeID }; }, didBecomeInactive: function () { this.constructor.discardInstance(this); }, getInitialState: function () { return { isDeleting: false, errorMsg: null }; }, handleEvent: function (event) { switch (event.name) { case 'DELETE_APP_ROUTE': if (event.appID === this.props.appID && event.routeID === this.props.routeID) { this.setState({ isDeleting: true, errorMsg: null }); } break; case 'DELETE_APP_ROUTE_FAILED': if (event.appID === this.props.appID && event.routeID === this.props.routeID) { this.setState({ errorMsg: 'Something went wrong ('+ event.status +')', isDeleting: false }); } break; } } });
var AppRouteNew = Store.createClass({ willInitialize: function () { this.props = { appID: this.id.appID }; }, didBecomeInactive: function () { this.constructor.discardInstance(this); }, getInitialState: function () { return { isCreating: false, routeDomain: null, errorMsg: null }; }, handleEvent: function (event) { switch (event.name) { case 'CREATE_APP_ROUTE': if (event.appID === this.props.appID) { this.setState({ errorMsg: null, isCreating: true, routeDomain: event.data.domain }); } break; case 'ROUTE': if (event.app === this.props.appID && event.data.domain === this.state.routeDomain) { this.setState(this.getInitialState()); } break; case 'CREATE_APP_ROUTE_FAILED': if (event.appID === this.props.appID && event.routeDomain === this.state.routeDomain) { this.setState({ errorMsg: 'Something went wrong ('+ event.status +')', isCreating: false }); } break; } } });
var ResourceAddApp = Store.createClass({ willInitialize: function () { this.props = { appID: this.id.appID }; }, didBecomeInactive: function () { this.constructor.discardInstance(this); }, getInitialState: function () { return { errMsg: null }; }, handleEvent: function (event) { switch (event.name) { case 'RESOURCE_ADD_APP': this.setState({ errMsg: null }); break; case 'RESOURCE_ADD_APP_FAILED': this.setState({ errMsg: event.errMsg }); break; } } });
var AppHistory = Store.createClass({ willInitialize: function () { this.props = { appID: this.id.appID }; this.fetchPageLock = Promise.resolve(); }, didBecomeActive: function () { if (this.state.pages.length === 0) { this.__fetchNextPage(); } }, didBecomeInactive: function () { this.constructor.discardInstance(this); }, getInitialState: function () { return { hasPrevPage: true, hasNextPage: true, pages: [], eventIDs: [], beforeID: null, sinceID: null }; }, handleEvent: function (event) { if (event.app === this.props.appID && OBJECT_TYPES.indexOf(event.object_type) !== -1) { this.setState({ hasPrevPage: true }); return; } if (event.appID !== this.props.appID || event.name !== 'FETCH_APP_HISTORY') { return; } if (event.direction === 'prev') { this.__fetchPrevPage(); } else { this.__fetchNextPage(); } }, __withFetchLock: function (callback) { return this.fetchPageLock.then(function () { this.fetchPageLock = new Promise(function (rs) { callback().then(rs); }.bind(this)); return this.fetchPageLock; }.bind(this)); }, __fetchPrevPage: function (skipLock) { if (skipLock !== true) { return this.__withFetchLock(this.__fetchPrevPage.bind(this, true)); } var prevState = this.state; return Config.client.getEvents({ app_id: this.props.appID, since_id: this.state.sinceID, object_types: OBJECT_TYPES, count: FETCH_COUNT }).then(function (args) { var events = this.__rewriteEvents(this.__filterEvents(args[0])); var pages; var hasPrevPage = true; if (events.length === 0) { pages = prevState.pages; hasPrevPage = args[0].length !== 0; } else { pages = [{ id: buildPageID(events), events: events }].concat(prevState.pages); } this.setState({ hasPrevPage: hasPrevPage, pages: pages, eventIDs: prevState.eventIDs.concat(events.map(function (e) { return e.id; })), sinceID: ((args[0] || [])[0] || {}).id || prevState.sinceID }); }.bind(this)).catch(function (err) { setTimeout(function () { throw err; }, 0); }); }, __fetchNextPage: function (skipLock, beforeID, eventsBuffer) { if (skipLock !== true) { return this.__withFetchLock(this.__fetchNextPage.bind(this, true)); } if (this.state.hasNextPage === false) { return Promise.resolve(); } var prevState = this.state; return Config.client.getEvents({ app_id: this.props.appID, before_id: beforeID || this.state.beforeID, object_types: OBJECT_TYPES, count: FETCH_COUNT }).then(function (args) { var events = (eventsBuffer || []).concat(this.__rewriteEvents(this.__filterEvents(args[0]))); var pages; var hasNextPage = true; var beforeID = ((args[0] || [])[args[0].length-1] || {}).id || prevState.beforeID; if (args[0].length > events.length) { return this.__fetchNextPage(skipLock, beforeID, events); } if (events.length === 0) { pages = prevState.pages; hasNextPage = args[0].length !== 0; } else { pages = prevState.pages.concat([{ id: buildPageID(events), events: events }]); } var state = { hasNextPage: hasNextPage, pages: pages, eventIDs: prevState.eventIDs.concat(events.map(function (e) { return e.id; })), beforeID: ((args[0] || [])[args[0].length-1] || {}).id || prevState.beforeID }; this.setState(state); }.bind(this)).catch(function (err) { setTimeout(function () { throw err; }, 0); }); }, __filterEvents: function (events) { return events.filter(function (event) { if (event.object_type === 'scale' && event.data.processes === null) { // don't show formation deletions return false; } if (event.object_type === 'scale' && !event.data.hasOwnProperty('prev_processes')) { // don't show scale events from deployments return false; } if (event.object_type === 'scale' && assertEqual(event.data.processes, event.data.prev_processes)) { // don't show scale events in which nothing's changed return false; } if (this.state.eventIDs.indexOf(event.id) !== -1) { // guard against duplicate events as this would break things return false; } return true; }, this); }, __rewriteEvents: function (events) { return events.map(function (event) { if (event.object_type === 'app_release') { return this.__releaseEventWithDiff(event); } if (event.object_type === 'scale') { return this.__scaleEventWithDiff(event); } return event; }, this); }, __releaseEventWithDiff: function (event) { var prevRelease = event.data.prev_release || {}; var release = event.data.release; var envDiff = objectDiff(prevRelease.env || {}, release.env || {}); return extend({}, event, { envDiff: envDiff }); }, __scaleEventWithDiff: function (event) { var prevProcesses = event.data.prev_processes || {}; var processes = event.data.processes || {}; var diff = objectDiff(prevProcesses, processes); var delta = 0; diff.forEach(function (d) { var k = d.key; delta += (processes[k] || 0) - (prevProcesses[k] || 0); }); return extend({}, event, { delta: delta, diff: diff }); } });
var AppDeploy = Store.createClass({ willInitialize: function () { this.props = { appID: this.id.appID, sha: this.id.sha }; }, didBecomeActive: function () { if (this.props.appID !== null) { Dispatcher.dispatch({ name: 'GET_DEPLOY_APP_JOB', appID: this.props.appID }); Dispatcher.dispatch({ name: 'GET_APP_RELEASE', appID: this.props.appID }); } }, didBecomeInactive: function () { this.constructor.discardInstance(this); }, getInitialState: function () { return { taffyJob: null, release: null, launching: this.props.appID !== null, launchFailed: null, launchErrorMsg: null, launchSuccess: null }; }, handleEvent: function (event) { switch (event.name) { case 'JOB': if (event.taffy !== true || this.props.appID === null || (event.data.meta || {}).app !== this.props.appID || event.data.meta.sha !== this.props.sha) { return; } if (this.state.taffyJob === null || event.object_id === this.state.taffyJob.id) { this.setState({ taffyJob: event.data, launching: (event.data.state !== 'down' && event.data.state !== 'crashed'), launchFailed: event.data.state === 'crashed', launchSuccess: event.data.state === 'down', launchErrorMsg: event.data.state === 'crashed' ? 'Non-zero exit status': null }); return; } break; case 'APP': if (event.app === this.props.appID && event.data.release_id) { Dispatcher.dispatch({ name: 'GET_APP_RELEASE', appID: this.props.appID }); } break; case 'APP_RELEASE': if (event.app === this.props.appID) { this.setState({ release: event.data }); } break; } } });