2017-07-23 18:42:08 +00:00
|
|
|
import createLogger from 'vuex/dist/logger';
|
|
|
|
import Vue from 'vue';
|
|
|
|
import Vuex from 'vuex';
|
2017-08-17 23:10:35 +00:00
|
|
|
import utils from '../services/utils';
|
|
|
|
import contentState from './modules/contentState';
|
2017-08-25 10:37:46 +00:00
|
|
|
import syncedContent from './modules/syncedContent';
|
2017-08-17 23:10:35 +00:00
|
|
|
import content from './modules/content';
|
|
|
|
import file from './modules/file';
|
|
|
|
import folder from './modules/folder';
|
2017-09-23 19:01:50 +00:00
|
|
|
import publishLocation from './modules/publishLocation';
|
2017-08-25 10:37:46 +00:00
|
|
|
import syncLocation from './modules/syncLocation';
|
2017-08-03 17:08:12 +00:00
|
|
|
import data from './modules/data';
|
2017-07-23 18:42:08 +00:00
|
|
|
import layout from './modules/layout';
|
2017-07-31 09:04:01 +00:00
|
|
|
import explorer from './modules/explorer';
|
2017-08-03 17:08:12 +00:00
|
|
|
import modal from './modules/modal';
|
2017-09-23 19:01:50 +00:00
|
|
|
import notification from './modules/notification';
|
2017-08-15 10:43:26 +00:00
|
|
|
import queue from './modules/queue';
|
2017-07-23 18:42:08 +00:00
|
|
|
|
|
|
|
Vue.use(Vuex);
|
|
|
|
|
|
|
|
const debug = process.env.NODE_ENV !== 'production';
|
|
|
|
|
2017-08-25 10:37:46 +00:00
|
|
|
const store = new Vuex.Store({
|
2017-08-03 17:08:12 +00:00
|
|
|
state: {
|
|
|
|
ready: false,
|
2017-08-25 10:37:46 +00:00
|
|
|
offline: false,
|
2017-08-03 17:08:12 +00:00
|
|
|
},
|
2017-08-17 23:10:35 +00:00
|
|
|
getters: {
|
|
|
|
allItemMap: (state) => {
|
|
|
|
const result = {};
|
|
|
|
utils.types.forEach(type => Object.assign(result, state[type].itemMap));
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
},
|
2017-08-03 17:08:12 +00:00
|
|
|
mutations: {
|
|
|
|
setReady: (state) => {
|
|
|
|
state.ready = true;
|
|
|
|
},
|
2017-08-25 10:37:46 +00:00
|
|
|
setOffline: (state, value) => {
|
|
|
|
state.offline = value;
|
|
|
|
},
|
2017-08-03 17:08:12 +00:00
|
|
|
},
|
2017-07-23 18:42:08 +00:00
|
|
|
modules: {
|
2017-08-17 23:10:35 +00:00
|
|
|
contentState,
|
2017-08-25 10:37:46 +00:00
|
|
|
syncedContent,
|
2017-08-17 23:10:35 +00:00
|
|
|
content,
|
|
|
|
file,
|
|
|
|
folder,
|
2017-09-23 19:01:50 +00:00
|
|
|
publishLocation,
|
2017-08-25 10:37:46 +00:00
|
|
|
syncLocation,
|
2017-08-03 17:08:12 +00:00
|
|
|
data,
|
2017-07-23 18:42:08 +00:00
|
|
|
layout,
|
2017-07-31 09:04:01 +00:00
|
|
|
explorer,
|
2017-08-03 17:08:12 +00:00
|
|
|
modal,
|
2017-09-23 19:01:50 +00:00
|
|
|
notification,
|
2017-08-15 10:43:26 +00:00
|
|
|
queue,
|
2017-07-23 18:42:08 +00:00
|
|
|
},
|
|
|
|
strict: debug,
|
2017-07-27 20:19:52 +00:00
|
|
|
plugins: debug ? [createLogger()] : [],
|
2017-07-23 18:42:08 +00:00
|
|
|
});
|
2017-08-25 10:37:46 +00:00
|
|
|
|
2017-09-23 19:01:50 +00:00
|
|
|
let isConnectionDown = false;
|
|
|
|
let lastConnectionCheck = 0;
|
|
|
|
|
2017-08-25 10:37:46 +00:00
|
|
|
function checkOffline() {
|
2017-09-23 19:01:50 +00:00
|
|
|
const isBrowserOffline = window.navigator.onLine === false;
|
|
|
|
if (!isBrowserOffline && lastConnectionCheck + 30000 < Date.now() && utils.isUserActive()) {
|
|
|
|
lastConnectionCheck = Date.now();
|
|
|
|
utils.checkOnline()
|
|
|
|
.then(() => {
|
|
|
|
isConnectionDown = false;
|
|
|
|
}, () => {
|
|
|
|
isConnectionDown = true;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
const isOffline = isBrowserOffline || isConnectionDown;
|
2017-08-25 10:37:46 +00:00
|
|
|
if (isOffline !== store.state.offline) {
|
|
|
|
store.commit('setOffline', isOffline);
|
2017-09-23 19:01:50 +00:00
|
|
|
if (isOffline) {
|
|
|
|
store.dispatch('notification/info', 'You are offline.');
|
|
|
|
} else {
|
|
|
|
store.dispatch('notification/info', 'You are back online!');
|
|
|
|
}
|
2017-08-25 10:37:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
utils.setInterval(checkOffline, 1000);
|
|
|
|
window.addEventListener('online', checkOffline);
|
|
|
|
window.addEventListener('offline', checkOffline);
|
|
|
|
|
|
|
|
export default store;
|