42 lines
989 B
TypeScript
42 lines
989 B
TypeScript
|
import {BehaviorSubject} from "rxjs/BehaviorSubject";
|
||
|
import {AppUser, User} from "../../models/model-interfaces";
|
||
|
|
||
|
export const LOAD = 'LOAD';
|
||
|
export const ADD = 'ADD';
|
||
|
export const EDIT = 'EDIT';
|
||
|
export const REMOVE = 'REMOVE';
|
||
|
|
||
|
export class AppUserStore {
|
||
|
|
||
|
private appUsers: AppUser[] = [];
|
||
|
|
||
|
items$ = new BehaviorSubject<AppUser[]>([]);
|
||
|
|
||
|
dispatch(action) {
|
||
|
this.appUsers = this._reduce(this.appUsers, action);
|
||
|
this.items$.next(this.appUsers);
|
||
|
}
|
||
|
|
||
|
_reduce(users: AppUser[], action) {
|
||
|
switch (action.type) {
|
||
|
case LOAD:
|
||
|
return [...action.data];
|
||
|
case ADD:
|
||
|
return [...users, action.data];
|
||
|
case EDIT:
|
||
|
return users.map(user => {
|
||
|
const editedUser = action.data;
|
||
|
if (user._id !== editedUser._id) {
|
||
|
return user;
|
||
|
}
|
||
|
return editedUser;
|
||
|
});
|
||
|
case REMOVE:
|
||
|
return users.filter(user => user._id !== action.data._id);
|
||
|
default:
|
||
|
return users;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|