{"version":3,"file":"time-ago-controller-DpB7OVB9.js","sources":["../../../app/frontend/src/global/controllers/time-ago-controller.js"],"sourcesContent":["import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static values = {\n date: String,\n locale: String,\n refreshInterval: Number\n };\n\n connect() {\n // Check if Intl.RelativeTimeFormat is supported\n if (typeof Intl === 'undefined' || !Intl.RelativeTimeFormat) {\n console.log('Intl.RelativeTimeFormat is not supported in this browser.');\n return;\n }\n\n this.locale = this.localeValue || this.getNavigatorLanguage();\n this.setTimeText();\n\n if (this.hasRefreshIntervalValue) {\n this.refreshTimer = setInterval(() => {\n this.setTimeText();\n }, this.refreshIntervalValue);\n }\n }\n\n disconnect() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n }\n }\n\n setTimeText() {\n this.timeAgoText = this.fromToday(Date.parse(this.dateValue));\n this.element.innerText = this.timeAgoText;\n }\n\n fromToday = (initialTime) => {\n let timeDiff;\n let isAfter = false;\n let now = new Date();\n\n if (now > initialTime) {\n timeDiff = now - initialTime;\n } else {\n timeDiff = initialTime - now;\n isAfter = true;\n }\n\n // amount of milliseconds in each time period\n const units = {\n // approximates, because different years/months have different values\n // this should not matter too much because we only display the largest unit\n // so we do not require extreme accuracy most of the time\n year: 24 * 60 * 60 * 1000 * 365,\n month: (24 * 60 * 60 * 1000 * 365) / 12,\n // exact\n day: 24 * 60 * 60 * 1000,\n hour: 60 * 60 * 1000,\n minute: 60 * 1000,\n second: 1000\n };\n\n // define the rtf options\n const rtf = new Intl.RelativeTimeFormat(this.locale, {\n numeric: 'auto'\n });\n\n for (const unit in units) {\n const numMs = units[unit];\n if (timeDiff > numMs) {\n const value = Math.round(timeDiff / numMs);\n const parsed = rtf.format(isAfter ? value : -value, unit);\n return parsed;\n }\n }\n\n /**\n * rtf smallest unit is second\n * so if this function has not returned, it means that timeDiff < 1 second\n */\n\n switch (this.locale) {\n case 'nl':\n return 'nu net';\n case 'de':\n return 'Grade eben';\n case 'fr':\n return 'juste maintenant';\n }\n\n return 'just now';\n };\n\n getNavigatorLanguage = () => {\n if (navigator.languages && navigator.languages.length) {\n return navigator.languages[0];\n } else {\n return (\n navigator.userLanguage ||\n navigator.language ||\n navigator.browserLanguage ||\n 'en'\n );\n }\n };\n}\n"],"names":["TimeAgoController","Controller","__publicField","initialTime","timeDiff","isAfter","now","units","rtf","unit","numMs","value"],"mappings":"2NAEe,MAAKA,UAASC,CAAW,CAAzB,kCAmCbC,EAAA,iBAAaC,GAAgB,CAC3B,IAAIC,EACAC,EAAU,GACVC,EAAM,IAAI,KAEVA,EAAMH,EACRC,EAAWE,EAAMH,GAEjBC,EAAWD,EAAcG,EACzBD,EAAU,IAIZ,MAAME,EAAQ,CAIZ,KAAM,GAAK,GAAK,GAAK,IAAO,IAC5B,MAAQ,GAAK,GAAK,GAAK,IAAO,IAAO,GAErC,IAAK,GAAK,GAAK,GAAK,IACpB,KAAM,GAAK,GAAK,IAChB,OAAQ,GAAK,IACb,OAAQ,GACT,EAGKC,EAAM,IAAI,KAAK,mBAAmB,KAAK,OAAQ,CACnD,QAAS,MACf,CAAK,EAED,UAAWC,KAAQF,EAAO,CACxB,MAAMG,EAAQH,EAAME,CAAI,EACxB,GAAIL,EAAWM,EAAO,CACpB,MAAMC,EAAQ,KAAK,MAAMP,EAAWM,CAAK,EAEzC,OADeF,EAAI,OAAOH,EAAUM,EAAQ,CAACA,EAAOF,CAAI,CAEhE,CACA,CAOI,OAAQ,KAAK,OAAM,CACjB,IAAK,KACH,MAAO,SACT,IAAK,KACH,MAAO,aACT,IAAK,KACH,MAAO,kBACf,CAEI,MAAO,UACR,GAEDP,EAAA,4BAAuB,IACjB,UAAU,WAAa,UAAU,UAAU,OACtC,UAAU,UAAU,CAAC,EAG1B,UAAU,cACV,UAAU,UACV,UAAU,iBACV,MA7FN,SAAU,CAER,GAAI,OAAO,KAAS,KAAe,CAAC,KAAK,mBAAoB,CAC3D,QAAQ,IAAI,2DAA2D,EACvE,MACN,CAEI,KAAK,OAAS,KAAK,aAAe,KAAK,qBAAsB,EAC7D,KAAK,YAAa,EAEd,KAAK,0BACP,KAAK,aAAe,YAAY,IAAM,CACpC,KAAK,YAAa,CAC1B,EAAS,KAAK,oBAAoB,EAElC,CAEE,YAAa,CACP,KAAK,cACP,cAAc,KAAK,YAAY,CAErC,CAEE,aAAc,CACZ,KAAK,YAAc,KAAK,UAAU,KAAK,MAAM,KAAK,SAAS,CAAC,EAC5D,KAAK,QAAQ,UAAY,KAAK,WAClC,CAuEA,CAvGEA,EADkBF,EACX,SAAS,CACd,KAAM,OACN,OAAQ,OACR,gBAAiB,MAClB"}