diff --git a/src/ui/Age/Age.tsx b/src/ui/Age/Age.tsx index 9d15554640..459fe24962 100644 --- a/src/ui/Age/Age.tsx +++ b/src/ui/Age/Age.tsx @@ -2,7 +2,12 @@ import clsx from "clsx"; import dayjs from "dayjs"; import LocalizedFormat from "dayjs/plugin/localizedFormat"; import TimezonePlugin from "dayjs/plugin/timezone"; -import { Tooltip } from "react-tooltip"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger +} from "@flanksource-ui/components/ui/tooltip"; import { isEmpty } from "../../utils/date"; import { datetimePreferenceAtom, @@ -48,22 +53,22 @@ export default function Age({ datetimePreference, suffix ); - return ( - <> - - {formattedDate} - - {datetimePreference !== "timestamp" && ( - - )} - + if (datetimePreference === "timestamp") { + return {formattedDate}; + } + + return ( + + + + {formattedDate} + + + + + + ); } @@ -73,34 +78,45 @@ export default function Age({ if (duration.asMilliseconds() < 1000) { return ( - <> - - {duration.asMilliseconds()}ms - - - + + + + {duration.asMilliseconds()}ms + + + + + + ); } return ( - <> - - {_from.local().to(_to, !suffix)} - - - + + + + + {_from.local().to(_to, !suffix)} + + + +
+
+
+ From +
+ +
+
+
+ To +
+ +
+
+
+
+
); } @@ -111,6 +127,61 @@ export function formatDateForTooltip( return formatDayjs(datetime, displayTimezone, "timestamp", false); } +function FullTimestampTooltip({ datetime }: { datetime: dayjs.Dayjs }) { + return ( +
+ +
+ ); +} + +function FullTimestampRows({ datetime }: { datetime: dayjs.Dayjs }) { + const browserTimezoneOffset = datetime.local().format("Z"); + const browserTimestamp = datetime.local().format("YYYY-MM-DD HH:mm:ss"); + const utcTimestamp = datetime.tz("UTC").format("YYYY-MM-DD HH:mm:ss"); + + return ( +
+
{formatRelativeLong(datetime)}
+
+ + {browserTimezoneOffset} + + {browserTimestamp} +
+
+ UTC + {utcTimestamp} +
+
+ ); +} + +function formatRelativeLong(datetime: dayjs.Dayjs) { + const now = dayjs(); + const diffSeconds = datetime.diff(now, "second"); + const absSeconds = Math.abs(diffSeconds); + + const units: Array<{ unit: Intl.RelativeTimeFormatUnit; seconds: number }> = [ + { unit: "year", seconds: 365 * 24 * 60 * 60 }, + { unit: "month", seconds: 30 * 24 * 60 * 60 }, + { unit: "day", seconds: 24 * 60 * 60 }, + { unit: "hour", seconds: 60 * 60 }, + { unit: "minute", seconds: 60 }, + { unit: "second", seconds: 1 } + ]; + + const selected = + units.find(({ seconds }) => absSeconds >= seconds) ?? + units[units.length - 1]; + const value = Math.round(diffSeconds / selected.seconds); + + return new Intl.RelativeTimeFormat("en", { + numeric: "always", + style: "long" + }).format(value, selected.unit); +} + export function formatDayjs( datetime: dayjs.Dayjs, displayTimezone: string,