UNPKG

@opengis/fastify-table

Version:

core-plugins

181 lines (180 loc) 6.04 kB
/* eslint-disable no-param-reassign */ /** * Форматування часу скільки залишилося чи пройшло від заданого * * @priority 3 * @deprecated true * @type helper * @alias formatRelative * @example * {{formatRelative '2022-01-13T13:05:40.841795' locate='ua'}} * @example * {{formatRelative '2022-01-13T13:20:40.841795' locate='ua' percent=1}} * @param {Any} percent Будь-яке значення для відображення часу у відсотках * @param {String} locale Мова якою відобразити час: en ru ua * @param {String} data Отримана та введена дата для форматування * @param {String} short * @param {String} units * @param {String} unit * @param {String} data_only * @returns {String} Returns HTML */ export default function formatRelative(data, options) { if (!data) return "Date is required"; if (typeof data === "string") { data = new Date(data); } let chLang; let timeOut; const locale = options.hash.locate || "en"; const dateFrom = data; const dateTo = options.hash.date_to ? new Date(options.hash.date_to) : new Date(); const templDifPast = { ua: [ "секунд тому", "хвилин тому", "годин тому", "днів тому", "тижнів тому", "місяців тому", "років тому", "Вибачте, але заданого типу не існує", ], ru: [ "секунд назад", "минут назад", "часов назад", "дней назад", "недель назад", "місяцев назад", "лет назад", "Простите, но данного типа не существует", ], en: [ "seconds ago", "minutes ago", "hours ago", "days ago", "weeks ago", "months ago", "years ago", "Sorry, no such type of date ", ], }; const templDifFeature = { ua: [ "секунд залишилось", "хвилин залишилось", "годин залишилось", "днів залишилось", "тижнів залишилось", "місяців залишилось", "років залишилось", "Вибачте, але заданого типу не існує", ], ru: [ "секунд осталось", "минут осталось", "часов осталось", "дней осталось", "недель осталось", "місяцев осталось", "лет осталось", "Простите, но данного типа не существует", ], en: [ "seconds left", "minutes left", "hours left", "days left", "weeks left", "months left", "years left", "Sorry, no such type of date ", ], }; const short = { ua: [ "сек", "хв", "год", "дн", "тижд", "міс", "р", "Вибачте, але заданого типу не існує", ], ru: [ "сек", "мин", "час", "дн", "нед", "мес", "г", "Простите, но данного типа не существует", ], en: [ "sec", "min", "hr", "day", "wk", "mon", "y", "Sorry, no such type of date ", ], }; let dif = Math.floor(dateTo.getTime() - dateFrom.getTime()) / 1000; if (options.hash.percent) { return (((new Date().getTime() - dateFrom.getTime()) * 100) / (dateTo.getTime() - dateFrom.getTime())); } if (dif > 0) { chLang = options.hash.short ? short[locale] : templDifPast[locale]; } else if (dif < 0) { chLang = options.hash.short ? short[locale] : templDifFeature[locale]; } dif = Math.abs(dif); const bestFit = [ dif < 60, dif < 3600, dif < 3600 * 24, dif < 3600 * 24 * 30, dif < 3600 * 24 * 365, ].lastIndexOf(false) + 1; options.hash.units = options.hash.units || options.hash.unit || ["second", "minute", "hour", "day", "week", "month", "year"][bestFit]; switch (options.hash.units) { case "second": timeOut = `${dif} ${options.hash.data_only ? "" : chLang[0]}`; break; case "minute": timeOut = `${Math.floor(dif / 60)} ${options.hash.data_only ? "" : chLang[1]}`; break; case "hour": timeOut = `${Math.floor(dif / (60 * 60))} ${options.hash.data_only ? "" : chLang[2]}`; break; case "day": timeOut = `${Math.floor(dif / (60 * 60 * 24))} ${options.hash.data_only ? "" : chLang[3]}`; break; case "week": timeOut = `${Math.floor(dif / (60 * 60 * 24 * 7))} ${options.hash.data_only ? "" : chLang[4]}`; break; case "month": timeOut = `${Math.floor(dif / (60 * 60 * 24 * 30))} ${options.hash.data_only ? "" : chLang[5]}`; break; case "year": timeOut = `${Math.floor(dif / (60 * 60 * 24 * 365))} ${options.hash.data_only ? "" : chLang[6]}`; break; default: break; } return timeOut; }