Skip to content

Commit 1f8e09c

Browse files
brandonrobertsMikeRyanDev
authored andcommitted
03-entity complete
1 parent 048f388 commit 1f8e09c

File tree

3 files changed

+38
-33
lines changed

3 files changed

+38
-33
lines changed

src/app/books/actions/books-page.actions.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ import { Book } from "src/app/shared/models/book.model";
22
import { Action } from "@ngrx/store";
33

44
export enum BooksActionTypes {
5+
Enter = "[Books Page] Enter",
56
SelectBook = "[Books Page] Select Book",
67
ClearSelectedBook = "[Books Page] Clear Selected Book",
78
CreateBook = "[Books Page] Create Book",
89
UpdateBook = "[Books Page] Update Book",
910
DeleteBook = "[Books Page] Delete Book"
1011
}
1112

13+
export class Enter implements Action {
14+
readonly type = BooksActionTypes.Enter;
15+
}
16+
1217
export class SelectBook implements Action {
1318
readonly type = BooksActionTypes.SelectBook;
1419

@@ -38,6 +43,7 @@ export class DeleteBook implements Action {
3843
}
3944

4045
export type BooksActions =
46+
| Enter
4147
| SelectBook
4248
| ClearSelectedBook
4349
| CreateBook

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ export class BooksPageComponent implements OnInit {
2121
constructor(private store: Store<fromRoot.State>) {
2222
this.books$ = this.store.pipe(
2323
select(state => state.books),
24-
map(booksState => booksState.books),
24+
map((booksState: any) =>
25+
booksState.ids.map(id => booksState.entities[id])
26+
),
2527
tap(books => this.updateTotals(books))
2628
);
2729
}
@@ -32,7 +34,7 @@ export class BooksPageComponent implements OnInit {
3234
}
3335

3436
getBooks() {
35-
// Pending
37+
this.store.dispatch(new BooksPageActions.Enter());
3638
}
3739

3840
updateTotals(books: Book[]) {

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

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createEntityAdapter, EntityAdapter, EntityState } from "@ngrx/entity";
22
import { Book } from "src/app/shared/models/book.model";
33
import { BooksPageActions } from "src/app/books/actions";
44

5-
const initialBooks: Book[] = [
5+
export const initialBooks: Book[] = [
66
{
77
id: "1",
88
name: "Fellowship of the Ring",
@@ -23,54 +23,51 @@ const initialBooks: Book[] = [
2323
}
2424
];
2525

26-
const createBook = (books: Book[], book: Book) => [...books, book];
27-
const updateBook = (books: Book[], book: Book) =>
28-
books.map(w => {
29-
return w.id === book.id ? Object.assign({}, book) : w;
30-
});
31-
const deleteBook = (books: Book[], book: Book) =>
32-
books.filter(w => book.id !== w.id);
33-
34-
export interface State {
26+
export interface State extends EntityState<Book> {
3527
activeBookId: string | null;
36-
books: Book[];
3728
}
3829

39-
export const initialState = {
40-
activeBookId: null,
41-
books: initialBooks
42-
};
30+
export const adapter = createEntityAdapter<Book>();
31+
32+
export const initialState = adapter.getInitialState({
33+
activeBookId: null
34+
});
4335

4436
export function reducer(
4537
state = initialState,
4638
action: BooksPageActions.BooksActions
4739
): State {
4840
switch (action.type) {
41+
case BooksPageActions.BooksActionTypes.Enter:
42+
return adapter.addAll(initialBooks, state);
43+
4944
case BooksPageActions.BooksActionTypes.SelectBook:
5045
return {
51-
activeBookId: action.bookId,
52-
books: state.books
46+
...state,
47+
activeBookId: action.bookId
5348
};
49+
5450
case BooksPageActions.BooksActionTypes.ClearSelectedBook:
5551
return {
56-
activeBookId: null,
57-
books: state.books
52+
...state,
53+
activeBookId: null
5854
};
55+
5956
case BooksPageActions.BooksActionTypes.CreateBook:
60-
return {
61-
activeBookId: state.activeBookId,
62-
books: createBook(state.books, action.book)
63-
};
57+
return adapter.addOne(action.book, state);
58+
6459
case BooksPageActions.BooksActionTypes.UpdateBook:
65-
return {
66-
activeBookId: state.activeBookId,
67-
books: updateBook(state.books, action.book)
68-
};
60+
return adapter.updateOne(
61+
{ id: action.book.id, changes: action.book },
62+
{ ...state, activeBookId: action.book.id }
63+
);
64+
6965
case BooksPageActions.BooksActionTypes.DeleteBook:
70-
return {
71-
activeBookId: null,
72-
books: deleteBook(state.books, action.book)
73-
};
66+
return adapter.removeOne(action.book.id, {
67+
...state,
68+
activeBookId: null
69+
});
70+
7471
default:
7572
return state;
7673
}

0 commit comments

Comments
 (0)