bgg-ottawa-sell-club/src/lib/stores/index.js

66 lines
1.9 KiB
JavaScript

import { readable, writable, derived } from 'svelte/store';
import { dev, browser } from '$app/environment';
import u from '@yanick/updeep-remeda';
const prefix = import.meta.env.VITE_DB_DIR ?? '/db/';
console.log({ prefix });
const _games_store = readable([], (set) => {
if (!browser) return;
fetch(prefix + 'games.json')
.then((doc) => doc.json())
.then((games) =>
games.map((game) => ({
...game,
id: [game.username, game.bgg_id].join('!'),
})),
)
.then(set);
});
export const sellers_store = readable({}, (set) => {
if (!browser) return;
fetch(prefix + 'sellers.json')
.then((doc) => doc.json())
.then((sellers_list) =>
set(
Object.fromEntries(
sellers_list.map((seller) => [seller.username, seller]),
),
),
);
});
let stored = localStorage.getItem('games_hidden');
if (stored) stored = JSON.parse(stored);
const games_hidden_store = writable(stored || {});
games_hidden_store.subscribe((data) =>
localStorage.setItem('games_hidden', JSON.stringify(data)),
);
let cart_store_stored = localStorage.getItem('cart');
if (cart_store_stored) cart_store_stored = JSON.parse(cart_store_stored);
export const cart_store = writable(cart_store_stored || {});
cart_store.subscribe((data) =>
localStorage.setItem('cart', JSON.stringify(data)),
);
export const games_store = derived(
[_games_store, games_hidden_store, cart_store],
([$games, $hidden, $cart]) =>
$games.map((game) => ({
...game,
is_hidden: $hidden[game.id],
is_in_cart: $cart[game.id],
})),
);
games_store.toggle_hidden = (id) => {
games_hidden_store.update(u.updateIn(id, (v) => !v));
};
games_store.toggle_cart = (id) => {
cart_store.update(u.updateIn(id, (v) => !v));
};