##// END OF EJS Templates
corrected tear down logic handling in observables. Added support for observable query results
corrected tear down logic handling in observables. Added support for observable query results

File last commit:

r110:1a190b3a757d v1.4.0 default
r110:1a190b3a757d v1.4.0 default
Show More
MainContext.ts
71 lines | 2.2 KiB | video/mp2t | TypeScriptLexer
import Memory = require("dojo/store/Memory");
import Observable = require("dojo/store/Observable");
import { Appointment, AppointmentRole, Member } from "./Appointment";
import { Contact } from "./Contact";
import { Uuid } from "@implab/core-amd/Uuid";
import { query } from "@implab/djx/observable";
import { IDestroyable } from "@implab/core-amd/interfaces";
import { delay } from "@implab/core-amd/safe";
type AppointmentRecord = Omit<Appointment, "getMembers"> & { id: string };
type ContactRecord = Contact;
type MemberRecord = Member & { appointmentId: string; };
const item = <T, T2>(map: (x: T) => T2) => <U extends { item: T }>({ item, ...props }: U) => ({ item: map(item), ...props });
export class MainContext implements IDestroyable {
private readonly _appointments = new Observable(new Memory<AppointmentRecord>());
private readonly _contacts = new Observable(new Memory<ContactRecord>());
private readonly _members = new Observable(new Memory<MemberRecord>());
async createAppointment(title: string, startAt: Date, duration: number, members: Member[]) {
await delay(1000);
const id = Uuid();
this._appointments.add({
id,
startAt,
duration,
title
});
members.forEach(member =>
this._members.add({
appointmentId: id,
...member
}, { id: Uuid() }) as void
);
}
queryAppointments({ dateFrom, dateTo }: { dateFrom?: Date; dateTo?: Date; } = {}) {
return query(this._appointments)(({ startAt }) =>
(!dateFrom || dateFrom <= startAt) &&
(!dateTo || startAt <= dateTo)
).map(item(this._mapAppointment));
}
async addMember(appointmentId: string, member: Member) {
await delay(1000);
this._members.add({
appointmentId,
...member
});
}
private readonly _mapAppointment = ({ startAt, title, duration, id }: AppointmentRecord) => ({
id,
title,
startAt,
duration,
getMembers: (role?: AppointmentRole) => this._members.query(role ? { appointmentId: id, role } : { appointmentId: id })
});
destroy() {
}
}