bookmarks/src/store/index.js

118 lines
2.5 KiB
JavaScript

import Vue from 'vue'
import Vuex, { Store } from 'vuex'
import Mutations from './mutations'
import Actions from './actions'
import { privateRoutes, publicRoutes } from '../router'
Vue.use(Vuex)
export { mutations } from './mutations'
export { actions } from './actions'
export default new Store({
mutations: Mutations,
actions: Actions,
state: {
public: false,
authToken: null,
fetchState: {
page: 0,
query: {},
reachedEnd: false,
},
loading: {
tags: false,
folders: false,
bookmarks: false,
createBookmark: false,
saveBookmark: false,
createFolder: false,
saveFolder: false,
moveSelection: false,
},
error: null,
notification: null,
settings: {
viewMode: 'list',
sorting: 'lastmodified',
limit: 0,
},
bookmarks: [],
bookmarksById: {},
sharesById: {},
tags: [],
folders: [],
foldersById: {},
tokensByFolder: {},
countsByFolder: {},
selection: {
folders: [],
bookmarks: [],
},
displayNewBookmark: false,
displayNewFolder: false,
displayMoveDialog: false,
sidebar: null,
viewMode: 'list',
},
getters: {
getBookmark: state => id => {
return state.bookmarksById[id]
},
getFolder: state => id => {
if (Number(id) === -1) {
return [{ id: '-1', children: state.folders }]
}
return findFolder(id, state.folders)
},
getSharesOfFolder: state => folderId => {
return Object.values(state.sharesById).filter(share => share.folderId === folderId)
},
getTokenOfFolder: state => folderId => {
return state.tokensByFolder[folderId]
},
getRoutes: state => () => {
if (state.public) {
return publicRoutes
}
return privateRoutes
},
getPermissionsForFolder: (state, getters) => folderId => {
const path = getters.getFolder(folderId)
for (let i = 0; i < path.length; i++) {
const shares = getters.getSharesOfFolder(path[i].id)
if (shares.length) {
return shares[0]
}
}
return {}
},
getPermissionsForBookmark: (state, getters) => bookmarkId => {
const bookmark = getters.getBookmark(bookmarkId)
if (!bookmark) {
return {}
}
return getters.getPermissionsForFolder(bookmark.folders[0])
},
},
})
function findFolder(id, children) {
if (!children || !children.length) return []
const folders = children.filter(folder => Number(folder.id) === Number(id))
if (folders.length) {
return folders
} else {
for (const child of children) {
const folders = findFolder(id, child.children)
if (folders.length) {
folders.push(child)
return folders
}
}
return []
}
}