application/main.js
// require('babel-polyfill');
import React from 'react';
import ReactDom from 'react-dom';
import Immutable from 'immutable';
import {Router, Route, Link, browserHistory} from "react-router";
import AutobahnReact from 'autobahn-react';
import App from './components/app';
import {buildRoutes} from './routes';
import alt from './alt';
import {createStore, applyMiddleware} from 'redux';
import {Provider} from 'react-redux';
import appState from './state';
import thunkMiddleware from 'redux-thunk';
import Config from './config';
import CurrentUser from './current-user';
import {
contentReceiveWebSocket,
contentDeleteFromWebSocket
} from './redux/actions/content-actions';
import {
assignmentsReceiveWebSocket
} from './redux/actions/assignment-actions';
import {
assignmentCommentsReceiveWebSocket
} from './redux/actions/assignment-comment-actions';
import {
snackbarShowMessage,
snackbarClose
} from './redux/actions/snackbar-actions';
import {
applicationSetVersion,
applicationNotifyUpdates,
applicationIsConnected,
applicationFetchSettings
} from './redux/actions/application-actions';
let store = createStore(appState, applyMiddleware(thunkMiddleware));
window.React = React;
window.Store = store;
window._ceoScrollTop = function() {
window.scrollTo(0,0);
}
// start up autobhan
let abStart = false;
store.subscribe(() => {
if (abStart === false) {
abStart = true;
// build the URL
const url = Config.get('_abep');
const clientCode = Config.get('client_code');
// SRN is the username, token is the password
const srn = CurrentUser.getSrn();
const token = Config.get('_abtok');
let warnTimeout = null;
// Initialize the connection, then set up the subs and start the auth process
AutobahnReact.initialize(url + '/' + token, 'realm');
// Library remembers the on ready state, so this will automatically
// reconnect on a dropped connection
AutobahnReact.Connection.onReady((details) => {
store.dispatch(snackbarClose());
store.dispatch(applicationIsConnected(true));
store.dispatch(applicationFetchSettings());
if (warnTimeout) {
clearTimeout(warnTimeout);
warnTimeout = null;
}
// just for testing
AutobahnReact.subscribe('com.getsnworks.ceo.test', function(payload) {
console.log(payload);
});
// broadcast channel allows us to broadcast a message to all users
AutobahnReact.subscribe('com.getsnworks.ceo.broadcast', function(payload) {
console.log(payload);
});
// client specific broadcast and events
AutobahnReact.subscribe('com.getsnworks.ceo.' + clientCode + '.broadcast', function(payload) {
console.log(payload);
});
AutobahnReact.subscribe('com.getsnworks.ceo.' + clientCode + '.contentupdate', function(payload) {
store.dispatch(contentReceiveWebSocket(Immutable.fromJS(payload[0].content)));
});
AutobahnReact.subscribe('com.getsnworks.ceo.' + clientCode + '.contentupdate.deleted', function(payload) {
store.dispatch(contentDeleteFromWebSocket(Immutable.fromJS(payload[0].content)));
});
AutobahnReact.subscribe('com.getsnworks.ceo.' + clientCode + '.assignmentupdate', function(payload) {
store.dispatch(assignmentsReceiveWebSocket(Immutable.fromJS(payload[0].content)));
});
AutobahnReact.subscribe('com.getsnworks.ceo.' + clientCode + '.assignmentcommentupdate', function(payload) {
store.dispatch(assignmentCommentsReceiveWebSocket(Immutable.fromJS(payload[0].content)));
});
});
AutobahnReact.Connection.onLost((details) => {
warnTimeout = setTimeout(() => {
store.dispatch(snackbarShowMessage('Trying to reconnect...', 0));
}, 2000);
store.dispatch(applicationIsConnected(false));
});
// start the WampCra login process
AutobahnReact.Auth.logIn({username: srn, password: token})
.then(() => {
console.log('Connected');
store.dispatch(applicationIsConnected(true));
})
.catch(() => {
store.dispatch(snackbarShowMessage('Unable to connect to server.', 0));
console.log('Unable to connect to server.', arguments);
store.dispatch(applicationIsConnected(false));
});
// check the version and notify
const current = localStorage.getItem('_ceover');
if (!current || current != Config.get('system_version')) {
localStorage.setItem('_ceover', Config.get('system_version'));
store.dispatch(applicationNotifyUpdates());
}
// check rebound for failed messages
setTimeout(() => {
if (window.Rebound && CurrentUser.getEmail().length) {
window.Rebound.check({
publicToken: "5qtz5s5smnfdo2wdunocmp",
email: CurrentUser.getEmail(),
appearance: "alert",
position: "topRight",
title: "Please verify your email"
});
}
}, 2000);
// finally setup the heartbeat
setInterval(() => {
console.info('Dub');
fetch('/sys/ping', {
'credentials': 'same-origin',
})
.then((r) => {
if (r.status !== 200) {
store.dispatch(snackbarShowMessage('Unable to connect to server.', 0));
store.dispatch(applicationIsConnected(false));
return;
}
console.info('Lub');
})
.catch(() => {
store.dispatch(snackbarShowMessage('Unable to communicate with server.', 0));
store.dispatch(applicationIsConnected(false));
});
}, 600000); // every 10 minutes
}
});
/**
* Main entry point for the app. Load the router and inject the routes.
* @type {Object}
*/
ReactDom.render((
<Provider store={store}>
<Router history={browserHistory}>
{buildRoutes(store)}
</Router>
</Provider>
), document.querySelector("#app-container"));