1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import { Injectable, Inject } from '@angular/core';
- import { BehaviorSubject } from 'rxjs/BehaviorSubject';
- import { WindowService } from './window.service';
- import { Subject } from 'rxjs/Subject';
- import {isRemoteDataOk, NewReport, PS_REPORTS_KEY, RemoteData, Report} from '../types';
- @Injectable()
- export class ReportDataService {
- dataChange = new BehaviorSubject<RemoteData<Report[]>>({ kind: 'notFetched' });
- reportCreated: Subject<Report> = new Subject();
- reportApprovedReject: Subject<{ report: Report, user: string }> = new Subject();
- constructor(@Inject(WindowService) private _window: Window) {
- this.fetch();
- const stringfiedReports = _window.localStorage.getItem(PS_REPORTS_KEY);
- if (stringfiedReports) {
- this.dataChange.next(JSON.parse(stringfiedReports));
- }
- }
- fetch() {
- this.dataChange.next({ kind: 'loading' });
- setTimeout(() => {
- const random = Math.floor((Math.random() * 10) + 1);
- const stringifiedReports = this._window.localStorage.getItem(PS_REPORTS_KEY);
- if (random > 3 && stringifiedReports) {
- this.dataChange.next({
- kind: 'ok',
- data: JSON.parse(stringifiedReports),
- });
- } else {
- // some error.
- this.dataChange.next({
- kind: 'error',
- error: 'Loading the data has failed',
- });
- }
- }, 0);
- }
- get remoteData(): RemoteData<Report[]> {
- return this.dataChange.value;
- }
- getReport(reportId: number): Promise<Report | undefined> {
- if (isRemoteDataOk(this.remoteData)) {
- return Promise.resolve(this.remoteData.data.find(r => r.id === reportId));
- } else {
- return Promise.resolve(undefined);
- }
- }
- add(report: NewReport) {
- if (isRemoteDataOk(this.remoteData)) {
- const newReport = {
- ...report,
- // Since this.data: Report[], rep is a Report, so it does have an id
- // property we can use, although Report.id is an optional number.
- // Which means we can tell the compiler it exists with a '!'.
- id: this.remoteData.data.reduce((biggestId, rep) => biggestId > rep.id ? biggestId : rep.id, 0) + 1,
- amount: report.items.reduce((sum, item) => sum + item.amount, 0)
- };
- const newData = [...this.remoteData.data, newReport];
- this.updateData(newData);
- this.reportCreated.next(newReport);
- }
- }
- save(report: Report) {
- if (isRemoteDataOk(this.remoteData)) {
- const reportIndex = this.remoteData.data.findIndex(r => r.id === report.id);
- const newData = [...this.remoteData.data];
- newData.splice(reportIndex, 1, report);
- this.updateData(newData);
- }
- }
- toggleApproval(report: Report, user: string) {
- if (isRemoteDataOk(this.remoteData)) {
- const reportIndex = this.remoteData.data.findIndex(r => r.id === report.id);
- const newData = [...this.remoteData.data];
- newData.splice(reportIndex, 1, report);
- this.updateData(newData);
- this.reportApprovedReject.next({report, user});
- }
- }
- private updateData(reports: Report[]) {
- this._window.localStorage.setItem(PS_REPORTS_KEY, JSON.stringify(reports));
- this.dataChange.next({
- kind: 'ok',
- data: reports,
- });
- }
- }
|