snort/packages/app/src/Element/NoteTime.tsx

66 lines
1.6 KiB
TypeScript
Raw Normal View History

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 {
from: number;
fallback?: string;
2023-01-16 17:48:25 +00:00
}
export default function NoteTime(props: NoteTimeProps) {
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
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);
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")}`;
} else if (absAgo < MinuteInMs) {
return fallback;
} else {
2023-02-07 19:47:57 +00:00
const mins = Math.floor(absAgo / MinuteInMs);
if (ago < 0) {
return `in ${mins}m`;
}
return `${mins}m`;
2023-01-09 16:18:34 +00:00
}
}
2023-01-09 16:18:34 +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();
if (newTime !== s) {
return newTime;
}
return s;
});
}, MinuteInMs);
return () => clearInterval(t);
}, [from]);
2023-01-09 16:18:34 +00:00
return (
<time dateTime={isoDate} title={absoluteTime}>
{time}
</time>
);
2023-01-18 23:31:34 +00:00
}