Time Ago
patchui/time-agoFreeComponent
patchui publishes no description for this item.
Install it
npx shadcn@latest add https://ui.hotfix.jobs/r/time-ago.jsonSource
1"use client";23import { useEffect, useState, useSyncExternalStore } from "react";4import type * as React from "react";5import { cn } from "@/lib/utils";67const defaultFallbackFormatOptions: Intl.DateTimeFormatOptions = {8 month: "short",9 day: "numeric",10 timeZone: "UTC",11};1213const defaultAbsoluteLabelFormatOptions: Intl.DateTimeFormatOptions = {14 year: "numeric",15 month: "short",16 day: "numeric",17 hour: "numeric",18 minute: "2-digit",19 timeZone: "UTC",20 timeZoneName: "short",21};2223const MIN = 60;24const HOUR = 60 * 60;25const DAY = 24 * 60 * 60;26const WEEK = 7 * DAY;27const MONTH = 30.4375 * DAY;28const YEAR = 365.25 * DAY;29const MAX_TIMEOUT = 2_147_000_000;3031function relativeUnitFor(seconds: number): {32 divisor: number;33 unit: Intl.RelativeTimeFormatUnit;34} {35 if (seconds >= YEAR) return { divisor: YEAR, unit: "year" };36 if (seconds >= MONTH) return { divisor: MONTH, unit: "month" };37 if (seconds >= WEEK) return { divisor: WEEK, unit: "week" };38 if (seconds >= DAY) return { divisor: DAY, unit: "day" };39 if (seconds >= HOUR) return { divisor: HOUR, unit: "hour" };40 return { divisor: MIN, unit: "minute" };41}4243function upperBoundaryFor(unit: Intl.RelativeTimeFormatUnit): number {44 if (unit === "minute") return HOUR;45 if (unit === "hour") return DAY;46 if (unit === "day") return WEEK;47 if (unit === "week") return MONTH;48 if (unit === "month") return YEAR;49 return Number.POSITIVE_INFINITY;50}5152function formatTimeAgo(53 dateMs: number,54 formatter: Intl.RelativeTimeFormat,55): string {56 const deltaMs = dateMs - Date.now();57 const signedSeconds = deltaMs / 1000;58 const seconds = Math.abs(deltaMs) / 1000;5960 if (seconds < MIN) return formatter.format(0, "second");6162 const { divisor, unit } = relativeUnitFor(seconds);63 return formatter.format(Math.trunc(signedSeconds / divisor), unit);64}6566function nextRefreshDelay(dateMs: number): number | null {67 if (!Number.isFinite(dateMs)) return null;6869 const signedSeconds = (dateMs - Date.now()) / 1000;70 const seconds = Math.abs(signedSeconds);71 let delaySeconds: number;7273 if (seconds < MIN) {74 delaySeconds = signedSeconds > 0 ? seconds + MIN : MIN - seconds;75 } else {76 const { divisor, unit } = relativeUnitFor(seconds);77 if (signedSeconds > 0) {78 delaySeconds = seconds % divisor || 1;79 } else {80 const nextValue = (Math.floor(seconds / divisor) + 1) * divisor;81 delaySeconds = Math.min(82 nextValue - seconds,83 upperBoundaryFor(unit) - seconds,84 );85 }86// … truncated
What it pulls in
Other registry items
Files it writes
More from patchui
All 51 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | patchui | Components | Free | 2 deps | |
| Avataravatar | patchui | Components | Free | 3 deps | |
| Badgebadge | patchui | Components | Free | 2 deps | |
| Breadcrumbbreadcrumb | patchui | Components | Free | 1 dep | |
| Buttonbutton | patchui | Components | Free | 2 deps | |
| Calendarcalendar | patchui | Components | Free | 1 dep | |
| Cardcard | patchui | Components | Free | 1 dep | |
| Checkboxcheckbox | patchui | Components | Free | 2 deps |
