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 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(m.date(), m.month(), m.year()); } readonly day: number; readonly month: Month; readonly year: number; constructor(day: number = 0, month: Month = Month.January, year: number = 0) { this.day = day; this.month = month; this.year = year; } 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; }