Files
FabledCurator/frontend/src/stores/provenance.js
T
2026-05-19 11:17:14 -04:00

48 lines
1.7 KiB
JavaScript

import { defineStore } from 'pinia'
import { ref } from 'vue'
import { useApi } from '../composables/useApi.js'
// Provenance is its own system — this store is deliberately independent
// of the modal/tags stores (see project_provenance_separation).
export const useProvenanceStore = defineStore('provenance', () => {
const api = useApi()
const imageCache = ref({}) // id -> { loading, error, entries|null }
const postCache = ref({}) // id -> { loading, error, data|null }
async function loadForImage(id) {
const cur = imageCache.value[id]
if (cur && (cur.loading || cur.entries !== null)) return
imageCache.value[id] = { loading: true, error: null, entries: null }
try {
const body = await api.get(`/api/provenance/image/${id}`)
imageCache.value[id] = {
loading: false, error: null,
entries: body.provenance,
attachments: body.attachments || [],
}
} catch (e) {
imageCache.value[id] =
{ loading: false, error: e.message, entries: null }
}
}
async function loadForPost(id) {
const cur = postCache.value[id]
if (cur && (cur.loading || cur.data !== null)) return
postCache.value[id] = { loading: true, error: null, data: null }
try {
const body = await api.get(`/api/provenance/post/${id}`)
postCache.value[id] = { loading: false, error: null, data: body }
} catch (e) {
postCache.value[id] = { loading: false, error: e.message, data: null }
}
}
function imageProv(id) { return imageCache.value[id] || null }
function postInfo(id) { return postCache.value[id] || null }
return { imageCache, postCache, loadForImage, loadForPost,
imageProv, postInfo }
})