MainModel.ts
78 lines
| 2.2 KiB
| video/mp2t
|
TypeScriptLexer
cin
|
r110 | import { id as mid } from "module"; | |
import { BehaviorSubject, Observer, Unsubscribable } from "rxjs"; | |||
import { IDestroyable } from "@implab/core-amd/interfaces"; | |||
cin
|
r116 | import { Observable } from "@implab/djx/observable"; | |
import { OrderedUpdate } from "@implab/djx/store"; | |||
cin
|
r110 | 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"; | |||
cin
|
r118 | import { whenRendered } from "@implab/djx/tsx/render"; | |
cin
|
r107 | ||
cin
|
r110 | const trace = TraceSource.get(mid); | |
export interface State { | |||
cin
|
r116 | appointments: Observable<OrderedUpdate<Appointment>>; | |
cin
|
r107 | ||
cin
|
r110 | dateTo: LocalDate; | |
cin
|
r107 | ||
cin
|
r110 | dateFrom: LocalDate; | |
title: string; | |||
cin
|
r107 | } | |
export default class MainModel implements IDestroyable { | |||
private readonly _state: BehaviorSubject<State>; | |||
cin
|
r110 | ||
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" | |||
}); | |||
cin
|
r107 | } | |
getState() { | |||
return this._state.getValue(); | |||
} | |||
subscribe(observer: Partial<Observer<State>>): Unsubscribable { | |||
return this._state.subscribe(observer); | |||
cin
|
r110 | } | |
cin
|
r107 | protected dispatch(command: Partial<State>) { | |
const state = this.getState(); | |||
cin
|
r110 | this._state.next({ ...state, ...command }); | |
} | |||
addMember(appointmentId: string, member: Member) { | |||
this._context.addMember(appointmentId, member).catch(error(trace)); | |||
cin
|
r107 | } | |
cin
|
r110 | addAppointment(title: string, startAt: Date, duration: number) { | |
cin
|
r118 | this._context.createAppointment(title,startAt, duration, []) | |
.then(() => { | |||
trace.debug("addAppointment done"); | |||
return whenRendered(); | |||
}) | |||
.then(() => { | |||
trace.debug("Render dome"); | |||
}) | |||
.catch(error(trace)); | |||
cin
|
r110 | } | |
cin
|
r146 | removeAppointment(appointmentId: string) { | |
this._context.removeAppointment(appointmentId).catch(error(trace)); | |||
} | |||
cin
|
r118 | ||
cin
|
r110 | load() { | |
cin
|
r118 | this._context.load().catch(error(trace)); | |
cin
|
r110 | } | |
destroy() { | |||
this._context.destroy(); | |||
} | |||
cin
|
r107 | } |