From 6f13adbad39470e10e618c6ffd7f6a3eb8250315 Mon Sep 17 00:00:00 2001 From: Mike Ryan Date: Sat, 17 Jul 2021 19:44:45 -0500 Subject: [PATCH] 11-entity --- .../src/lib/books.reducer.ts | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/libs/shared-state-books/src/lib/books.reducer.ts b/libs/shared-state-books/src/lib/books.reducer.ts index 5d6270f..c20766a 100644 --- a/libs/shared-state-books/src/lib/books.reducer.ts +++ b/libs/shared-state-books/src/lib/books.reducer.ts @@ -3,23 +3,15 @@ import { createEntityAdapter, EntityState } from '@ngrx/entity'; import { BookModel, calculateBooksGrossEarnings } from '@book-co/shared-models'; import { BooksPageActions, BooksApiActions } from '@book-co/books-page/actions'; -const createBook = (books: BookModel[], book: BookModel) => [...books, book]; -const updateBook = (books: BookModel[], changes: BookModel) => - books.map((book) => { - return book.id === changes.id ? Object.assign({}, book, changes) : book; - }); -const deleteBook = (books: BookModel[], bookId: string) => - books.filter((book) => bookId !== book.id); - -export interface State { - collection: BookModel[]; +export interface State extends EntityState { activeBookId: string | null; } -export const initialState: State = { - collection: [], +export const adapter = createEntityAdapter(); + +export const initialState: State = adapter.getInitialState({ activeBookId: null, -}; +}); export const reducer = createReducer( initialState, @@ -36,38 +28,38 @@ export const reducer = createReducer( }; }), on(BooksApiActions.booksLoaded, (state, action) => { - return { - ...state, - collection: action.books, - }; + return adapter.setAll(action.books, state); }), on(BooksApiActions.bookCreated, (state, action) => { - return { - collection: createBook(state.collection, action.book), + return adapter.addOne(action.book, { + ...state, activeBookId: null, - }; + }); }), on(BooksApiActions.bookUpdated, (state, action) => { - return { - collection: updateBook(state.collection, action.book), - activeBookId: null, - }; + return adapter.updateOne( + { id: action.book.id, changes: action.book }, + { + ...state, + activeBookId: null, + } + ); }), on(BooksApiActions.bookDeleted, (state, action) => { - return { - ...state, - collection: deleteBook(state.collection, action.bookId), - }; + return adapter.removeOne(action.bookId, state); }) ); -export const selectAll = (state: State) => state.collection; +export const { selectAll, selectEntities } = adapter.getSelectors(); export const selectActiveBookId = (state: State) => state.activeBookId; export const selectActiveBook = createSelector( - selectAll, + selectEntities, selectActiveBookId, - (books, activeBookId) => - books.find((book) => book.id === activeBookId) || null + (booksEntities, activeBookId) => { + if (activeBookId) return booksEntities[activeBookId] ?? null; + + return null; + } ); export const selectEarningsTotals = createSelector( selectAll,