pleroma-fe/src/modules/drafts.js

86 lines
2.3 KiB
JavaScript
Raw Normal View History

import { storage } from 'src/lib/storage.js'
2023-03-10 11:20:06 -05:00
export const defaultState = {
drafts: {}
}
export const mutations = {
addOrSaveDraft (state, { draft }) {
state.drafts[draft.id] = draft
2023-03-10 12:39:08 -05:00
},
abandonDraft (state, { id }) {
delete state.drafts[id]
},
loadDrafts (state, data) {
state.drafts = data
2023-03-10 11:20:06 -05:00
}
}
const storageKey = 'pleroma-fe-drafts'
/*
* Note: we do not use the persist state plugin because
* it is not impossible for a user to have two windows at
* the same time. The persist state plugin is just overriding
* everything with the current state. This isn't good because
* if a draft is created in one window and another draft is
* created in another, the draft in the first window will just
* be overriden.
* Here, we can't guarantee 100% atomicity unless one uses
* different keys, which will just pollute the whole storage.
* It is indeed best to have backend support for this.
*/
const getStorageData = async () => ((await storage.getItem(storageKey)) || {})
const saveDraftToStorage = async (draft) => {
const currentData = await getStorageData()
currentData[draft.id] = JSON.parse(JSON.stringify(draft))
await storage.setItem(storageKey, currentData)
}
const deleteDraftFromStorage = async (id) => {
const currentData = await getStorageData()
delete currentData[id]
await storage.setItem(storageKey, currentData)
}
2023-03-10 11:20:06 -05:00
export const actions = {
async addOrSaveDraft (store, { draft }) {
2023-03-10 11:20:06 -05:00
const id = draft.id || (new Date().getTime()).toString()
const draftWithId = { ...draft, id }
store.commit('addOrSaveDraft', { draft: draftWithId })
await saveDraftToStorage(draftWithId)
2023-03-10 11:20:06 -05:00
return id
2023-03-10 12:39:08 -05:00
},
async abandonDraft (store, { id }) {
2023-03-10 12:39:08 -05:00
store.commit('abandonDraft', { id })
await deleteDraftFromStorage(id)
},
async loadDrafts (store) {
const currentData = await getStorageData()
store.commit('loadDrafts', currentData)
2023-03-10 11:20:06 -05:00
}
}
export const getters = {
draftsByTypeAndRefId (state) {
return (type, refId) => {
return Object.values(state.drafts).filter(draft => draft.type === type && draft.refId === refId)
}
2023-03-10 12:10:39 -05:00
},
draftsArray (state) {
return Object.values(state.drafts)
2023-03-10 20:22:41 -05:00
},
draftCount (state) {
return Object.values(state.drafts).length
2023-03-10 11:20:06 -05:00
}
}
const drafts = {
state: defaultState,
mutations,
getters,
actions
}
export default drafts