From a643d2e58260d4cfac589deae5faafb60cd11f14 Mon Sep 17 00:00:00 2001 From: George Payne Date: Mon, 13 May 2024 10:51:42 +0200 Subject: [PATCH] add getOrInsert method to ListStore --- .changeset/beige-pans-try.md | 12 ++++++++++++ packages/stores/src/stores/createListStore.ts | 8 ++++++++ 2 files changed, 20 insertions(+) create mode 100644 .changeset/beige-pans-try.md diff --git a/.changeset/beige-pans-try.md b/.changeset/beige-pans-try.md new file mode 100644 index 00000000..0fcc1647 --- /dev/null +++ b/.changeset/beige-pans-try.md @@ -0,0 +1,12 @@ +--- +'@eventstore-ui/stores': minor +--- + +Get's a single item from the list store, or inserts a default and returns it. + +```ts +const item = store.getOrInsert('my-id', () => ({ + id: 'my-id', + value: Math.random(), +})); +``` diff --git a/packages/stores/src/stores/createListStore.ts b/packages/stores/src/stores/createListStore.ts index b0ca8e7d..8456796a 100644 --- a/packages/stores/src/stores/createListStore.ts +++ b/packages/stores/src/stores/createListStore.ts @@ -21,6 +21,8 @@ export interface ListStore { ) => Array; /** Get a single item from the list. */ get: (id: string) => T | undefined; + /** Get a single item from the list, or insert a default and return it */ + getOrInsert: (id: string, defaultValue: () => T) => T; /** Check if an item is available in the list. */ has: (id: string) => boolean; /** Returns an array of all the keys in the store. */ @@ -99,6 +101,12 @@ export const createListStore = ( return acc; }, []), get: (id) => state[id], + getOrInsert: (id, defaultValue) => { + if (!(id in state)) { + state[id] = defaultValue(); + } + return state[id]; + }, has: (id) => id in state, keys: () => Object.keys(state), onChange: (...args: any[]) => {