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