Skip to content

Commit e61d37c

Browse files
07-action-creators complete
1 parent 9a733ab commit e61d37c

File tree

5 files changed

+85
-110
lines changed

5 files changed

+85
-110
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 & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +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
52-
;
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: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,47 @@ export class BooksApiEffects {
1010

1111
@Effect()
1212
loadBooks$ = this.actions$.pipe(
13-
ofType(BooksPageActions.BooksActionTypes.Enter),
13+
ofType(BooksPageActions.enter.type),
1414
mergeMap(() =>
1515
this.booksService.all()
1616
.pipe(
17-
map(books => new BooksApiActions.BooksLoaded(books)),
17+
map(books => BooksApiActions.booksLoaded({books})),
1818
catchError(() => EMPTY)
1919
)
2020
)
2121
);
2222

2323
@Effect()
2424
createBook$ = this.actions$.pipe(
25-
ofType(BooksPageActions.BooksActionTypes.CreateBook),
25+
ofType(BooksPageActions.createBook.type),
2626
mergeMap(action =>
2727
this.booksService.create(action.book)
2828
.pipe(
29-
map(book => new BooksApiActions.BookCreated(book)),
29+
map(book => BooksApiActions.bookCreated({book})),
3030
catchError(() => EMPTY)
3131
)
3232
)
3333
);
3434

3535
@Effect()
3636
updateBook$ = this.actions$.pipe(
37-
ofType(BooksPageActions.BooksActionTypes.UpdateBook),
37+
ofType(BooksPageActions.updateBook.type),
3838
mergeMap(action =>
3939
this.booksService.update(action.book.id, action.book)
4040
.pipe(
41-
map(book => new BooksApiActions.BookUpdated(book)),
41+
map(book => BooksApiActions.bookUpdated({book})),
4242
catchError(() => EMPTY)
4343
)
4444
)
4545
);
4646

4747
@Effect()
4848
deleteBook$ = this.actions$.pipe(
49-
ofType(BooksPageActions.BooksActionTypes.DeleteBook),
49+
ofType(BooksPageActions.deleteBook.type),
5050
mergeMap(action =>
5151
this.booksService.delete(action.book.id)
5252
.pipe(
53-
map(() => new BooksApiActions.BookDeleted(action.book)),
53+
map(() => BooksApiActions.bookDeleted({ book: action.book})),
5454
catchError(() => EMPTY)
5555
)
5656
)

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

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

3333
getBooks() {
34-
this.store.dispatch(new BooksPageActions.Enter());
34+
this.store.dispatch(BooksPageActions.enter());
3535
}
3636

3737
onSelect(book: Book) {
38-
this.store.dispatch(new BooksPageActions.SelectBook(book.id));
38+
this.store.dispatch(BooksPageActions.selectBook({bookId: book.id}));
3939
}
4040

4141
onCancel() {
4242
this.removeSelectedBook();
4343
}
4444

4545
removeSelectedBook() {
46-
this.store.dispatch(new BooksPageActions.ClearSelectedBook());
46+
this.store.dispatch(BooksPageActions.clearSelectedBook());
4747
}
4848

4949
onSave(book: Book) {
@@ -55,14 +55,14 @@ export class BooksPageComponent implements OnInit {
5555
}
5656

5757
saveBook(book: Book) {
58-
this.store.dispatch(new BooksPageActions.CreateBook(book));
58+
this.store.dispatch(BooksPageActions.createBook({book}));
5959
}
6060

6161
updateBook(book: Book) {
62-
this.store.dispatch(new BooksPageActions.UpdateBook(book));
62+
this.store.dispatch(BooksPageActions.updateBook({book, changes: book}));
6363
}
6464

6565
onDelete(book: Book) {
66-
this.store.dispatch(new BooksPageActions.DeleteBook(book));
66+
this.store.dispatch(BooksPageActions.deleteBook({book}));
6767
}
6868
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,28 @@ export const initialState = adapter.getInitialState({
3636

3737
export function reducer(state = initialState, action: BooksPageActions.BooksActions | BooksApiActions.BooksApiActions): State {
3838
switch(action.type) {
39-
case BooksApiActions.BooksApiActionTypes.BooksLoaded:
39+
case BooksApiActions.booksLoaded.type:
4040
return adapter.addAll(action.books, state);
4141

42-
case BooksPageActions.BooksActionTypes.SelectBook:
42+
case BooksPageActions.selectBook.type:
4343
return {
4444
...state,
4545
activeBookId: action.bookId
4646
};
4747

48-
case BooksPageActions.BooksActionTypes.ClearSelectedBook:
48+
case BooksPageActions.clearSelectedBook.type:
4949
return {
5050
...state,
5151
activeBookId: null
5252
};
5353

54-
case BooksApiActions.BooksApiActionTypes.BookCreated:
54+
case BooksApiActions.bookCreated.type:
5555
return adapter.addOne(action.book, {...state, activeBookId: action.book.id});
5656

57-
case BooksApiActions.BooksApiActionTypes.BookUpdated:
57+
case BooksApiActions.bookUpdated.type:
5858
return adapter.updateOne({id: action.book.id, changes: action.book}, {...state, activeBookId: action.book.id});
5959

60-
case BooksApiActions.BooksApiActionTypes.BookDeleted:
60+
case BooksApiActions.bookDeleted.type:
6161
return adapter.removeOne(action.book.id, {...state, activeBookId: null});
6262

6363
default:

0 commit comments

Comments
 (0)