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

48 lines
1.2 KiB
JavaScript
Raw Normal View History

2023-01-12 23:02:29 +00:00
import * as R from 'remeda';
2023-01-12 19:20:54 +00:00
import Dexie, { liveQuery } from 'dexie';
2023-01-12 21:42:34 +00:00
import { writable, derived } from 'svelte/store';
2023-01-12 23:02:29 +00:00
import { genNextBattle } from './genNextBattle.js';
2023-01-12 19:20:54 +00:00
const seedCampaign = {
battles: [],
};
export function genApi(options = {}) {
const storage = new Dexie('Campaigns', options.dexie ?? {});
storage.version(1).stores({
campaigns: '++id,name',
});
2023-01-12 23:02:29 +00:00
const campaigns = writable([]);
storage.campaigns.toArray().then((c) => campaigns.set(c));
2023-01-12 19:20:54 +00:00
2023-01-12 21:42:34 +00:00
const activeCampaignId = writable();
2023-01-12 23:02:29 +00:00
const activeCampaign = derived(
[activeCampaignId, campaigns],
async ([id, campaigns], set) => {
const x = campaigns.find((c) => c.id === id);
set(x);
},
);
2023-01-12 21:42:34 +00:00
2023-01-12 19:20:54 +00:00
return {
campaigns,
2023-01-12 21:42:34 +00:00
activeCampaign,
2023-01-12 19:20:54 +00:00
storage,
event: {
addCampaign: (name) =>
2023-01-12 23:02:29 +00:00
storage.campaigns.add({
name,
...seedCampaign,
battles: [genNextBattle()],
}),
2023-01-12 19:20:54 +00:00
deleteCampaign: (id) => storage.campaigns.delete(id),
2023-01-12 21:42:34 +00:00
setActiveCampaign: async (id) => {
activeCampaignId.set(id);
},
2023-01-12 19:20:54 +00:00
},
};
}