import {Injectable} from '@angular/core'; import {Observable, Subject} from 'rxjs'; import {map, tap} from 'rxjs/operators'; import {Activity, CarePlan, DataCard} from '@nspop/gm-web-facade-api'; import {copy} from '../../utils/copy'; import {CarePlanService} from '../api/care-plan.service'; import {DataCardService} from '../api/data-card.service'; import {of} from 'rxjs/internal/observable/of'; interface NoteModalOptions { activity: Activity | undefined; allowActivityChange: boolean | undefined; } @Injectable({providedIn: 'root'}) export class ActivitiesService { private openActivityModalEvent: Subject = new Subject(); private openNoteModalEvent: Subject = new Subject(); private openMeasurementsModalEvent: Subject = new Subject(); private innerCarePlan: CarePlan | undefined; private innerDataCard: DataCard | undefined; constructor( public carePlanService: CarePlanService, public dataCardService: DataCardService, ) { this.carePlanService.carePlan$.subscribe((carePlan: CarePlan | undefined) => { if (carePlan) { this.innerCarePlan = carePlan; } }); this.dataCardService.selectedDataCard$.subscribe((dataCard?: DataCard) => { if (dataCard) { this.innerDataCard = dataCard; } }); } private activities$: Observable = this.carePlanService.carePlan$.pipe( map(carePlan => carePlan?.activities ?? []) ); public futureActivities$: Observable = this.activities$.pipe( // map(activities => activities.filter(activity => !activity.plannedTime?.from || activity.plannedTime.from >= new Date())) map(activities => activities.filter(activity => activity.status !== 'finished')) ); public pastActivities$: Observable = this.activities$.pipe( // map(activities => activities.filter(activity => activity.plannedTime?.from && activity.plannedTime.from < new Date())) map(activities => activities.filter(activity => activity.status === 'finished')), ); public selectedDataCard$: Observable = this.dataCardService.selectedDataCard$; get carePlan(): CarePlan | undefined { return copy(this.innerCarePlan); } get dataCard(): DataCard | undefined { return copy(this.innerDataCard); } public cancelActivity(activity: Activity): void { const carePlan = this.carePlan; if (!carePlan?.activities) { return; } const activityIndex = carePlan.activities.findIndex((a) => a.id === activity?.id && a.id !== undefined); if (activityIndex === -1) { return console.error('Could not find activity with id: ' + activity.id); } carePlan.activities[activityIndex].status = 'cancelled'; this.carePlanService.update(carePlan, carePlan.id + '', carePlan.version + '') .pipe(tap(value => this.carePlanService.refresh())) .subscribe(); } // Events public emitOpenActivityModalEvent(activity: Activity | undefined): void { this.openActivityModalEvent.next(activity); } get openActivityModalEvent$(): Observable { return this.openActivityModalEvent; } public emitOpenNoteModalEvent(activity: Activity | undefined, allowActivityChange: boolean | undefined): void { this.openNoteModalEvent.next({activity, allowActivityChange}); } get openNoteModalEvent$(): Observable { return this.openNoteModalEvent; } public emitOpenMeasurementsModalEvent(activity: Activity): void { this.openMeasurementsModalEvent.next(activity); } get openMeasurementsModalEvent$(): Observable { return this.openMeasurementsModalEvent; } }