import { defineStore } from 'pinia' import { ref } from 'vue' import { useApi } from '../composables/useApi.js' export const useAllowlistStore = defineStore('allowlist', () => { const api = useApi() const rows = ref([]) const loading = ref(false) async function load() { loading.value = true try { rows.value = await api.get('/api/allowlist') } finally { loading.value = false } } async function updateThreshold(tagId, minConfidence) { await api.patch(`/api/tags/${tagId}/allowlist`, { body: { min_confidence: minConfidence } }) const r = rows.value.find(x => x.tag_id === tagId) if (r) { r.min_confidence = minConfidence // The committed threshold changed the covered pool — refresh the row's // coverage so the table stays truthful after a save. try { r.coverage_count = (await coverage(tagId, minConfidence)).count } catch { /* leave the stale count rather than blank it */ } } } // Live "at threshold T, a sweep would cover ~N images" projection for the // tuning dashboard. Returns { count, threshold }. async function coverage(tagId, threshold) { return api.get(`/api/tags/${tagId}/allowlist/coverage`, { params: { threshold } }) } async function remove(tagId) { await api.delete(`/api/tags/${tagId}/allowlist`) rows.value = rows.value.filter(x => x.tag_id !== tagId) } return { rows, loading, load, updateThreshold, coverage, remove } })