Stackedit/src/store/workspace.js
2018-07-17 20:58:40 +01:00

135 lines
5.0 KiB
JavaScript

import utils from '../services/utils';
import providerRegistry from '../services/providers/common/providerRegistry';
import constants from '../data/constants';
export default {
namespaced: true,
state: {
currentWorkspaceId: null,
lastFocus: 0,
},
mutations: {
setCurrentWorkspaceId: (state, value) => {
state.currentWorkspaceId = value;
},
setLastFocus: (state, value) => {
state.lastFocus = value;
},
},
getters: {
workspacesById: (state, getters, rootState, rootGetters) => {
const workspacesById = {};
const mainWorkspaceToken = rootGetters['workspace/mainWorkspaceToken'];
Object.entries(rootGetters['data/workspaces']).forEach(([id, workspace]) => {
const sanitizedWorkspace = {
id,
providerId: 'googleDriveAppData',
sub: mainWorkspaceToken && mainWorkspaceToken.sub,
...workspace,
};
// Filter workspaces that don't have a provider
const workspaceProvider = providerRegistry.providersById[sanitizedWorkspace.providerId];
if (workspaceProvider) {
// Build the url with the current hostname
const params = workspaceProvider.getWorkspaceParams(sanitizedWorkspace);
sanitizedWorkspace.url = utils.addQueryParams('app', params, true);
sanitizedWorkspace.locationUrl = workspaceProvider
.getWorkspaceLocationUrl(sanitizedWorkspace);
workspacesById[id] = sanitizedWorkspace;
}
});
return workspacesById;
},
mainWorkspace: (state, { workspacesById }) => workspacesById.main,
currentWorkspace: ({ currentWorkspaceId }, { workspacesById, mainWorkspace }) =>
workspacesById[currentWorkspaceId] || mainWorkspace,
currentWorkspaceIsGit: (state, { currentWorkspace }) =>
currentWorkspace.providerId === 'githubWorkspace',
currentWorkspaceHasUniquePaths: (state, { currentWorkspace }) =>
currentWorkspace.providerId === 'githubWorkspace',
lastSyncActivityKey: (state, { currentWorkspace }) => `${currentWorkspace.id}/lastSyncActivity`,
lastFocusKey: (state, { currentWorkspace }) => `${currentWorkspace.id}/lastWindowFocus`,
mainWorkspaceToken: (state, getters, rootState, rootGetters) =>
utils.someResult(Object.values(rootGetters['data/googleTokensBySub']), (token) => {
if (token.isLogin) {
return token;
}
return null;
}),
syncToken: (state, { currentWorkspace, mainWorkspaceToken }, rootState, rootGetters) => {
switch (currentWorkspace.providerId) {
case 'googleDriveWorkspace':
return rootGetters['data/googleTokensBySub'][currentWorkspace.sub];
case 'githubWorkspace':
return rootGetters['data/githubTokensBySub'][currentWorkspace.sub];
case 'couchdbWorkspace':
return rootGetters['data/couchdbTokensBySub'][currentWorkspace.id];
default:
return mainWorkspaceToken;
}
},
loginToken: (state, { currentWorkspace, mainWorkspaceToken }, rootState, rootGetters) => {
switch (currentWorkspace.providerId) {
case 'googleDriveWorkspace':
return rootGetters['data/googleTokensBySub'][currentWorkspace.sub];
case 'githubWorkspace':
return rootGetters['data/githubTokensBySub'][currentWorkspace.sub];
default:
return mainWorkspaceToken;
}
},
userId: (state, { loginToken }, rootState, rootGetters) => {
if (!loginToken) {
return null;
}
const prefix = utils.someResult(Object.entries(constants.userIdPrefixes), ([key, value]) => {
if (rootGetters[`data/${value}TokensBySub`][loginToken.sub]) {
return key;
}
return null;
});
return prefix ? `${prefix}:${loginToken.sub}` : loginToken.sub;
},
sponsorToken: (state, { mainWorkspaceToken }) => mainWorkspaceToken,
},
actions: {
removeWorkspace: ({ commit, rootGetters }, id) => {
const workspaces = {
...rootGetters['data/workspaces'],
};
delete workspaces[id];
commit(
'data/setItem',
{ id: 'workspaces', data: workspaces },
{ root: true },
);
},
patchWorkspacesById: ({ commit, rootGetters }, workspaces) => {
const sanitizedWorkspaces = {};
Object
.values({
...rootGetters['data/workspaces'],
...workspaces,
})
.forEach((workspace) => {
sanitizedWorkspaces[workspace.id] = {
...workspace,
// Do not store urls
url: undefined,
locationUrl: undefined,
};
});
commit(
'data/setItem',
{ id: 'workspaces', data: sanitizedWorkspaces },
{ root: true },
);
},
setCurrentWorkspaceId: ({ commit, getters }, value) => {
commit('setCurrentWorkspaceId', value);
const lastFocus = parseInt(localStorage.getItem(getters.lastFocusKey), 10) || 0;
commit('setLastFocus', lastFocus);
},
},
};