From ee90f32707a49e177b3eecf95a51aa17bfff761d Mon Sep 17 00:00:00 2001 From: Hailey Date: Wed, 1 May 2024 18:56:47 -0700 Subject: [PATCH] add a delete menu --- src/components/dms/MesageItemMetadata.tsx | 87 +++++++++++++ .../Messages/Conversation/MessageItem.tsx | 119 +++++------------- 2 files changed, 119 insertions(+), 87 deletions(-) create mode 100644 src/components/dms/MesageItemMetadata.tsx diff --git a/src/components/dms/MesageItemMetadata.tsx b/src/components/dms/MesageItemMetadata.tsx new file mode 100644 index 0000000000..895bb59e18 --- /dev/null +++ b/src/components/dms/MesageItemMetadata.tsx @@ -0,0 +1,87 @@ +import React, {useCallback} from 'react' +import {StyleProp, TextStyle} from 'react-native' +import {ChatBskyConvoDefs} from '@atproto-labs/api' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {TimeElapsed} from 'view/com/util/TimeElapsed' +import {atoms as a, useTheme} from '#/alf' +import {Text} from '#/components/Typography' + +export function MessageItemMetadata({ + 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} + + )} + + ) +} diff --git a/src/screens/Messages/Conversation/MessageItem.tsx b/src/screens/Messages/Conversation/MessageItem.tsx index 68b8ca0097..4e1b61c562 100644 --- a/src/screens/Messages/Conversation/MessageItem.tsx +++ b/src/screens/Messages/Conversation/MessageItem.tsx @@ -1,5 +1,5 @@ -import React, {useCallback, useMemo} from 'react' -import {StyleProp, TextStyle, View} from 'react-native' +import React, {useMemo} from 'react' +import {View} from 'react-native' import {ChatBskyConvoDefs} from '@atproto-labs/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' @@ -7,11 +7,13 @@ import {useLingui} from '@lingui/react' import {useSession} from '#/state/session' import {useHaptics} from 'lib/haptics' import {isNative} from 'platform/detection' -import {TimeElapsed} from '#/view/com/util/TimeElapsed' import {atoms as a, useTheme} from '#/alf' import {useDialogControl} from '#/components/Dialog' import {GrowWrapper, GrowWrapperRef} from '#/components/dms/GrowWrapper' +import {MessageItemMetadata} from '#/components/dms/MesageItemMetadata' import {MessageMenu} from '#/components/dms/MessageMenu' +import * as Prompt from '#/components/Prompt' +import {usePromptControl} from '#/components/Prompt' import {Text} from '#/components/Typography' export function MessageItem({ @@ -25,10 +27,12 @@ export function MessageItem({ | null }) { const t = useTheme() + const {_} = useLingui() const {currentAccount} = useSession() const playHaptic = useHaptics() - const control = useDialogControl() + const menuControl = useDialogControl() + const deleteControl = usePromptControl() const itemRef = React.useRef(null) const isFromSelf = item.sender?.did === currentAccount?.did @@ -61,8 +65,17 @@ export function MessageItem({ if (isNative) { playHaptic() } - control.open() - }, [control, playHaptic]) + menuControl.open() + }, [menuControl, playHaptic]) + + const onDialogClose = React.useCallback(() => { + itemRef.current?.reset() + }, []) + + const onDelete = React.useCallback(() => { + itemRef.current?.reset() + // TODO delete the message + }, []) return ( - itemRef.current?.reset()} - control={control} + onClose={onDialogClose} + control={menuControl} + /> + ) } - -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} - - )} - - ) -}