44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
|
// Copyright 2022 Signal Messenger, LLC
|
||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||
|
|
||
|
import type { ReactElement } from 'react';
|
||
|
import React, { useEffect, useState } from 'react';
|
||
|
import classNames from 'classnames';
|
||
|
import * as durations from '../../util/durations';
|
||
|
import type { LocalizerType } from '../../types/Util';
|
||
|
import { formatDate } from '../../util/timestamp';
|
||
|
import { Time } from '../Time';
|
||
|
|
||
|
export function TimelineDateHeader({
|
||
|
floating = false,
|
||
|
i18n,
|
||
|
timestamp,
|
||
|
}: Readonly<{
|
||
|
floating?: boolean;
|
||
|
i18n: LocalizerType;
|
||
|
timestamp: number;
|
||
|
}>): ReactElement {
|
||
|
const [text, setText] = useState(formatDate(i18n, timestamp));
|
||
|
useEffect(() => {
|
||
|
const update = () => setText(formatDate(i18n, timestamp));
|
||
|
update();
|
||
|
const interval = setInterval(update, durations.MINUTE);
|
||
|
return () => {
|
||
|
clearInterval(interval);
|
||
|
};
|
||
|
}, [i18n, timestamp]);
|
||
|
|
||
|
return (
|
||
|
<Time
|
||
|
className={classNames(
|
||
|
'TimelineDateHeader',
|
||
|
`TimelineDateHeader--${floating ? 'floating' : 'inline'}`
|
||
|
)}
|
||
|
dateOnly
|
||
|
timestamp={timestamp}
|
||
|
>
|
||
|
{text}
|
||
|
</Time>
|
||
|
);
|
||
|
}
|