Skip to content

Commit 5f4a0aa

Browse files
committed
10-more-effects
1 parent 1adeb0a commit 5f4a0aa

File tree

2 files changed

+43
-21
lines changed

2 files changed

+43
-21
lines changed

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

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import { Injectable } from "@angular/core";
22
import { Effect, Actions, ofType } from "@ngrx/effects";
3-
import { mergeMap, map, catchError } from "rxjs/operators";
3+
import {
4+
mergeMap,
5+
map,
6+
catchError,
7+
exhaustMap,
8+
concatMap
9+
} from "rxjs/operators";
410
import { EMPTY } from "rxjs";
511
import { BooksService } from "../shared/services/book.service";
612
import { BooksPageActions, BooksApiActions } from "./actions";
@@ -10,13 +16,46 @@ export class BooksApiEffects {
1016
@Effect()
1117
loadBooks$ = this.actions$.pipe(
1218
ofType(BooksPageActions.enter),
13-
mergeMap(() =>
19+
exhaustMap(() =>
1420
this.booksService.all().pipe(
1521
map(books => BooksApiActions.booksLoaded({ books })),
1622
catchError(() => EMPTY)
1723
)
1824
)
1925
);
2026

27+
@Effect()
28+
createBook$ = this.actions$.pipe(
29+
ofType(BooksPageActions.createBook),
30+
mergeMap(action =>
31+
this.booksService.create(action.book).pipe(
32+
map(book => BooksApiActions.bookCreated({ book })),
33+
catchError(() => EMPTY)
34+
)
35+
)
36+
);
37+
38+
@Effect()
39+
updateBook$ = this.actions$.pipe(
40+
ofType(BooksPageActions.updateBook),
41+
concatMap(action =>
42+
this.booksService.update(action.bookId, action.changes).pipe(
43+
map(book => BooksApiActions.bookUpdated({ book })),
44+
catchError(() => EMPTY)
45+
)
46+
)
47+
);
48+
49+
@Effect()
50+
deleteBook$ = this.actions$.pipe(
51+
ofType(BooksPageActions.deleteBook),
52+
mergeMap(action =>
53+
this.booksService.delete(action.bookId).pipe(
54+
map(() => BooksApiActions.bookDeleted({ bookId: action.bookId })),
55+
catchError(() => EMPTY)
56+
)
57+
)
58+
);
59+
2160
constructor(private booksService: BooksService, private actions$: Actions) {}
2261
}

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

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import {
88
selectBooksEarningsTotals
99
} from "src/app/shared/state";
1010
import { BookModel, BookRequiredProps } from "src/app/shared/models/book.model";
11-
import { BooksService } from "src/app/shared/services/book.service";
12-
import { BooksPageActions, BooksApiActions } from "../../actions";
11+
import { BooksPageActions } from "../../actions";
1312

1413
@Component({
1514
selector: "app-books",
@@ -21,7 +20,7 @@ export class BooksPageComponent implements OnInit {
2120
currentBook$: Observable<BookModel | null>;
2221
total$: Observable<number>;
2322

24-
constructor(private booksService: BooksService, private store: Store<State>) {
23+
constructor(private store: Store<State>) {
2524
this.books$ = store.select(selectAllBooks);
2625
this.currentBook$ = store.select(selectActiveBook);
2726
this.total$ = store.select(selectBooksEarningsTotals);
@@ -53,31 +52,15 @@ export class BooksPageComponent implements OnInit {
5352

5453
saveBook(bookProps: BookRequiredProps) {
5554
this.store.dispatch(BooksPageActions.createBook({ book: bookProps }));
56-
57-
this.booksService.create(bookProps).subscribe(book => {
58-
this.removeSelectedBook();
59-
60-
this.store.dispatch(BooksApiActions.bookCreated({ book }));
61-
});
6255
}
6356

6457
updateBook(book: BookModel) {
6558
this.store.dispatch(
6659
BooksPageActions.updateBook({ bookId: book.id, changes: book })
6760
);
68-
69-
this.booksService.update(book.id, book).subscribe(book => {
70-
this.store.dispatch(BooksApiActions.bookUpdated({ book }));
71-
});
7261
}
7362

7463
onDelete(book: BookModel) {
7564
this.store.dispatch(BooksPageActions.deleteBook({ bookId: book.id }));
76-
77-
this.booksService.delete(book.id).subscribe(() => {
78-
this.removeSelectedBook();
79-
80-
this.store.dispatch(BooksApiActions.bookDeleted({ bookId: book.id }));
81-
});
8265
}
8366
}

0 commit comments

Comments
 (0)