import { observable } from "mobx"; import { Moment } from "moment"; export class TimeOfDay { static fromMoment(m: Moment): TimeOfDay { return new TimeOfDay(m.hour(), m.minute(), m.second(), m.millisecond()); } static fromDate(date: Date): TimeOfDay { return new TimeOfDay(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()); } static equals(a: TimeOfDay | null | undefined, b: TimeOfDay | null | undefined): boolean { return (a === b) || ((a != null && b != null) && a.hour === b.hour && a.minute === b.minute && a.second === b.second && a.millisecond === b.millisecond); } readonly hour: number; readonly minute: number; readonly second: number; readonly millisecond: number; constructor(hour: number = 0, minute: number = 0, second: number = 0, millisecond: number = 0) { this.hour = hour; this.minute = minute; this.second = second; this.millisecond = millisecond; } } export enum Weekday { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, } export const WEEKDAYS: Weekday[] = Object.keys(Weekday) .map((weekday) => Number(weekday)) .filter((weekday) => !isNaN(weekday)); export enum Month { January = 1, February = 2, March = 3, April = 4, May = 5, June = 6, July = 7, August = 8, September = 9, October = 10, November = 11, December = 12, } export class DateOfYear { static readonly DEFAULT = new DateOfYear({ day: 1, month: Month.January, year: 0 }); static equals(a: DateOfYear | null | undefined, b: DateOfYear | null | undefined): boolean { return (a === b) || ((a instanceof DateOfYear && b instanceof DateOfYear) && a.day === b.day && a.month === b.month && a.year === b.year); } static fromMoment(m: Moment): DateOfYear { return new DateOfYear({ day: m.date(), month: m.month(), year: m.year() }); } readonly day!: number; readonly month!: Month; readonly year!: number; constructor(data?: Partial) { Object.assign(this, DateOfYear.DEFAULT, data); } with(data: Partial): DateOfYear { return new DateOfYear(Object.assign({}, this, data)); } toString() { return `${Month[this.month]} ${this.day}, ${this.year}`; } } export class Schedule { @observable times: TimeOfDay[] = []; @observable weekdays: Weekday[] = []; @observable from: DateOfYear | null = null; @observable to: DateOfYear | null = null; constructor(data?: Partial) { if (typeof data === "object") { Object.assign(this, data); } } clone(): Schedule { return new Schedule(this); } }