import { FC, useEffect, useRef, useState } from 'react'; import { GestureResponderEvent } from 'react-native'; import { useReactiveVar } from '@apollo/client'; import { useHover } from 'react-native-web-hooks'; import { useResponsiveLayout } from 'hooks'; import { CheckGroup, Eye, SyncBack } from 'icons'; import { Avatar, Text, Visible } from 'components'; import { MessageAction } from 'components/sheets'; import { Col, Container, Row, TouchableHighlight } from 'components/layout'; import { getMessageDateTime } from 'utils/dateTime'; import { MessageFragment, RichTextContentSegment } from 'expo-schema'; import { isMessageMoreActionOpenVar } from 'state-management/dialogs'; import { selectedMessageIdVar } from 'state-management/chat'; import { MessageContent } from 'components/rich-text'; import { MessageReactions } from '../message-reactions'; import { RoomCreated } from './room-created/RoomCreated'; import { File } from './file'; import { Replies } from './replies'; export const Message: FC = ({ isThread, message, onLongPress, onHovered }) => { const { isMobile, isHandHeld } = useResponsiveLayout(); const isMessageMoreActionOpen = useReactiveVar(isMessageMoreActionOpenVar); const selectedMessageId = useReactiveVar(selectedMessageIdVar); const [isMessageHovered, setIsMessageHovered] = useState(false); const keepHovered = selectedMessageId === message.id && isMessageMoreActionOpen; const messageRef = useRef(null); const isHovered = useHover(messageRef); const { id, richTextContent, replyCount, userName, userProfilePhotoUrl, createdAt } = message; const position = !isHandHeld ? messageRef.current && (messageRef.current as unknown as HTMLDivElement).getBoundingClientRect() : null; useEffect(() => { if (isHovered) { if (onHovered) { onHovered(true); setIsMessageHovered(true); } } else { if (onHovered) { onHovered(false); setIsMessageHovered(false); } } if (keepHovered) { if (onHovered) { onHovered(true); setIsMessageHovered(true); } } }, [isHovered, onHovered, keepHovered]); const size = isMobile ? 30 : 38; const titleVariant = isThread ? 'caption' : 'body'; const backgroundColor = isMessageHovered ? 'base-02-hover' : 'transparent'; return ( {userName?.first} {''} {userName?.last} {getMessageDateTime(createdAt)} {replyCount} {richTextContent?.map((richContent) => ( ))} ); }; export interface MessageProps { onHovered?: (value: boolean) => void; onLongPress?: ((event: GestureResponderEvent) => void) | undefined; isThread?: boolean; message: MessageFragment; }