|  |  | import { id as mid } from "module"; | 
                        
    
    
        |  |  | import { BehaviorSubject, Observer, Unsubscribable } from "rxjs"; | 
                        
    
    
        |  |  | import { IDestroyable } from "@implab/core-amd/interfaces"; | 
                        
    
    
        |  |  | import { OrderUpdate, Observable } from "@implab/djx/observable"; | 
                        
    
    
        |  |  | import { Appointment, Member } from "./Appointment"; | 
                        
    
    
        |  |  | import { MainContext } from "./MainContext"; | 
                        
    
    
        |  |  | import { LocalDate } from "@js-joda/core"; | 
                        
    
    
        |  |  | import { error } from "../logging"; | 
                        
    
    
        |  |  | import { TraceSource } from "@implab/core-amd/log/TraceSource"; | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | const trace = TraceSource.get(mid); | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | export interface State { | 
                        
    
    
        |  |  | appointments: Observable<OrderUpdate<Appointment>>; | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | dateTo: LocalDate; | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | dateFrom: LocalDate; | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | title: string; | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | export default class MainModel implements IDestroyable { | 
                        
    
    
        |  |  | private readonly _state: BehaviorSubject<State>; | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | private readonly _context = new MainContext(); | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | constructor() { | 
                        
    
    
        |  |  | this._state = new BehaviorSubject<State>({ | 
                        
    
    
        |  |  | dateTo: LocalDate.now(), | 
                        
    
    
        |  |  | dateFrom: LocalDate.now().minusMonths(1), | 
                        
    
    
        |  |  | appointments: this._context.queryAppointments(), | 
                        
    
    
        |  |  | title: "Appointments" | 
                        
    
    
        |  |  | }); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  | getState() { | 
                        
    
    
        |  |  | return this._state.getValue(); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | subscribe(observer: Partial<Observer<State>>): Unsubscribable { | 
                        
    
    
        |  |  | return this._state.subscribe(observer); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | protected dispatch(command: Partial<State>) { | 
                        
    
    
        |  |  | const state = this.getState(); | 
                        
    
    
        |  |  | this._state.next({ ...state, ...command }); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | addMember(appointmentId: string, member: Member) { | 
                        
    
    
        |  |  | this._context.addMember(appointmentId, member).catch(error(trace)); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | addAppointment(title: string, startAt: Date, duration: number) { | 
                        
    
    
        |  |  | this._context.createAppointment(title,startAt, duration, []).catch(error(trace)); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | load() { | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  |  | 
                        
    
    
        |  |  | destroy() { | 
                        
    
    
        |  |  | this._context.destroy(); | 
                        
    
    
        |  |  | } | 
                        
    
    
        |  |  | } |