96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
|
import axios from 'axios'
|
||
|
import { defineStore } from 'pinia'
|
||
|
export const workspaceEndpoint = '/api/open/workspaces/'
|
||
|
|
||
|
const localStorageCurrentWorkspaceKey = 'currentWorkspace'
|
||
|
|
||
|
export const useWorkspacesStore = defineStore('workspaces', {
|
||
|
state: () => ({
|
||
|
content: [],
|
||
|
currentId: null,
|
||
|
loading: false
|
||
|
}),
|
||
|
getters: {
|
||
|
getById: (state) => (id) => {
|
||
|
if (state.content.length === 0) return null
|
||
|
return state.content.find(item => item.id === id)
|
||
|
},
|
||
|
getCurrent: (state) => () => {
|
||
|
if (state.content.length === 0 || state.currentId === null) return null
|
||
|
return state.content.find(item => item.id === state.currentId)
|
||
|
}
|
||
|
},
|
||
|
actions: {
|
||
|
set (items) {
|
||
|
this.content = items
|
||
|
if (this.currentId == null && this.content.length > 0) {
|
||
|
// If one only, set it
|
||
|
if (this.content.length === 1) {
|
||
|
this.currentId = items[0].id
|
||
|
localStorage.setItem(localStorageCurrentWorkspaceKey, this.currentId)
|
||
|
} else if (localStorage.getItem(localStorageCurrentWorkspaceKey) && this.content.find(item => item.id === parseInt(localStorage.getItem(localStorageCurrentWorkspaceKey)))) {
|
||
|
// Check local storage for current workspace, or take first
|
||
|
this.currentId = parseInt(localStorage.getItem(localStorageCurrentWorkspaceKey))
|
||
|
localStorage.setItem(localStorageCurrentWorkspaceKey, this.currentId)
|
||
|
} else {
|
||
|
// Else, take first
|
||
|
this.currentId = items[0].id
|
||
|
localStorage.setItem(localStorageCurrentWorkspaceKey, this.currentId)
|
||
|
}
|
||
|
} else {
|
||
|
localStorage.removeItem(localStorageCurrentWorkspaceKey)
|
||
|
}
|
||
|
},
|
||
|
setCurrentId (id) {
|
||
|
this.currentId = id
|
||
|
localStorage.setItem(localStorageCurrentWorkspaceKey, id)
|
||
|
},
|
||
|
addOrUpdate (item) {
|
||
|
this.content = this.content.filter((val) => val.id !== item.id)
|
||
|
this.content.push(item)
|
||
|
if (this.currentId == null) {
|
||
|
this.currentId = item.id
|
||
|
localStorage.setItem(localStorageCurrentWorkspaceKey, this.currentId)
|
||
|
}
|
||
|
},
|
||
|
remove (itemId) {
|
||
|
this.content = this.content.filter((val) => val.id !== itemId)
|
||
|
if (this.currentId === itemId) {
|
||
|
this.currentId = this.content.length > 0 ? this.content[0].id : null
|
||
|
localStorage.setItem(localStorageCurrentWorkspaceKey, this.currentId)
|
||
|
}
|
||
|
},
|
||
|
startLoading () {
|
||
|
this.loading = true
|
||
|
},
|
||
|
stopLoading () {
|
||
|
this.loading = false
|
||
|
},
|
||
|
resetState () {
|
||
|
this.set([])
|
||
|
this.stopLoading()
|
||
|
},
|
||
|
load () {
|
||
|
this.set([])
|
||
|
this.startLoading()
|
||
|
return axios.get(workspaceEndpoint).then((response) => {
|
||
|
this.set(response.data)
|
||
|
this.stopLoading()
|
||
|
})
|
||
|
},
|
||
|
loadIfEmpty () {
|
||
|
if (this.content.length === 0) {
|
||
|
return this.load()
|
||
|
}
|
||
|
return Promise.resolve()
|
||
|
},
|
||
|
delete (id) {
|
||
|
this.startLoading()
|
||
|
return axios.delete(workspaceEndpoint + id).then((response) => {
|
||
|
this.remove(response.data.workspace_id)
|
||
|
this.stopLoading()
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
})
|