2023-01-09 16:18:34 +00:00
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
|
|
|
const MinuteInMs = 1_000 * 60;
|
|
|
|
const HourInMs = MinuteInMs * 60;
|
|
|
|
const DayInMs = HourInMs * 24;
|
|
|
|
|
2023-01-16 17:48:25 +00:00
|
|
|
export interface NoteTimeProps {
|
2023-02-07 20:04:50 +00:00
|
|
|
from: number;
|
|
|
|
fallback?: string;
|
2023-01-16 17:48:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export default function NoteTime(props: NoteTimeProps) {
|
2023-02-07 20:04:50 +00:00
|
|
|
const [time, setTime] = useState<string>();
|
|
|
|
const { from, fallback } = props;
|
|
|
|
const absoluteTime = new Intl.DateTimeFormat(undefined, {
|
|
|
|
dateStyle: "medium",
|
|
|
|
timeStyle: "long",
|
|
|
|
}).format(from);
|
2023-02-08 21:10:26 +00:00
|
|
|
const fromDate = new Date(from);
|
|
|
|
const isoDate = fromDate.toISOString();
|
2023-01-09 16:18:34 +00:00
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
function calcTime() {
|
2023-02-07 19:47:57 +00:00
|
|
|
const fromDate = new Date(from);
|
|
|
|
const ago = new Date().getTime() - from;
|
|
|
|
const absAgo = Math.abs(ago);
|
2023-02-07 20:04:50 +00:00
|
|
|
if (absAgo > DayInMs) {
|
|
|
|
return fromDate.toLocaleDateString(undefined, {
|
|
|
|
year: "2-digit",
|
|
|
|
month: "short",
|
|
|
|
day: "2-digit",
|
|
|
|
weekday: "short",
|
|
|
|
});
|
|
|
|
} else if (absAgo > HourInMs) {
|
2023-02-09 12:26:54 +00:00
|
|
|
return `${fromDate.getHours().toString().padStart(2, "0")}:${fromDate.getMinutes().toString().padStart(2, "0")}`;
|
2023-02-07 20:04:50 +00:00
|
|
|
} else if (absAgo < MinuteInMs) {
|
|
|
|
return fallback;
|
|
|
|
} else {
|
2023-02-07 19:47:57 +00:00
|
|
|
const mins = Math.floor(absAgo / MinuteInMs);
|
2023-02-07 20:04:50 +00:00
|
|
|
if (ago < 0) {
|
|
|
|
return `in ${mins}m`;
|
|
|
|
}
|
|
|
|
return `${mins}m`;
|
2023-01-09 16:18:34 +00:00
|
|
|
}
|
2023-02-07 20:04:50 +00:00
|
|
|
}
|
2023-01-09 16:18:34 +00:00
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
useEffect(() => {
|
|
|
|
setTime(calcTime());
|
2023-02-07 19:47:57 +00:00
|
|
|
const t = setInterval(() => {
|
2023-02-09 12:26:54 +00:00
|
|
|
setTime(s => {
|
2023-02-07 19:47:57 +00:00
|
|
|
const newTime = calcTime();
|
2023-02-07 20:04:50 +00:00
|
|
|
if (newTime !== s) {
|
|
|
|
return newTime;
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
});
|
|
|
|
}, MinuteInMs);
|
|
|
|
return () => clearInterval(t);
|
|
|
|
}, [from]);
|
2023-01-09 16:18:34 +00:00
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
return (
|
|
|
|
<time dateTime={isoDate} title={absoluteTime}>
|
|
|
|
{time}
|
|
|
|
</time>
|
|
|
|
);
|
2023-01-18 23:31:34 +00:00
|
|
|
}
|