@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 4.89 kB
Source Map (JSON)
{"version":3,"file":"helper.mjs","sources":["../../../components/time-ago/helper.ts"],"sourcesContent":["import { getCountWord, makeSentence } from '@vexip-ui/config'\nimport {\n DAY_ON_MILLISECONDS,\n HOUR_ON_MILLISECONDS,\n MINUTE_ON_MILLISECONDS,\n SECOND_ON_MILLISECONDS\n} from '@vexip-ui/utils'\n\nimport type { Ref } from 'vue'\n\nexport interface TimeAgoRecord {\n datetime: Date,\n timeAgo: Ref<string>,\n locale: Ref<Record<string, string>>,\n wordSpace: Ref<boolean>,\n interval: false | number,\n updated: number\n}\n\nlet id = 1\n\nexport function getId() {\n return id++\n}\n\nconst recordMap = new Map<number, TimeAgoRecord>()\n\nlet timer: ReturnType<typeof setInterval>\nlet isRunning: boolean\n\nexport function subscribe(id: number, record: TimeAgoRecord) {\n recordMap.set(id, record)\n\n if (recordMap.size && !isRunning) {\n clearInterval(timer)\n\n timer = setInterval(() => {\n isRunning = true\n\n const current = Date.now()\n\n recordMap.forEach(record => {\n if (!record.interval) return\n\n if (current - record.updated > record.interval) {\n record.timeAgo.value = computeTimeAgo(\n record.datetime,\n current,\n record.locale.value,\n record.wordSpace.value\n )\n record.updated = current\n }\n })\n }, 5000)\n }\n}\n\nexport function unsubscribe(id: number) {\n recordMap.delete(id)\n\n if (!recordMap.size) {\n clearInterval(timer)\n isRunning = false\n }\n}\n\nexport function computeTimeAgo(\n date: Date,\n current: number,\n locale: Record<string, string>,\n wordSpace: boolean\n) {\n const diff = Math.abs(current - date.getTime())\n const type = current > date.getTime() ? locale.ago : locale.late\n\n let label: string\n let usedDiff: number\n let noFormat = false\n\n if (diff < 10 * SECOND_ON_MILLISECONDS) {\n label = locale.justNow\n noFormat = true\n } else if (diff < MINUTE_ON_MILLISECONDS) {\n label = locale.second\n usedDiff = Math.floor(diff / SECOND_ON_MILLISECONDS)\n } else if (diff < HOUR_ON_MILLISECONDS) {\n label = locale.minute\n usedDiff = Math.floor(diff / MINUTE_ON_MILLISECONDS)\n } else if (diff < DAY_ON_MILLISECONDS) {\n label = locale.hour\n usedDiff = Math.floor(diff / HOUR_ON_MILLISECONDS)\n } else if (diff < 30 * DAY_ON_MILLISECONDS) {\n usedDiff = Math.floor(diff / DAY_ON_MILLISECONDS)\n\n if (usedDiff === 1) {\n label = locale.yesterday\n noFormat = true\n } else {\n label = locale.days\n }\n } else if (diff < 365 * DAY_ON_MILLISECONDS) {\n usedDiff = Math.floor(diff / (30 * DAY_ON_MILLISECONDS))\n\n if (usedDiff === 1) {\n label = locale.lastMonth\n noFormat = true\n } else {\n label = locale.months\n }\n } else {\n usedDiff = Math.floor(diff / 365 / DAY_ON_MILLISECONDS)\n\n if (usedDiff === 1) {\n label = locale.lastYear\n noFormat = true\n } else {\n label = locale.years\n }\n }\n\n if (noFormat) {\n return label\n }\n\n return makeSentence(`${getCountWord(label, usedDiff!)} ${type}`, wordSpace)\n}\n"],"names":["id","getId","recordMap","timer","isRunning","subscribe","record","current","computeTimeAgo","unsubscribe","date","locale","wordSpace","diff","type","label","usedDiff","noFormat","SECOND_ON_MILLISECONDS","MINUTE_ON_MILLISECONDS","HOUR_ON_MILLISECONDS","DAY_ON_MILLISECONDS","makeSentence","getCountWord"],"mappings":";;AAmBA,IAAIA,IAAK;AAEF,SAASC,IAAQ;AACf,SAAAD;AACT;AAEA,MAAME,wBAAgB,IAA2B;AAEjD,IAAIC,GACAC;AAEY,SAAAC,EAAUL,GAAYM,GAAuB;AACjD,EAAAJ,EAAA,IAAIF,GAAIM,CAAM,GAEpBJ,EAAU,QAAQ,CAACE,MACrB,cAAcD,CAAK,GAEnBA,IAAQ,YAAY,MAAM;AACZ,IAAAC,IAAA;AAEN,UAAAG,IAAU,KAAK,IAAI;AAEf,IAAAL,EAAA,QAAQ,CAAAI,MAAU;AACtB,MAACA,EAAO,YAERC,IAAUD,EAAO,UAAUA,EAAO,aACpCA,EAAO,QAAQ,QAAQE;AAAA,QACrBF,EAAO;AAAA,QACPC;AAAA,QACAD,EAAO,OAAO;AAAA,QACdA,EAAO,UAAU;AAAA,MACnB,GACAA,EAAO,UAAUC;AAAA,IACnB,CACD;AAAA,KACA,GAAI;AAEX;AAEO,SAASE,EAAYT,GAAY;AACtC,EAAAE,EAAU,OAAOF,CAAE,GAEdE,EAAU,SACb,cAAcC,CAAK,GACPC,IAAA;AAEhB;AAEO,SAASI,EACdE,GACAH,GACAI,GACAC,GACA;AACA,QAAMC,IAAO,KAAK,IAAIN,IAAUG,EAAK,SAAS,GACxCI,IAAOP,IAAUG,EAAK,QAAY,IAAAC,EAAO,MAAMA,EAAO;AAExD,MAAAI,GACAC,GACAC,IAAW;AA2Cf,SAzCIJ,IAAO,KAAKK,KACdH,IAAQJ,EAAO,SACJM,IAAA,MACFJ,IAAOM,KAChBJ,IAAQJ,EAAO,QACJK,IAAA,KAAK,MAAMH,IAAOK,CAAsB,KAC1CL,IAAOO,KAChBL,IAAQJ,EAAO,QACJK,IAAA,KAAK,MAAMH,IAAOM,CAAsB,KAC1CN,IAAOQ,KAChBN,IAAQJ,EAAO,MACJK,IAAA,KAAK,MAAMH,IAAOO,CAAoB,KACxCP,IAAO,KAAKQ,KACVL,IAAA,KAAK,MAAMH,IAAOQ,CAAmB,GAE5CL,MAAa,KACfD,IAAQJ,EAAO,WACJM,IAAA,MAEXF,IAAQJ,EAAO,QAERE,IAAO,MAAMQ,KACtBL,IAAW,KAAK,MAAMH,KAAQ,KAAKQ,EAAoB,GAEnDL,MAAa,KACfD,IAAQJ,EAAO,WACJM,IAAA,MAEXF,IAAQJ,EAAO,WAGjBK,IAAW,KAAK,MAAMH,IAAO,MAAMQ,CAAmB,GAElDL,MAAa,KACfD,IAAQJ,EAAO,UACJM,IAAA,MAEXF,IAAQJ,EAAO,QAIfM,IACKF,IAGFO,EAAa,GAAGC,EAAaR,GAAOC,CAAS,CAAC,IAAIF,CAAI,IAAIF,CAAS;AAC5E;"}