Stackedit/src/store/index.js

125 lines
3.5 KiB
JavaScript
Raw Normal View History

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 './contentState';
import syncedContent from './syncedContent';
import content from './content';
import file from './file';
import findReplace from './findReplace';
import folder from './folder';
import publishLocation from './publishLocation';
import syncLocation from './syncLocation';
import data from './data';
import discussion from './discussion';
import layout from './layout';
import explorer from './explorer';
import modal from './modal';
import notification from './notification';
import queue from './queue';
import userInfo from './userInfo';
2017-07-23 18:42:08 +00:00
Vue.use(Vuex);
2017-10-02 00:34:48 +00:00
const debug = NODE_ENV !== 'production';
2017-07-23 18:42:08 +00:00
2017-08-25 10:37:46 +00:00
const store = new Vuex.Store({
modules: {
contentState,
syncedContent,
content,
discussion,
file,
findReplace,
folder,
publishLocation,
syncLocation,
data,
layout,
explorer,
modal,
notification,
queue,
userInfo,
},
state: {
ready: false,
2017-08-25 10:37:46 +00:00
offline: false,
2017-10-02 00:34:48 +00:00
lastOfflineCheck: 0,
monetizeSponsor: false,
},
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;
},
isSponsor: (state, getters) => {
const loginToken = getters['data/loginToken'];
return state.monetizeSponsor || (loginToken && loginToken.isSponsor);
},
2017-08-17 23:10:35 +00:00
},
mutations: {
setReady: (state) => {
state.ready = true;
},
2017-08-25 10:37:46 +00:00
setOffline: (state, value) => {
state.offline = value;
},
2017-10-02 00:34:48 +00:00
updateLastOfflineCheck: (state) => {
state.lastOfflineCheck = Date.now();
},
setMonetizeSponsor: (state, value) => {
state.monetizeSponsor = value;
},
setGoogleSponsor: (state, value) => {
state.googleSponsor = value;
},
2017-10-02 00:34:48 +00:00
},
actions: {
setOffline: ({ state, commit, dispatch }, value) => {
2017-10-02 00:34:48 +00:00
if (state.offline !== value) {
commit('setOffline', value);
if (state.offline) {
return Promise.reject('You are offline.');
}
dispatch('notification/info', 'You are back online!');
2017-10-02 00:34:48 +00:00
}
return Promise.resolve();
},
createFile({ state, getters, commit }, desc) {
const id = utils.uid();
commit('content/setItem', {
id: `${id}/content`,
text: utils.sanitizeText(desc.text || getters['data/computedSettings'].newFileContent),
properties: utils.sanitizeText(
desc.properties || getters['data/computedSettings'].newFileProperties),
discussions: desc.discussions || {},
comments: desc.comments || {},
});
commit('file/setItem', {
id,
name: utils.sanitizeName(desc.name),
parentId: desc.parentId || null,
});
return Promise.resolve(state.file.itemMap[id]);
},
2017-10-07 11:22:24 +00:00
deleteFile({ getters, commit }, fileId) {
commit('file/deleteItem', fileId);
commit('content/deleteItem', `${fileId}/content`);
commit('syncedContent/deleteItem', `${fileId}/syncedContent`);
commit('contentState/deleteItem', `${fileId}/contentState`);
getters['syncLocation/items']
.filter(item => item.fileId === fileId)
.forEach(item => commit('syncLocation/deleteItem', item.id));
getters['publishLocation/items']
.filter(item => item.fileId === fileId)
.forEach(item => commit('publishLocation/deleteItem', item.id));
},
},
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
export default store;