import moment from 'moment';
export type TimeUnit = moment.unitOfTime.DurationConstructor;
export type DurationFlat = {
value: string,
unit: string
};
export class Duration {
value: string;
unit: TimeUnit;
constructor(value: string, unit: TimeUnit) {
this.value = value
this.unit = unit
}
isValid() { return moment.duration(parseInt(this.value), this.unit).isValid(); }
toMoment() {
let m = moment.duration(parseInt(this.value), this.unit);
if (m.isValid()) return m;
return null;
}
static days(n: number) { return new Duration(String(n), 'days'); }
static weeks(n: number) { return new Duration(String(n), 'weeks'); }
static months(n: number) { return new Duration(String(n), 'months'); }
deflate() { return { value: this.value, unit: this.unit }; }
static inflate = (obj: DurationFlat) => new Duration(obj.value, obj.unit as TimeUnit);
}
export type TrackedPeriodFlat = {
name: string,
start: DurationFlat,
end: DurationFlat
};
export class TrackedPeriod {
name: string;
start: Duration;
end: Duration;
constructor(name: string, start: Duration, end: Duration) {
this.name = name;
this.start = start;
this.end = end;
}
deflate() {
return {
name: this.name,
start: this.start.deflate(),
end: this.end.deflate()
};
}
static inflate = (obj: TrackedPeriodFlat) => (
new TrackedPeriod(obj.name,
Duration.inflate(obj.start),
Duration.inflate(obj.end))
);
}