Skip to content

Commit a5fc1e0

Browse files
author
Lukas Ruebbelke
authored
Merge pull request onehungrymind#2 from onehungrymind/feature/ngrx-façade
Add a facade to the 'items' state
2 parents 2b13071 + 3796f6d commit a5fc1e0

File tree

8 files changed

+82
-63
lines changed

8 files changed

+82
-63
lines changed

apps/dashboard/src/app/home/home.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<div class="container">
22
<div class="col-50">
3-
<app-items-total [items]="items"></app-items-total>
4-
<app-items-list [items]="items" [readonly]="true"></app-items-list>
3+
<app-items-total [items]="items$ | async"></app-items-total>
4+
<app-items-list [items]="items$ | async" [readonly]="true"></app-items-list>
55
</div>
66

77
<div class="col-50">

apps/dashboard/src/app/home/home.component.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
import { select, Store } from '@ngrx/store';
2-
import { ItemsActionTypes } from '../../../../../libs/common-data/src/lib/state/items.actions';
3-
import * as ItemsActions from '../../../../../libs/common-data/src/lib/state/items.actions';
4-
import { ItemsState } from '../../../../../libs/common-data/src/lib/state/items.reducer';
51
import { Component, OnInit } from '@angular/core';
6-
import { Item, ItemsService, Widget, WidgetsService } from '@workspace/common-data';
7-
import { selectAllItems } from '../../../../../libs/common-data/src/lib/state';
2+
import { Item, ItemsFacade, Widget, WidgetsService } from '@workspace/common-data';
3+
import { Observable } from 'rxjs';
84

95
@Component({
106
selector: 'app-home',
@@ -13,27 +9,20 @@ import { selectAllItems } from '../../../../../libs/common-data/src/lib/state';
139

1410
})
1511
export class HomeComponent implements OnInit {
16-
items: Item[];
12+
items$: Observable<Item[]> = this.itemsFacade.allItems$;
13+
1714
widgets: Widget[];
1815

19-
constructor(private itemsService: ItemsService,
20-
private widgetsService: WidgetsService,
21-
private store: Store<ItemsState>
22-
) {
23-
}
16+
constructor(
17+
private itemsFacade: ItemsFacade,
18+
private widgetsService: WidgetsService
19+
) {}
2420

2521
ngOnInit() {
26-
this.getItems();
22+
this.itemsFacade.loadAll();
2723
this.getWidgets();
2824
}
2925

30-
getItems() {
31-
this.store.pipe(select(selectAllItems))
32-
.subscribe(items => this.items = items);
33-
34-
this.store.dispatch(new ItemsActions.LoadItems());
35-
}
36-
3726
getWidgets() {
3827
this.widgetsService.all()
3928
.subscribe((widgets: Widget[]) => this.widgets = widgets);
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<div class="container">
22
<div class="col-50">
3-
<app-items-total [items]="items"></app-items-total>
3+
<app-items-total [items]="items$ | async"></app-items-total>
44

5-
<app-items-list [items]="items"
5+
<app-items-list [items]="items$ | async"
66
(selected)="selectItem($event)"
77
(deleted)="deleteItem($event)">
88
</app-items-list>
99
</div>
1010

1111
<app-item-detail class="col-50" [item]="currentItem"
1212
(saved)="saveItem($event)"
13-
(cancelled)="cancel($event)">
13+
(cancelled)="resetCurrentItem($event)">
1414
</app-item-detail>
1515
</div>
Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,24 @@
11
import { Component, OnInit } from '@angular/core';
2-
import { Item, ItemsService } from '@workspace/common-data';
3-
import { ActionsSubject, select, Store } from '@ngrx/store';
4-
import { ItemsState } from '../../../../../libs/common-data/src/lib/state/items.reducer';
5-
import * as ItemsActions from '../../../../../libs/common-data/src/lib/state/items.actions';
6-
import { filter, tap } from 'rxjs/operators';
7-
import { ItemsActionTypes } from '../../../../../libs/common-data/src/lib/state/items.actions';
8-
import { selectAllItems } from '../../../../../libs/common-data/src/lib/state';
2+
import { Observable } from 'rxjs';
3+
import { Item, ItemsFacade } from '@workspace/common-data';
94

105
@Component({
116
selector: 'app-items',
127
templateUrl: './items.component.html',
138
styleUrls: ['./items.component.css']
149
})
1510
export class ItemsComponent implements OnInit {
16-
items: Item[];
11+
items$: Observable<Item[]> = this.itemsFacade.allItems$;
1712
currentItem: Item;
1813

19-
constructor(private itemsService: ItemsService, private store: Store<ItemsState>, private actions$: ActionsSubject) { }
14+
constructor(private itemsFacade: ItemsFacade,) { }
2015

2116
ngOnInit() {
22-
this.getItems();
23-
this.handleActions();
17+
this.itemsFacade.loadAll();
18+
this.itemsFacade.mutations$.subscribe(_ => this.resetCurrentItem());
2419
this.resetCurrentItem();
2520
}
2621

27-
handleActions() {
28-
this.actions$.pipe(
29-
filter(action =>
30-
action.type === ItemsActionTypes.AddItem
31-
|| action.type === ItemsActionTypes.UpdateItem
32-
|| action.type === ItemsActionTypes.DeleteItem
33-
),
34-
tap(_ => this.resetCurrentItem())
35-
)
36-
.subscribe();
37-
}
38-
3922
resetCurrentItem() {
4023
this.currentItem = { id: null, name: '', price: 0, description: '' };
4124
}
@@ -44,26 +27,15 @@ export class ItemsComponent implements OnInit {
4427
this.currentItem = item;
4528
}
4629

47-
cancel(item) {
48-
this.resetCurrentItem();
49-
}
50-
51-
getItems() {
52-
this.store.pipe(select(selectAllItems))
53-
.subscribe(items => this.items = items);
54-
55-
this.store.dispatch(new ItemsActions.LoadItems());
56-
}
57-
5830
saveItem(item) {
5931
if (!item.id) {
60-
this.store.dispatch(new ItemsActions.AddItem(item));
32+
this.itemsFacade.addItem(item);
6133
} else {
62-
this.store.dispatch(new ItemsActions.UpdateItem(item));
34+
this.itemsFacade.updateItem(item);
6335
}
6436
}
6537

6638
deleteItem(item) {
67-
this.store.dispatch(new ItemsActions.DeleteItem(item));
39+
this.itemsFacade.deleteItem(item);
6840
}
6941
}

libs/common-data/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ export { ItemsService } from './lib/items/items.service';
55

66
export { Widget } from './lib/widgets/widget.model';
77
export { WidgetsService } from './lib/widgets/widgets.service';
8+
9+
export { ItemsFacade } from './lib/state/items.facade';

libs/common-data/src/lib/common-data.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { StoreModule } from '@ngrx/store';
77
import { EffectsModule } from '@ngrx/effects';
88
import { itemsReducer, initialState as itemsInitialState } from './state/items.reducer';
99
import { ItemsEffects } from './state/items.effects';
10+
import { ItemsFacade } from './state/items.facade';
1011

1112
@NgModule({
1213
imports: [
@@ -18,7 +19,8 @@ import { ItemsEffects } from './state/items.effects';
1819
providers: [
1920
ItemsService,
2021
WidgetsService,
21-
ItemsEffects
22+
ItemsEffects,
23+
ItemsFacade
2224
],
2325
exports: [
2426
StoreModule,
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { TestBed, inject } from '@angular/core/testing';
2+
3+
import { ItemsFacade } from './items.facade';
4+
5+
describe('ItemsFacade', () => {
6+
beforeEach(() => {
7+
TestBed.configureTestingModule({
8+
providers: [ItemsFacade]
9+
});
10+
});
11+
12+
it('should be created', inject([ItemsFacade], (service: ItemsFacade) => {
13+
expect(service).toBeTruthy();
14+
}));
15+
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { Injectable } from '@angular/core';
2+
import { ActionsSubject, select, Store } from '@ngrx/store';
3+
import { filter } from 'rxjs/operators';
4+
import { ItemsState } from './items.reducer';
5+
import { ItemsActionTypes } from './items.actions';
6+
import { selectAllItems } from './index';
7+
import * as ItemsActions from './items.actions';
8+
9+
@Injectable({
10+
providedIn: 'root'
11+
})
12+
export class ItemsFacade {
13+
allItems$ = this.store.pipe(select(selectAllItems));
14+
mutations$ = this.actions$.pipe(
15+
filter(action =>
16+
action.type === ItemsActionTypes.AddItem
17+
|| action.type === ItemsActionTypes.UpdateItem
18+
|| action.type === ItemsActionTypes.DeleteItem
19+
)
20+
);
21+
22+
constructor(private store: Store<ItemsState>, private actions$: ActionsSubject) {}
23+
24+
loadAll() {
25+
this.store.dispatch(new ItemsActions.LoadItems());
26+
}
27+
28+
addItem(item) {
29+
this.store.dispatch(new ItemsActions.AddItem(item));
30+
}
31+
32+
updateItem(item) {
33+
this.store.dispatch(new ItemsActions.UpdateItem(item));
34+
}
35+
36+
deleteItem(item) {
37+
this.store.dispatch(new ItemsActions.DeleteItem(item));
38+
}
39+
}

0 commit comments

Comments
 (0)