import PocketBase from 'pocketbase' import { POCKETBASE_URL, PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD } from './pocketbase-config.js' const COLLECTION = 'instructions' let pb = null let authPromise = null function getClient() { if (!pb) { pb = new PocketBase(POCKETBASE_URL) // Main process may receive overlapping IPC calls (e.g. React Strict Mode). // Default auto-cancel would abort duplicate in-flight PocketBase requests. pb.autoCancellation(false) } return pb } function parseEntry(r) { return { id: r.id, vaccine: r.vaccine ?? '', instruction: r.instruction ?? '', created: r.created, updated: r.updated, } } export async function ensureAuth() { const client = getClient() if (client.authStore.isValid) return if (authPromise) { await authPromise return } // PocketBase v0.23+ removed /api/admins/*; superusers authenticate as a collection. authPromise = client .collection('_superusers') .authWithPassword(PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD) try { await authPromise } catch (err) { authPromise = null throw err } } export async function fetchEntries() { await ensureAuth() const list = await getClient().collection(COLLECTION).getFullList({ sort: '-created' }) return list.map(parseEntry) } export async function createEntry({ vaccine, instruction }) { await ensureAuth() const record = await getClient().collection(COLLECTION).create({ vaccine: vaccine.trim(), instruction: instruction.trim(), }) return parseEntry(record) } export async function updateEntry(id, { instruction, vaccine, includeVaccine }) { await ensureAuth() const body = { instruction: instruction.trim() } if (includeVaccine && vaccine != null) { body.vaccine = vaccine.trim() } const record = await getClient().collection(COLLECTION).update(id, body) return parseEntry(record) } export async function deleteEntry(id) { await ensureAuth() await getClient().collection(COLLECTION).delete(id) }