From 50e0071b30c49872beb939557aa35a95362b4196 Mon Sep 17 00:00:00 2001 From: Brandon Roberts Date: Tue, 30 Jul 2019 19:36:05 -0600 Subject: [PATCH] 08-reducer-creators complete --- src/app/books/actions/books-api.actions.ts | 7 -- src/app/books/actions/books-page.actions.ts | 8 --- src/app/shared/state/books.reducer.ts | 73 ++++++++++----------- 3 files changed, 34 insertions(+), 54 deletions(-) diff --git a/src/app/books/actions/books-api.actions.ts b/src/app/books/actions/books-api.actions.ts index f7e4c18..3d59880 100644 --- a/src/app/books/actions/books-api.actions.ts +++ b/src/app/books/actions/books-api.actions.ts @@ -20,10 +20,3 @@ export const bookDeleted = createAction( "[Books API] Book Deleted", props<{ book: Book }>() ); - -export type BooksApiActions = ReturnType< - | typeof booksLoaded - | typeof bookCreated - | typeof bookUpdated - | typeof bookDeleted ->; diff --git a/src/app/books/actions/books-page.actions.ts b/src/app/books/actions/books-page.actions.ts index 0de5068..10400c0 100644 --- a/src/app/books/actions/books-page.actions.ts +++ b/src/app/books/actions/books-page.actions.ts @@ -27,11 +27,3 @@ export const deleteBook = createAction( props<{ book: Book }>() ); -export type BooksActions = ReturnType< - | typeof enter - | typeof selectBook - | typeof clearSelectedBook - | typeof createBook - | typeof updateBook - | typeof deleteBook ->; diff --git a/src/app/shared/state/books.reducer.ts b/src/app/shared/state/books.reducer.ts index 942b127..a5bf841 100644 --- a/src/app/shared/state/books.reducer.ts +++ b/src/app/shared/state/books.reducer.ts @@ -1,7 +1,7 @@ import { createEntityAdapter, EntityAdapter, EntityState } from "@ngrx/entity"; import { Book } from "src/app/shared/models/book.model"; import { BooksPageActions, BooksApiActions } from "src/app/books/actions"; -import { createSelector } from "@ngrx/store"; +import { createSelector, on, createReducer, Action } from "@ngrx/store"; export const initialBooks: Book[] = [ { @@ -34,47 +34,42 @@ export const initialState = adapter.getInitialState({ activeBookId: null }); +const booksReducer = createReducer( + initialState, + on(BooksApiActions.booksLoaded, + (state, { books }) => adapter.addAll(books, state) + ), + on(BooksPageActions.selectBook, + (state, { bookId }) => ({ ...state, activeBookId: bookId }) + ), + on(BooksPageActions.clearSelectedBook, + state => ({ ...state,activeBookId: null }) + ), + on(BooksApiActions.bookCreated, + (state, { book }) => adapter.addOne(book, { + ...state, + activeBookId: book.id + }) + ), + on(BooksApiActions.bookUpdated, + (state, { book }) => adapter.updateOne( + { id: book.id, changes: book }, + { ...state, activeBookId: book.id } + ) + ), + on(BooksApiActions.bookDeleted, + (state, { book }) => adapter.removeOne(book.id, { + ...state, + activeBookId: null + }) + ) +); + export function reducer( state = initialState, - action: BooksPageActions.BooksActions | BooksApiActions.BooksApiActions + action: Action ): State { - switch (action.type) { - case BooksApiActions.booksLoaded.type: - return adapter.addAll(action.books, state); - - case BooksPageActions.selectBook.type: - return { - ...state, - activeBookId: action.bookId - }; - - case BooksPageActions.clearSelectedBook.type: - return { - ...state, - activeBookId: null - }; - - case BooksApiActions.bookCreated.type: - return adapter.addOne(action.book, { - ...state, - activeBookId: action.book.id - }); - - case BooksApiActions.bookUpdated.type: - return adapter.updateOne( - { id: action.book.id, changes: action.book }, - { ...state, activeBookId: action.book.id } - ); - - case BooksApiActions.bookDeleted.type: - return adapter.removeOne(action.book.id, { - ...state, - activeBookId: null - }); - - default: - return state; - } + return booksReducer(state, action); } export const { selectAll, selectEntities } = adapter.getSelectors();