48 lines
1.2 KiB
JavaScript
48 lines
1.2 KiB
JavaScript
import * as R from 'remeda';
|
|
import Dexie, { liveQuery } from 'dexie';
|
|
import { writable, derived } from 'svelte/store';
|
|
import { genNextBattle } from './genNextBattle.js';
|
|
|
|
const seedCampaign = {
|
|
battles: [],
|
|
};
|
|
|
|
export function genApi(options = {}) {
|
|
const storage = new Dexie('Campaigns', options.dexie ?? {});
|
|
|
|
storage.version(1).stores({
|
|
campaigns: '++id,name',
|
|
});
|
|
|
|
const campaigns = writable([]);
|
|
storage.campaigns.toArray().then((c) => campaigns.set(c));
|
|
|
|
const activeCampaignId = writable();
|
|
|
|
const activeCampaign = derived(
|
|
[activeCampaignId, campaigns],
|
|
async ([id, campaigns], set) => {
|
|
const x = campaigns.find((c) => c.id === id);
|
|
set(x);
|
|
},
|
|
);
|
|
|
|
return {
|
|
campaigns,
|
|
activeCampaign,
|
|
storage,
|
|
event: {
|
|
addCampaign: (name) =>
|
|
storage.campaigns.add({
|
|
name,
|
|
...seedCampaign,
|
|
battles: [genNextBattle()],
|
|
}),
|
|
deleteCampaign: (id) => storage.campaigns.delete(id),
|
|
setActiveCampaign: async (id) => {
|
|
activeCampaignId.set(id);
|
|
},
|
|
},
|
|
};
|
|
}
|