Skip to content

Commit 82ba050

Browse files
07-action-creators complete
1 parent 8f60543 commit 82ba050

File tree

5 files changed

+87
-113
lines changed

5 files changed

+87
-113
lines changed
Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,29 @@
11
import { Book } from "src/app/shared/models/book.model";
2-
import { Action } from "@ngrx/store";
3-
4-
export enum BooksApiActionTypes {
5-
BooksLoaded = "[Books API] Books Loaded Success",
6-
BookCreated = "[Books API] Book Created",
7-
BookUpdated = "[Books API] Book Updated",
8-
BookDeleted = "[Books API] Book Deleted"
9-
}
10-
11-
export class BooksLoaded implements Action {
12-
readonly type = BooksApiActionTypes.BooksLoaded;
13-
14-
constructor(public books: Book[]) {}
15-
}
16-
17-
export class BookCreated implements Action {
18-
readonly type = BooksApiActionTypes.BookCreated;
19-
20-
constructor(public book: Book) {}
21-
}
22-
23-
export class BookUpdated implements Action {
24-
readonly type = BooksApiActionTypes.BookUpdated;
25-
26-
constructor(public book: Book) {}
27-
}
28-
29-
export class BookDeleted implements Action {
30-
readonly type = BooksApiActionTypes.BookDeleted;
31-
32-
constructor(public book: Book) {}
33-
}
34-
35-
export type BooksApiActions =
36-
| BooksLoaded
37-
| BookCreated
38-
| BookUpdated
39-
| BookDeleted;
2+
import { createAction, props } from "@ngrx/store";
3+
4+
export const booksLoaded = createAction(
5+
"[Books API] Books Loaded Success",
6+
props<{ books: Book[] }>()
7+
);
8+
9+
export const bookCreated = createAction(
10+
"[Books API] Book Created",
11+
props<{ book: Book }>()
12+
);
13+
14+
export const bookUpdated = createAction(
15+
"[Books API] Book Updated",
16+
props<{ book: Book }>()
17+
);
18+
19+
export const bookDeleted = createAction(
20+
"[Books API] Book Deleted",
21+
props<{ book: Book }>()
22+
);
23+
24+
export type BooksApiActions = ReturnType<
25+
| typeof booksLoaded
26+
| typeof bookCreated
27+
| typeof bookUpdated
28+
| typeof bookDeleted
29+
>;
Lines changed: 37 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,37 @@
1-
import { Book } from "src/app/shared/models/book.model";
2-
import { Action } from "@ngrx/store";
3-
4-
export enum BooksActionTypes {
5-
Enter = "[Books Page] Enter",
6-
SelectBook = "[Books Page] Select Book",
7-
ClearSelectedBook = "[Books Page] Clear Selected Book",
8-
CreateBook = "[Books Page] Create Book",
9-
UpdateBook = "[Books Page] Update Book",
10-
DeleteBook = "[Books Page] Delete Book"
11-
}
12-
13-
export class Enter implements Action {
14-
readonly type = BooksActionTypes.Enter;
15-
}
16-
17-
export class SelectBook implements Action {
18-
readonly type = BooksActionTypes.SelectBook;
19-
20-
constructor(public bookId: string) {}
21-
}
22-
23-
export class ClearSelectedBook implements Action {
24-
readonly type = BooksActionTypes.ClearSelectedBook;
25-
}
26-
27-
export class CreateBook implements Action {
28-
readonly type = BooksActionTypes.CreateBook;
29-
30-
constructor(public book: Book) {}
31-
}
32-
33-
export class UpdateBook implements Action {
34-
readonly type = BooksActionTypes.UpdateBook;
35-
36-
constructor(public book: Book) {}
37-
}
38-
39-
export class DeleteBook implements Action {
40-
readonly type = BooksActionTypes.DeleteBook;
41-
42-
constructor(public book: Book) {}
43-
}
44-
45-
export type BooksActions =
46-
| Enter
47-
| SelectBook
48-
| ClearSelectedBook
49-
| CreateBook
50-
| UpdateBook
51-
| DeleteBook;
1+
import { createAction, props } from "@ngrx/store";
2+
import { BookRequiredProps, Book } from "src/app/shared/models/book.model";
3+
4+
export const enter = createAction("[Books Page] Enter");
5+
6+
export const selectBook = createAction(
7+
"[Books Page] Select Book",
8+
props<{ bookId: string }>()
9+
);
10+
11+
export const clearSelectedBook = createAction(
12+
"[Books Page] Clear Selected Book"
13+
);
14+
15+
export const createBook = createAction(
16+
"[Books Page] Create Book",
17+
props<{ book: BookRequiredProps }>()
18+
);
19+
20+
export const updateBook = createAction(
21+
"[Books Page] Update Book",
22+
props<{ book: Book; changes: BookRequiredProps }>()
23+
);
24+
25+
export const deleteBook = createAction(
26+
"[Books Page] Delete Book",
27+
props<{ book: Book }>()
28+
);
29+
30+
export type BooksActions = ReturnType<
31+
| typeof enter
32+
| typeof selectBook
33+
| typeof clearSelectedBook
34+
| typeof createBook
35+
| typeof updateBook
36+
| typeof deleteBook
37+
>;

src/app/books/books-api.effects.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,52 +15,50 @@ import { EMPTY } from "rxjs";
1515
export class BooksApiEffects {
1616
@Effect()
1717
loadBooks$ = this.actions$.pipe(
18-
ofType(BooksPageActions.BooksActionTypes.Enter),
18+
ofType(BooksPageActions.enter),
1919
exhaustMap(() =>
2020
this.booksService.all().pipe(
21-
map(books => new BooksApiActions.BooksLoaded(books)),
21+
map(books => BooksApiActions.booksLoaded({ books })),
2222
catchError(() => EMPTY)
2323
)
2424
)
2525
);
2626

2727
@Effect()
2828
createBook$ = this.actions$.pipe(
29-
ofType(BooksPageActions.BooksActionTypes.CreateBook),
30-
concatMap(action =>
29+
ofType(BooksPageActions.createBook),
30+
mergeMap(action =>
3131
this.booksService.create(action.book).pipe(
32-
map(book => new BooksApiActions.BookCreated(book)),
32+
map(book => BooksApiActions.bookCreated({ book })),
3333
catchError(() => EMPTY)
3434
)
3535
)
3636
);
3737

3838
@Effect()
3939
updateBook$ = this.actions$.pipe(
40-
ofType(BooksPageActions.BooksActionTypes.UpdateBook),
40+
ofType(BooksPageActions.updateBook),
4141
concatMap(action =>
4242
this.booksService.update(action.book.id, action.book).pipe(
43-
map(book => new BooksApiActions.BookUpdated(book)),
43+
map(book => BooksApiActions.bookUpdated({ book })),
4444
catchError(() => EMPTY)
4545
)
4646
)
4747
);
4848

4949
@Effect()
5050
deleteBook$ = this.actions$.pipe(
51-
ofType(BooksPageActions.BooksActionTypes.DeleteBook),
51+
ofType(BooksPageActions.deleteBook),
5252
mergeMap(action =>
5353
this.booksService.delete(action.book.id).pipe(
54-
map(() => new BooksApiActions.BookDeleted(action.book)),
54+
map(() => BooksApiActions.bookDeleted({ book: action.book })),
5555
catchError(() => EMPTY)
5656
)
5757
)
5858
);
5959

6060
constructor(
6161
private booksService: BooksService,
62-
private actions$: Actions<
63-
BooksPageActions.BooksActions | BooksApiActions.BooksApiActions
64-
>
62+
private actions$: Actions
6563
) {}
6664
}

src/app/books/components/books-page/books-page.component.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ export class BooksPageComponent implements OnInit {
2929
}
3030

3131
getBooks() {
32-
this.store.dispatch(new BooksPageActions.Enter());
32+
this.store.dispatch(BooksPageActions.enter());
3333
}
3434

3535
onSelect(book: Book) {
36-
this.store.dispatch(new BooksPageActions.SelectBook(book.id));
36+
this.store.dispatch(BooksPageActions.selectBook({ bookId: book.id }));
3737
}
3838

3939
onCancel() {
4040
this.removeSelectedBook();
4141
}
4242

4343
removeSelectedBook() {
44-
this.store.dispatch(new BooksPageActions.ClearSelectedBook());
44+
this.store.dispatch(BooksPageActions.clearSelectedBook());
4545
}
4646

4747
onSave(book: Book) {
@@ -53,14 +53,14 @@ export class BooksPageComponent implements OnInit {
5353
}
5454

5555
saveBook(book: Book) {
56-
this.store.dispatch(new BooksPageActions.CreateBook(book));
56+
this.store.dispatch(BooksPageActions.createBook({ book }));
5757
}
5858

5959
updateBook(book: Book) {
60-
this.store.dispatch(new BooksPageActions.UpdateBook(book));
60+
this.store.dispatch(BooksPageActions.updateBook({ book, changes: book }));
6161
}
6262

6363
onDelete(book: Book) {
64-
this.store.dispatch(new BooksPageActions.DeleteBook(book));
64+
this.store.dispatch(BooksPageActions.deleteBook({ book }));
6565
}
6666
}

src/app/shared/state/books.reducer.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,34 +39,34 @@ export function reducer(
3939
action: BooksPageActions.BooksActions | BooksApiActions.BooksApiActions
4040
): State {
4141
switch (action.type) {
42-
case BooksApiActions.BooksApiActionTypes.BooksLoaded:
42+
case BooksApiActions.booksLoaded.type:
4343
return adapter.addAll(action.books, state);
4444

45-
case BooksPageActions.BooksActionTypes.SelectBook:
45+
case BooksPageActions.selectBook.type:
4646
return {
4747
...state,
4848
activeBookId: action.bookId
4949
};
5050

51-
case BooksPageActions.BooksActionTypes.ClearSelectedBook:
51+
case BooksPageActions.clearSelectedBook.type:
5252
return {
5353
...state,
5454
activeBookId: null
5555
};
5656

57-
case BooksApiActions.BooksApiActionTypes.BookCreated:
57+
case BooksApiActions.bookCreated.type:
5858
return adapter.addOne(action.book, {
5959
...state,
6060
activeBookId: action.book.id
6161
});
6262

63-
case BooksApiActions.BooksApiActionTypes.BookUpdated:
63+
case BooksApiActions.bookUpdated.type:
6464
return adapter.updateOne(
6565
{ id: action.book.id, changes: action.book },
6666
{ ...state, activeBookId: action.book.id }
6767
);
6868

69-
case BooksApiActions.BooksApiActionTypes.BookDeleted:
69+
case BooksApiActions.bookDeleted.type:
7070
return adapter.removeOne(action.book.id, {
7171
...state,
7272
activeBookId: null

0 commit comments

Comments
 (0)