import React, {useCallback, useMemo} from 'react' import {StyleProp, TextStyle, View} from 'react-native' import {ChatBskyConvoDefs} from '@atproto-labs/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useSession} from '#/state/session' import {TimeElapsed} from '#/view/com/util/TimeElapsed' import {atoms as a, useTheme} from '#/alf' import {Text} from '#/components/Typography' export function MessageItem({ item, next, }: { item: ChatBskyConvoDefs.MessageView next: | ChatBskyConvoDefs.MessageView | ChatBskyConvoDefs.DeletedMessageView | null }) { const t = useTheme() const {currentAccount} = useSession() const isFromSelf = item.sender?.did === currentAccount?.did const isNextFromSelf = ChatBskyConvoDefs.isMessageView(next) && next.sender?.did === currentAccount?.did const isLastInGroup = useMemo(() => { // if the next message is from a different sender, then it's the last in the group if (isFromSelf ? !isNextFromSelf : isNextFromSelf) { return true } // or, if there's a 10 minute gap between this message and the next if (ChatBskyConvoDefs.isMessageView(next)) { const thisDate = new Date(item.sentAt) const nextDate = new Date(next.sentAt) const diff = nextDate.getTime() - thisDate.getTime() // 10 minutes return diff > 10 * 60 * 1000 } return true }, [item, next, isFromSelf, isNextFromSelf]) return ( {item.text} ) } function Metadata({ message, isLastInGroup, style, }: { message: ChatBskyConvoDefs.MessageView isLastInGroup: boolean style: StyleProp }) { const t = useTheme() const {_} = useLingui() const relativeTimestamp = useCallback( (timestamp: string) => { const date = new Date(timestamp) const now = new Date() const time = new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: 'numeric', hour12: true, }).format(date) const diff = now.getTime() - date.getTime() // if under 1 minute if (diff < 1000 * 60) { return _(msg`Now`) } // if in the last day if (now.toISOString().slice(0, 10) === date.toISOString().slice(0, 10)) { return time } // if yesterday const yesterday = new Date(now) yesterday.setDate(yesterday.getDate() - 1) if ( yesterday.toISOString().slice(0, 10) === date.toISOString().slice(0, 10) ) { return _(msg`Yesterday, ${time}`) } return new Intl.DateTimeFormat(undefined, { hour: 'numeric', minute: 'numeric', hour12: true, day: 'numeric', month: 'numeric', year: 'numeric', }).format(date) }, [_], ) if (!isLastInGroup) { return null } return ( {({timeElapsed}) => ( {timeElapsed} )} ) }