UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

117 lines (116 loc) 5.28 kB
import { Level0Duration } from "@rr0/time"; export class RelativeTimeTextBuilder { constructor(timeTextBuilder) { this.timeTextBuilder = timeTextBuilder; } build(oldContext, newContext) { var _a, _b, _c, _d, _e; let text; const time = newContext.time; const previousTime = time.equals(oldContext === null || oldContext === void 0 ? void 0 : oldContext.time) ? undefined : oldContext.time; let options; if (previousTime === null || previousTime === void 0 ? void 0 : previousTime.isDefined()) { options = {}; const deltaMs = time.date.compare(previousTime.date); const deltaDuration = Level0Duration.toSpec(deltaMs); const deltaContext = oldContext.clone(); const deltaTime = deltaContext.time; const year = time.getYear(); const previousYear = previousTime.getYear(); const yearDelta = (_a = deltaDuration.years) === null || _a === void 0 ? void 0 : _a.value; const sameYear = !yearDelta || yearDelta < 1; const noYear = !previousYear; const shouldSetYear = yearDelta || (noYear) || previousTime.getYear() !== time.getYear(); if (shouldSetYear) { deltaTime.setYear(year); options.year = "numeric"; } const month = time.getMonth(); const previousMonth = previousTime.getMonth(); const deltaDurationMonth = (_b = deltaDuration.months) === null || _b === void 0 ? void 0 : _b.value; const sameMonth = !deltaDurationMonth || deltaDurationMonth < 1; const noMonth = !previousMonth; const shouldSetMonth = deltaDurationMonth || (noMonth || shouldSetYear); if (shouldSetMonth) { deltaTime.setMonth(month); options.month = "long"; } const dayOfMonth = time.getDayOfMonth(); const previousDay = previousTime.getDayOfMonth(); const dayOfMonthDelta = (_c = deltaDuration.days) === null || _c === void 0 ? void 0 : _c.value; const sameDay = !dayOfMonthDelta || dayOfMonthDelta < 1; const shouldSetDay = dayOfMonthDelta || (!sameDay && sameYear && sameMonth); const noDay = !previousDay; if (shouldSetDay) { deltaTime.setDayOfMonth(dayOfMonth); options.day = "numeric"; options.weekday = "long"; } const hour = time.getHour(); const hourDelta = (_d = deltaDuration.hours) === null || _d === void 0 ? void 0 : _d.value; const shouldSetHour = hourDelta || (hour && (noDay || (sameYear && sameMonth && sameDay))) || previousTime.getHour() !== time.getHour(); if (shouldSetHour) { deltaTime.setHour(hour); options.hour = "2-digit"; } const minutes = time.getMinutes(); const minutesDelta = (_e = deltaDuration.minutes) === null || _e === void 0 ? void 0 : _e.value; const sameHour = hourDelta === 0; const shouldSetMinutes = minutesDelta || (minutes && (sameYear && sameMonth && sameDay && sameHour)); if (shouldSetMinutes) { deltaTime.setMinutes(minutes); options.minute = "2-digit"; } if (deltaContext.time.isDefined()) { newContext = deltaContext; } const messages = newContext.messages.context.time.relative; if (dayOfMonthDelta && sameYear && sameMonth) { switch (dayOfMonthDelta) { case -1: text = messages.day.before; break; case +1: text = messages.day.after; break; } } else { if (!dayOfMonth && sameYear) { switch (deltaDurationMonth) { case -1: text = messages.month.before; break; case +1: text = time.getMonth() - previousTime.getMonth() === 1 ? messages.month.after : messages.month.later; break; } } if (!month) { switch (yearDelta) { case -1: text = messages.year.before; break; case +1: text = messages.year.after; break; } } if (!minutes) { switch (hourDelta) { case -1: text = messages.hour.before; break; case +1: text = messages.hour.after; break; } } } } if (!text) { text = this.timeTextBuilder.build(newContext, options); } return text; } }