Skip to content

Commit b2d2184

Browse files
03-entity complete
1 parent b9a5c11 commit b2d2184

File tree

3 files changed

+30
-32
lines changed

3 files changed

+30
-32
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class BooksPageComponent implements OnInit {
2323
) {
2424
this.books$ = this.store.pipe(
2525
select(state => state.books),
26-
map(booksState => booksState.books),
26+
map((booksState: any) => booksState.ids.map(id => booksState.entities[id])),
2727
tap(books => this.updateTotals(books))
2828
);
2929
}
@@ -34,7 +34,7 @@ export class BooksPageComponent implements OnInit {
3434
}
3535

3636
getBooks() {
37-
// Pending
37+
this.store.dispatch(new BooksPageActions.Enter());
3838
}
3939

4040
updateTotals(books: Book[]) {

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

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Book } from 'src/app/shared/models/book.model';
33
import { BooksPageActions } from 'src/app/books/actions';
44

55

6-
const initialBooks: Book[] = [
6+
export const initialBooks: Book[] = [
77
{
88
id: "1",
99
name: "Fellowship of the Ring",
@@ -24,50 +24,42 @@ const initialBooks: Book[] = [
2424
},
2525
];
2626

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

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

4337
export function reducer(state = initialState, action: BooksPageActions.BooksActions): State {
4438
switch(action.type) {
39+
case BooksPageActions.BooksActionTypes.Enter:
40+
return adapter.addAll(initialBooks, state);
41+
4542
case BooksPageActions.BooksActionTypes.SelectBook:
4643
return {
47-
activeBookId: action.bookId,
48-
books: state.books
44+
...state,
45+
activeBookId: action.bookId
4946
};
5047
case BooksPageActions.BooksActionTypes.ClearSelectedBook:
5148
return {
52-
activeBookId: null,
53-
books: state.books
49+
...state,
50+
activeBookId: null
5451
};
5552
case BooksPageActions.BooksActionTypes.CreateBook:
56-
return {
57-
activeBookId: state.activeBookId,
58-
books: createBook(state.books, action.book)
59-
};
53+
return adapter.addOne(action.book, state);
54+
6055
case BooksPageActions.BooksActionTypes.UpdateBook:
61-
return {
62-
activeBookId: state.activeBookId,
63-
books: updateBook(state.books, action.book)
64-
};
56+
return adapter.updateOne({id: action.book.id, changes: action.book}, {...state, activeBookId: action.book.id});
57+
6558
case BooksPageActions.BooksActionTypes.DeleteBook:
66-
return {
67-
activeBookId: null,
68-
books: deleteBook(state.books, action.book)
69-
};
59+
return adapter.removeOne(action.book.id, {...state, activeBookId: null});
60+
7061
default:
7162
return state;
7263
}
73-
}
64+
}
65+

0 commit comments

Comments
 (0)