feat: enhance image components with draggable attribute and context menu handling

This commit is contained in:
2026-03-08 21:53:32 +11:00
parent b185e0b129
commit 30a7725769
7 changed files with 26 additions and 14 deletions

View File

@@ -90,6 +90,7 @@ export const ImageViewer = as<'div', ImageViewerProps>(
}}
src={src}
alt={alt}
draggable={false}
onMouseDown={onMouseDown}
/>
</Box>

View File

@@ -4,6 +4,12 @@ import * as css from './media.css';
export const Image = forwardRef<HTMLImageElement, ImgHTMLAttributes<HTMLImageElement>>(
({ className, alt, ...props }, ref) => (
<img className={classNames(css.Image, className)} alt={alt} {...props} ref={ref} />
<img
className={classNames(css.Image, className)}
alt={alt}
draggable={false}
{...props}
ref={ref}
/>
)
);

View File

@@ -164,7 +164,6 @@ export const ImageContent = as<'div', ImageContentProps>(
<Modal
className={ModalWide}
size="500"
onContextMenu={(evt: any) => evt.stopPropagation()}
>
{renderViewer({
src: srcState.data,

View File

@@ -18,19 +18,19 @@ export function UnreadBadgeCenter({ children }: { children: ReactNode }) {
}
export function UnreadBadge({ highlight, count }: UnreadBadgeProps) {
if (count === 0) return null;
return (
<Badge
variant={highlight ? 'Success' : 'Secondary'}
size={count > 0 ? '400' : '200'}
size="400"
fill="Solid"
radii="Pill"
outlined={false}
>
{count > 0 && (
<Text as="span" size="L400">
{millify(count)}
</Text>
)}
<Text as="span" size="L400">
{millify(count)}
</Text>
</Badge>
);
}

View File

@@ -919,7 +919,7 @@ export const Message = as<'div', MessageProps>(
const handleContextMenu: MouseEventHandler<HTMLDivElement> = (evt) => {
if (evt.altKey || !window.getSelection()?.isCollapsed || edit) return;
const tag = (evt.target as any).tagName;
if (typeof tag === 'string' && tag.toLowerCase() === 'a') return;
if (typeof tag === 'string' && (tag.toLowerCase() === 'a' || tag.toLowerCase() === 'img')) return;
evt.preventDefault();
setMenuAnchor({
x: evt.clientX,
@@ -1297,7 +1297,7 @@ export const Event = as<'div', EventProps>(
const handleContextMenu: MouseEventHandler<HTMLDivElement> = (evt) => {
if (evt.altKey || !window.getSelection()?.isCollapsed) return;
const tag = (evt.target as any).tagName;
if (typeof tag === 'string' && tag.toLowerCase() === 'a') return;
if (typeof tag === 'string' && (tag.toLowerCase() === 'a' || tag.toLowerCase() === 'img')) return;
evt.preventDefault();
setMenuAnchor({
x: evt.clientX,

View File

@@ -202,7 +202,7 @@ function MessageNotifications() {
eventId: string;
isDm: boolean;
}) => {
const notificationTitle = `${username} - Paarrot`;
const notificationTitle = username;
const notificationBody = messageBody || 'New message';
/** Replicates TitleBar click navigation logic */

View File

@@ -119,10 +119,16 @@ export function DirectTab() {
</SidebarAvatar>
)}
</SidebarItemTooltip>
{directUnread && (
<SidebarItemBadge hasCount={directUnread.total > 0}>
{directUnread && directUnread.total > 0 && (
<div style={{
position: 'absolute',
bottom: '2px',
right: '2px',
pointerEvents: 'none',
zIndex: 2,
}}>
<UnreadBadge highlight={directUnread.highlight > 0} count={directUnread.total} />
</SidebarItemBadge>
</div>
)}
{menuAnchor && (
<PopOut