import { useCallback } from 'react'; import { Container, Row, ScrollView } from 'components/layout'; import { metrics } from 'config'; import { topEmojis } from 'emojis'; import { BottomSheet } from 'components/bottom-sheet'; import { ReplyThread, QuoteReply, CopyLink, Pencil, Trash, More, SmilingOutlineAdd } from 'icons'; import { TouchableTile, Text, Divider, Fab, Card, Visible } from 'components'; import { ColorName } from '@emotion/react'; import { useResponsiveLayout } from 'hooks'; import { isEmojisOpenVar, isMessageMoreActionOpenVar } from 'state-management/dialogs'; import { deletingMessageIdVar, editingMessageIdVar, isEditingMessageVar, messageMoreActionsPositionVar, selectedMessageIdVar, } from 'state-management/chat'; const { STYLES, Z_INDEX } = metrics; const sheetHeight = 350; const additionInPosition = 20; export const MessageAction: React.FC = ({ isSheetOpen = false, isHovered, position, messageId, setIsSheetOpen, openEmojisSheet, }) => { const { isMobile, height } = useResponsiveLayout(); const handleEmojisOpen = useCallback(() => { if (openEmojisSheet) { openEmojisSheet(); } }, [openEmojisSheet]); const closeSheet = useCallback(() => { if (setIsSheetOpen) { setIsSheetOpen(false); } }, [setIsSheetOpen]); const deleteMessage = useCallback(() => { deletingMessageIdVar(messageId); }, [messageId]); const editMessage = useCallback(() => { editingMessageIdVar(messageId); isEditingMessageVar(true); }, [messageId]); const actions: ActionType[] = [ { id: 1, title: 'Reply in Thread', leftElement: , }, { id: 2, title: 'Quote Reply', leftElement: , }, ]; const editActions: ActionType[] = [ { id: 3, title: 'Copy Link', onPress: () => {}, leftElement: , }, { id: 4, onPress: editMessage, title: 'Edit Message', leftElement: , }, { id: 5, onPress: deleteMessage, title: 'Delete Message', leftElement: , titleColor: 'secondary', }, ]; const openMore = useCallback(() => { if (position) { const half = height / 2; const isDown = half < position?.y; if (isDown) { const bottomPortion = height - position.y + additionInPosition; messageMoreActionsPositionVar({ bottom: bottomPortion, top: undefined, x: position.x }); } else { const top = position.y + additionInPosition; messageMoreActionsPositionVar({ bottom: undefined, top, x: position.x }); } } isMessageMoreActionOpenVar(true); selectedMessageIdVar(messageId); }, [height, messageId, position]); const openEmojis = useCallback(() => { isEmojisOpenVar(true); }, []); return ( <> {!isMobile ? ( } /> {}} variant="plain" sizeVariant="small" shapeVariant="round" hoverColorVariant="base-02-hover" colorVariant="transparent" centerElement={} /> {}} variant="plain" sizeVariant="small" shapeVariant="round" hoverColorVariant="base-02-hover" colorVariant="transparent" centerElement={} /> } /> ) : ( {topEmojis.map((emoji) => { return ( {}} variant="plain" sizeVariant="medium" colorVariant="base" centerElement={{emoji}} /> ); })} } /> {actions.map(({ title, titleColor, leftElement }) => { return ( {}} mx="xs" variant="text" sizeVariant="large" underlayColorVariant="base-02" centerElement={ {leftElement} {title} } /> ); })} {editActions.map(({ title, titleColor, leftElement }) => { return ( {}} variant="text" mx="xs" sizeVariant="large" centerElement={ {leftElement} {title} } /> ); })} )} ); }; interface ActionType { id: number; title?: string; caption?: string; titleColor?: ColorName; onPress?: () => void; leftElement?: JSX.Element; } export interface MessageActionProps { messageId: string; position: DOMRect | null; isSheetOpen?: boolean; isHovered?: boolean; setIsSheetOpen?: (value: boolean) => void; openEmojisSheet?: () => void; }