Add draggable handling

This commit is contained in:
Gigiaj 2025-06-15 23:06:20 -05:00
parent 41b036550f
commit 7b84264b26

View file

@ -80,9 +80,9 @@ import { StateEvent } from '../../../../types/matrix/room';
import { getTagIconSrc, PowerLevelTag } from '../../../hooks/usePowerLevelTags'; import { getTagIconSrc, PowerLevelTag } from '../../../hooks/usePowerLevelTags';
import { PowerIcon } from '../../../components/power'; import { PowerIcon } from '../../../components/power';
import colorMXID from '../../../../util/colorMXID'; import colorMXID from '../../../../util/colorMXID';
import { MessageDropdownMenu, MessageOptionsMenu } from '../MessageOptionsMenu'; import { MessageDropdownMenu, MessageOptionsMenu, BottomSheetMenu } from '../MessageOptionsMenu';
import { BottomSheetMenu } from '../MobileClickMenu';
import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize'; import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
import { DraggableMessage } from './DraggableMessage';
export type ReactionHandler = (keyOrMxc: string, shortcode: string) => void; export type ReactionHandler = (keyOrMxc: string, shortcode: string) => void;
@ -719,13 +719,13 @@ export const Message = as<'div', MessageProps>(
const useAuthentication = useMediaAuthentication(); const useAuthentication = useMediaAuthentication();
const senderId = mEvent.getSender() ?? ''; const senderId = mEvent.getSender() ?? '';
const { hoverProps, isHovered } = useHover({}); const { hoverProps, isHovered } = useHover({});
const { focusWithinProps, isFocusWithin } = useFocusWithin({}); const { focusWithinProps } = useFocusWithin({});
const [menuAnchor, setMenuAnchor] = useState<RectCords>(); const [menuAnchor, setMenuAnchor] = useState<RectCords>();
const [emojiBoardAnchor, setEmojiBoardAnchor] = useState<RectCords>(); const [emojiBoardAnchor, setEmojiBoardAnchor] = useState<RectCords>();
const screenSize = useScreenSizeContext(); const screenSize = useScreenSizeContext();
const isMobile = screenSize === ScreenSize.Mobile; const isMobile = screenSize === ScreenSize.Mobile;
const [isDesktopOptionsActive, setDesktopOptionsActive] = useState(false); const [isDesktopOptionsActive, setDesktopOptionsActive] = useState(false);
const showDesktopOptions = !isMobile && (isHovered || isFocusWithin || isDesktopOptionsActive); //const showDesktopOptions = !isMobile && (isHovered || isFocusWithin || isDesktopOptionsActive);
const [isMobileSheetOpen, setMobileSheetOpen] = useState(false); const [isMobileSheetOpen, setMobileSheetOpen] = useState(false);
const senderDisplayName = const senderDisplayName =
getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId; getMemberDisplayName(room, senderId) ?? getMxIdLocalPart(senderId) ?? senderId;
@ -764,6 +764,10 @@ export const Message = as<'div', MessageProps>(
handleClose(); handleClose();
}; };
// TODO: Remove this and clean it up later...
const button = document.createElement('button');
button.setAttribute('data-event-id', mEvent.getId());
const tagColor = powerLevelTag?.color const tagColor = powerLevelTag?.color
? accessibleTagColors?.get(powerLevelTag.color) ? accessibleTagColors?.get(powerLevelTag.color)
: undefined; : undefined;
@ -926,23 +930,90 @@ export const Message = as<'div', MessageProps>(
handleOpenMenu={handleOpenMenu} handleOpenMenu={handleOpenMenu}
/> />
)} )}
{messageLayout === MessageLayout.Compact && ( {messageLayout === MessageLayout.Compact &&
<CompactLayout before={headerJSX} onContextMenu={handleContextMenu}> (!isMobile ? (
{msgContentJSX} <CompactLayout before={headerJSX} onContextMenu={handleContextMenu}>
</CompactLayout> {msgContentJSX}
)} </CompactLayout>
{messageLayout === MessageLayout.Bubble && ( ) : (
<BubbleLayout before={avatarJSX} onContextMenu={handleContextMenu}> <DraggableMessage
{headerJSX} event={mEvent}
{msgContentJSX} onReply={() => {
</BubbleLayout> const mockTargetElement = document.createElement('button');
)} mockTargetElement.setAttribute('data-event-id', mEvent.getId());
{messageLayout !== MessageLayout.Compact && messageLayout !== MessageLayout.Bubble && ( const mockEvent = {
<ModernLayout before={avatarJSX} onContextMenu={handleContextMenu}> currentTarget: mockTargetElement,
{headerJSX} };
{msgContentJSX}
</ModernLayout> onReplyClick(mockEvent);
)} }}
onEdit={() => {
onEditId(mEvent.getId());
}}
mx={mx}
>
<CompactLayout before={headerJSX} onContextMenu={handleContextMenu}>
{msgContentJSX}
</CompactLayout>
</DraggableMessage>
))}
{messageLayout === MessageLayout.Bubble &&
(!isMobile ? (
<BubbleLayout before={headerJSX} onContextMenu={handleContextMenu}>
{msgContentJSX}
</BubbleLayout>
) : (
<DraggableMessage
event={mEvent}
onReply={() => {
const mockTargetElement = document.createElement('button');
mockTargetElement.setAttribute('data-event-id', mEvent.getId());
const mockEvent = {
currentTarget: mockTargetElement,
};
onReplyClick(mockEvent);
}}
onEdit={() => {
onEditId(mEvent.getId());
}}
mx={mx}
>
<BubbleLayout before={headerJSX} onContextMenu={handleContextMenu}>
{msgContentJSX}
</BubbleLayout>
</DraggableMessage>
))}
{messageLayout !== MessageLayout.Compact &&
messageLayout !== MessageLayout.Bubble &&
(!isMobile ? (
<ModernLayout before={avatarJSX} onContextMenu={handleContextMenu}>
{headerJSX}
{msgContentJSX}
</ModernLayout>
) : (
<DraggableMessage
event={mEvent}
onReply={() => {
const mockTargetElement = document.createElement('button');
mockTargetElement.setAttribute('data-event-id', mEvent.getId());
const mockEvent = {
currentTarget: mockTargetElement,
};
onReplyClick(mockEvent);
}}
onEdit={() => {
onEditId(mEvent.getId());
}}
mx={mx}
>
<ModernLayout before={avatarJSX} onContextMenu={handleContextMenu}>
{headerJSX}
{msgContentJSX}
</ModernLayout>
</DraggableMessage>
))}
</MessageBase> </MessageBase>
{isMobile && ( {isMobile && (
@ -954,7 +1025,6 @@ export const Message = as<'div', MessageProps>(
setMobileSheetOpen(false); setMobileSheetOpen(false);
}} }}
mEvent={mEvent} mEvent={mEvent}
eventId={mEvent.getId()}
room={room} room={room}
mx={mx} mx={mx}
relations={relations} relations={relations}