Refactoring with a MapStore
A great deal of the complexity of the current code is that we must chain 2 reactive values (one in the map "GameScene.MapPlayersByKey" and one in the snapshot store). The new generic MapStore class can be used to listen to stores inside a map. When the store inside the map, or the map itself is modified, the resulting store is updated.
This commit is contained in:
parent
bbe539b785
commit
0e68490e75
11 changed files with 277 additions and 83 deletions
97
front/tests/Stores/Utils/MapStoreTest.ts
Normal file
97
front/tests/Stores/Utils/MapStoreTest.ts
Normal file
|
@ -0,0 +1,97 @@
|
|||
import "jasmine";
|
||||
import {MapStore} from "../../../src/Stores/Utils/MapStore";
|
||||
import type {Readable, Writable} from "svelte/store";
|
||||
import {get, writable} from "svelte/store";
|
||||
|
||||
describe("Main store", () => {
|
||||
it("Set / delete / clear triggers main store updates", () => {
|
||||
const mapStore = new MapStore<string, string>();
|
||||
|
||||
let triggered = false;
|
||||
|
||||
mapStore.subscribe((map) => {
|
||||
triggered = true;
|
||||
expect(map).toBe(mapStore);
|
||||
})
|
||||
|
||||
expect(triggered).toBeTrue();
|
||||
triggered = false;
|
||||
mapStore.set('foo', 'bar');
|
||||
expect(triggered).toBeTrue();
|
||||
|
||||
triggered = false;
|
||||
mapStore.delete('baz');
|
||||
expect(triggered).toBe(false);
|
||||
mapStore.delete('foo');
|
||||
expect(triggered).toBe(true);
|
||||
|
||||
triggered = false;
|
||||
mapStore.clear();
|
||||
expect(triggered).toBe(true);
|
||||
});
|
||||
|
||||
it("generates stores for keys with getStore", () => {
|
||||
|
||||
const mapStore = new MapStore<string, string>();
|
||||
|
||||
let valueReceivedInStoreForFoo: string|undefined;
|
||||
let valueReceivedInStoreForBar: string|undefined;
|
||||
|
||||
mapStore.set('foo', 'someValue');
|
||||
|
||||
mapStore.getStore('foo').subscribe((value) => {
|
||||
valueReceivedInStoreForFoo = value;
|
||||
});
|
||||
const unsubscribeBar = mapStore.getStore('bar').subscribe((value) => {
|
||||
valueReceivedInStoreForBar = value;
|
||||
});
|
||||
|
||||
expect(valueReceivedInStoreForFoo).toBe('someValue');
|
||||
expect(valueReceivedInStoreForBar).toBe(undefined);
|
||||
mapStore.set('foo', 'someOtherValue');
|
||||
expect(valueReceivedInStoreForFoo).toBe('someOtherValue');
|
||||
mapStore.delete('foo');
|
||||
expect(valueReceivedInStoreForFoo).toBe(undefined);
|
||||
mapStore.set('bar', 'baz');
|
||||
expect(valueReceivedInStoreForBar).toBe('baz');
|
||||
mapStore.clear();
|
||||
expect(valueReceivedInStoreForBar).toBe(undefined);
|
||||
unsubscribeBar();
|
||||
mapStore.set('bar', 'fiz');
|
||||
expect(valueReceivedInStoreForBar).toBe(undefined);
|
||||
});
|
||||
|
||||
it("generates stores with getStoreByAccessor", () => {
|
||||
const mapStore = new MapStore<string, {
|
||||
foo: string,
|
||||
store: Writable<string>
|
||||
}>();
|
||||
|
||||
const fooStore = mapStore.getNestedStore('foo', (value) => {
|
||||
return value.store;
|
||||
});
|
||||
|
||||
mapStore.set('foo', {
|
||||
foo: 'bar',
|
||||
store: writable('init')
|
||||
});
|
||||
|
||||
expect(get(fooStore)).toBe('init');
|
||||
|
||||
mapStore.get('foo')?.store.set('newVal');
|
||||
|
||||
expect(get(fooStore)).toBe('newVal');
|
||||
|
||||
mapStore.set('foo', {
|
||||
foo: 'bar',
|
||||
store: writable('anotherVal')
|
||||
});
|
||||
|
||||
expect(get(fooStore)).toBe('anotherVal');
|
||||
|
||||
mapStore.delete('foo');
|
||||
|
||||
expect(get(fooStore)).toBeUndefined();
|
||||
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue