import PouchDB from 'pouchdb'; import * as R from 'remeda'; import Dexie, { liveQuery } from 'dexie'; import { writable, derived, get } from 'svelte/store'; import { genNextBattle } from './genNextBattle.js'; import u from '@yanick/updeep-remeda'; const seedCampaign = { battles: [], }; export function genApi(options = {}) { // if (options.local) MyPouch.plugin(pouchMem); if (options.pouch) options.pouch(PouchDB); const pouchdb = new PouchDB( 'Campaigns', options.local ? { adapter: 'memory', } : {}, ); const campaignsCore = writable([]); pouchdb .allDocs({ include_docs: true }) .then((r) => r.rows.map(({ id, doc }) => [id, doc])) .then(Object.fromEntries) .then(campaignsCore.set); pouchdb .changes({ since: 'now', live: true, include_docs: true }) .on('change', (change) => { if (change.deleted) { campaignsCore.update(u.updateIn(change.id, u.skip)); } else { campaignsCore.update(u.updateIn(change.id, change.doc)); } }); const campaigns = derived(campaignsCore, Object.values); const addCampaign = (name) => pouchdb.post({ name, ...seedCampaign, battles: [{ id: 1, ...genNextBattle() }], }); const activeCampaignId = writable(0); const setActiveCampaign = activeCampaignId.set; const activeCampaign = derived( [campaignsCore, activeCampaignId], ([$c, $id]) => $c[$id], ); const setBattleDifficulty = (battleId, difficulty) => { pouchdb .put( u.updateIn(get(activeCampaign), `battles.${battleId - 1}`, { difficulty, }), ) .catch((e) => console.error(e)); }; const setBattleVerdict = (battleId, status) => { let campaign = get(activeCampaign); campaign = u.updateIn(campaign, `battles.${battleId - 1}`, { status, }); campaign = u(campaign, { battles: (battles) => [ ...battles, u(genNextBattle(campaign.battles), { id: battles.length + 1, }), ], }); pouchdb.put(campaign).catch((e) => console.error(e)); }; const deleteCampaign = (_id) => pouchdb.remove(get(campaigns).find(u.matches({ _id }))); return { campaigns, activeCampaign, event: { deleteCampaign, addCampaign, setActiveCampaign, setBattleVerdict, setBattleDifficulty, }, }; /* const activeCampaign = writeable(); addCampaign: (name) => storage.campaigns.add({ name, ...seedCampaign, battles: [{ id: 1, ...genNextBattle() }], }), return { campaigns, event: { , addCampaign: (name) => storage.campaigns.add({ name, ...seedCampaign, battles: [{ id: 1, ...genNextBattle() }], }), deleteCampaign: (id) => storage.campaigns.delete(id), }, }; */ }