under-falling-skies/src/lib/store/api.js

130 lines
2.9 KiB
JavaScript

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),
},
};
*/
}