| 238 | } |
| 239 | |
| 240 | function formatRelativeTime( |
| 241 | dateStr: string, |
| 242 | t: ( |
| 243 | key: |
| 244 | | "time.monthsAgo" |
| 245 | | "time.daysAgo" |
| 246 | | "time.hoursAgo" |
| 247 | | "time.minsAgo" |
| 248 | | "time.justNow", |
| 249 | values?: { count: number } |
| 250 | ) => string |
| 251 | ): string { |
| 252 | const date = new Date(dateStr) |
| 253 | if (Number.isNaN(date.getTime())) return dateStr |
| 254 | |
| 255 | const now = new Date() |
| 256 | const diffMs = now.getTime() - date.getTime() |
| 257 | const diffMin = Math.floor(diffMs / 60_000) |
| 258 | const diffHour = Math.floor(diffMin / 60) |
| 259 | const diffDay = Math.floor(diffHour / 24) |
| 260 | |
| 261 | if (diffDay > 30) { |
| 262 | const diffMonth = Math.floor(diffDay / 30) |
| 263 | return t("time.monthsAgo", { count: diffMonth }) |
| 264 | } |
| 265 | if (diffDay > 0) return t("time.daysAgo", { count: diffDay }) |
| 266 | if (diffHour > 0) return t("time.hoursAgo", { count: diffHour }) |
| 267 | if (diffMin > 0) return t("time.minsAgo", { count: diffMin }) |
| 268 | return t("time.justNow", { count: 0 }) |
| 269 | } |
| 270 | |
| 271 | function parseDate(dateStr: string): Date | null { |
| 272 | const date = new Date(dateStr) |