diff --git a/src/app/books/actions/books-api.actions.ts b/src/app/books/actions/books-api.actions.ts index 9cf6486..f7e4c18 100644 --- a/src/app/books/actions/books-api.actions.ts +++ b/src/app/books/actions/books-api.actions.ts @@ -1,39 +1,29 @@ import { Book } from "src/app/shared/models/book.model"; -import { Action } from "@ngrx/store"; - -export enum BooksApiActionTypes { - BooksLoaded = "[Books API] Books Loaded Success", - BookCreated = "[Books API] Book Created", - BookUpdated = "[Books API] Book Updated", - BookDeleted = "[Books API] Book Deleted" -} - -export class BooksLoaded implements Action { - readonly type = BooksApiActionTypes.BooksLoaded; - - constructor(public books: Book[]) {} -} - -export class BookCreated implements Action { - readonly type = BooksApiActionTypes.BookCreated; - - constructor(public book: Book) {} -} - -export class BookUpdated implements Action { - readonly type = BooksApiActionTypes.BookUpdated; - - constructor(public book: Book) {} -} - -export class BookDeleted implements Action { - readonly type = BooksApiActionTypes.BookDeleted; - - constructor(public book: Book) {} -} - -export type BooksApiActions = - | BooksLoaded - | BookCreated - | BookUpdated - | BookDeleted; +import { createAction, props } from "@ngrx/store"; + +export const booksLoaded = createAction( + "[Books API] Books Loaded Success", + props<{ books: Book[] }>() +); + +export const bookCreated = createAction( + "[Books API] Book Created", + props<{ book: Book }>() +); + +export const bookUpdated = createAction( + "[Books API] Book Updated", + props<{ book: Book }>() +); + +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 c557abb..0de5068 100644 --- a/src/app/books/actions/books-page.actions.ts +++ b/src/app/books/actions/books-page.actions.ts @@ -1,51 +1,37 @@ -import { Book } from "src/app/shared/models/book.model"; -import { Action } from "@ngrx/store"; - -export enum BooksActionTypes { - Enter = "[Books Page] Enter", - SelectBook = "[Books Page] Select Book", - ClearSelectedBook = "[Books Page] Clear Selected Book", - CreateBook = "[Books Page] Create Book", - UpdateBook = "[Books Page] Update Book", - DeleteBook = "[Books Page] Delete Book" -} - -export class Enter implements Action { - readonly type = BooksActionTypes.Enter; -} - -export class SelectBook implements Action { - readonly type = BooksActionTypes.SelectBook; - - constructor(public bookId: string) {} -} - -export class ClearSelectedBook implements Action { - readonly type = BooksActionTypes.ClearSelectedBook; -} - -export class CreateBook implements Action { - readonly type = BooksActionTypes.CreateBook; - - constructor(public book: Book) {} -} - -export class UpdateBook implements Action { - readonly type = BooksActionTypes.UpdateBook; - - constructor(public book: Book) {} -} - -export class DeleteBook implements Action { - readonly type = BooksActionTypes.DeleteBook; - - constructor(public book: Book) {} -} - -export type BooksActions = - | Enter - | SelectBook - | ClearSelectedBook - | CreateBook - | UpdateBook - | DeleteBook; +import { createAction, props } from "@ngrx/store"; +import { BookRequiredProps, Book } from "src/app/shared/models/book.model"; + +export const enter = createAction("[Books Page] Enter"); + +export const selectBook = createAction( + "[Books Page] Select Book", + props<{ bookId: string }>() +); + +export const clearSelectedBook = createAction( + "[Books Page] Clear Selected Book" +); + +export const createBook = createAction( + "[Books Page] Create Book", + props<{ book: BookRequiredProps }>() +); + +export const updateBook = createAction( + "[Books Page] Update Book", + props<{ book: Book; changes: BookRequiredProps }>() +); + +export const deleteBook = createAction( + "[Books Page] Delete Book", + props<{ book: Book }>() +); + +export type BooksActions = ReturnType< + | typeof enter + | typeof selectBook + | typeof clearSelectedBook + | typeof createBook + | typeof updateBook + | typeof deleteBook +>; diff --git a/src/app/books/books-api.effects.ts b/src/app/books/books-api.effects.ts index e0e70bc..4324498 100644 --- a/src/app/books/books-api.effects.ts +++ b/src/app/books/books-api.effects.ts @@ -15,10 +15,10 @@ import { EMPTY } from "rxjs"; export class BooksApiEffects { @Effect() loadBooks$ = this.actions$.pipe( - ofType(BooksPageActions.BooksActionTypes.Enter), + ofType(BooksPageActions.enter.type), exhaustMap(() => this.booksService.all().pipe( - map(books => new BooksApiActions.BooksLoaded(books)), + map(books => BooksApiActions.booksLoaded({ books })), catchError(() => EMPTY) ) ) @@ -26,10 +26,10 @@ export class BooksApiEffects { @Effect() createBook$ = this.actions$.pipe( - ofType(BooksPageActions.BooksActionTypes.CreateBook), + ofType(BooksPageActions.createBook.type), mergeMap(action => this.booksService.create(action.book).pipe( - map(book => new BooksApiActions.BookCreated(book)), + map(book => BooksApiActions.bookCreated({ book })), catchError(() => EMPTY) ) ) @@ -37,10 +37,10 @@ export class BooksApiEffects { @Effect() updateBook$ = this.actions$.pipe( - ofType(BooksPageActions.BooksActionTypes.UpdateBook), + ofType(BooksPageActions.updateBook.type), concatMap(action => this.booksService.update(action.book.id, action.book).pipe( - map(book => new BooksApiActions.BookUpdated(book)), + map(book => BooksApiActions.bookUpdated({ book })), catchError(() => EMPTY) ) ) @@ -48,10 +48,10 @@ export class BooksApiEffects { @Effect() deleteBook$ = this.actions$.pipe( - ofType(BooksPageActions.BooksActionTypes.DeleteBook), + ofType(BooksPageActions.deleteBook.type), mergeMap(action => this.booksService.delete(action.book.id).pipe( - map(() => new BooksApiActions.BookDeleted(action.book)), + map(() => BooksApiActions.bookDeleted({ book: action.book })), catchError(() => EMPTY) ) ) diff --git a/src/app/books/components/books-page/books-page.component.ts b/src/app/books/components/books-page/books-page.component.ts index 93c8ebe..a7dfa35 100755 --- a/src/app/books/components/books-page/books-page.component.ts +++ b/src/app/books/components/books-page/books-page.component.ts @@ -29,11 +29,11 @@ export class BooksPageComponent implements OnInit { } getBooks() { - this.store.dispatch(new BooksPageActions.Enter()); + this.store.dispatch(BooksPageActions.enter()); } onSelect(book: Book) { - this.store.dispatch(new BooksPageActions.SelectBook(book.id)); + this.store.dispatch(BooksPageActions.selectBook({ bookId: book.id })); } onCancel() { @@ -41,7 +41,7 @@ export class BooksPageComponent implements OnInit { } removeSelectedBook() { - this.store.dispatch(new BooksPageActions.ClearSelectedBook()); + this.store.dispatch(BooksPageActions.clearSelectedBook()); } onSave(book: Book) { @@ -53,14 +53,14 @@ export class BooksPageComponent implements OnInit { } saveBook(book: Book) { - this.store.dispatch(new BooksPageActions.CreateBook(book)); + this.store.dispatch(BooksPageActions.createBook({ book })); } updateBook(book: Book) { - this.store.dispatch(new BooksPageActions.UpdateBook(book)); + this.store.dispatch(BooksPageActions.updateBook({ book, changes: book })); } onDelete(book: Book) { - this.store.dispatch(new BooksPageActions.DeleteBook(book)); + this.store.dispatch(BooksPageActions.deleteBook({ book })); } } diff --git a/src/app/shared/state/books.reducer.ts b/src/app/shared/state/books.reducer.ts index 5bfede0..942b127 100644 --- a/src/app/shared/state/books.reducer.ts +++ b/src/app/shared/state/books.reducer.ts @@ -39,34 +39,34 @@ export function reducer( action: BooksPageActions.BooksActions | BooksApiActions.BooksApiActions ): State { switch (action.type) { - case BooksApiActions.BooksApiActionTypes.BooksLoaded: + case BooksApiActions.booksLoaded.type: return adapter.addAll(action.books, state); - case BooksPageActions.BooksActionTypes.SelectBook: + case BooksPageActions.selectBook.type: return { ...state, activeBookId: action.bookId }; - case BooksPageActions.BooksActionTypes.ClearSelectedBook: + case BooksPageActions.clearSelectedBook.type: return { ...state, activeBookId: null }; - case BooksApiActions.BooksApiActionTypes.BookCreated: + case BooksApiActions.bookCreated.type: return adapter.addOne(action.book, { ...state, activeBookId: action.book.id }); - case BooksApiActions.BooksApiActionTypes.BookUpdated: + case BooksApiActions.bookUpdated.type: return adapter.updateOne( { id: action.book.id, changes: action.book }, { ...state, activeBookId: action.book.id } ); - case BooksApiActions.BooksApiActionTypes.BookDeleted: + case BooksApiActions.bookDeleted.type: return adapter.removeOne(action.book.id, { ...state, activeBookId: null