fix: add context menu to all events in BaseEventContainer

Moved EventContextMenu from DefaultKindRenderer to BaseEventContainer
so all events (not just generic ones) have context menu support.

Now all events in feeds have both interaction methods:
- Tap/click the menu button (three dots) for dropdown menu
- Right-click or long-press anywhere on the event for context menu

This provides a consistent experience across all event types and
makes the context menu accessible for all custom renderers, not just
the default one.
This commit is contained in:
Claude
2026-01-20 08:56:54 +00:00
parent 4aa5c915a0
commit f467aa3a8a
2 changed files with 25 additions and 29 deletions

View File

@@ -520,21 +520,23 @@ export function BaseEventContainer({
const displayPubkey = authorOverride?.pubkey || event.pubkey;
return (
<div className="flex flex-col gap-2 p-3 border-b border-border/50 last:border-0">
<div className="flex flex-row justify-between items-center">
<div className="flex flex-row gap-2 items-baseline">
<EventAuthor pubkey={displayPubkey} />
<span
className="text-xs text-muted-foreground cursor-help"
title={absoluteTime}
>
{relativeTime}
</span>
<EventContextMenu event={event}>
<div className="flex flex-col gap-2 p-3 border-b border-border/50 last:border-0">
<div className="flex flex-row justify-between items-center">
<div className="flex flex-row gap-2 items-baseline">
<EventAuthor pubkey={displayPubkey} />
<span
className="text-xs text-muted-foreground cursor-help"
title={absoluteTime}
>
{relativeTime}
</span>
</div>
<EventMenu event={event} />
</div>
<EventMenu event={event} />
{children}
<EventFooter event={event} />
</div>
{children}
<EventFooter event={event} />
</div>
</EventContextMenu>
);
}

View File

@@ -139,11 +139,7 @@ import {
MediaStarterPackDetailRenderer,
} from "./StarterPackRenderer";
import { NostrEvent } from "@/types/nostr";
import {
BaseEventContainer,
EventContextMenu,
type BaseEventProps,
} from "./BaseEventRenderer";
import { BaseEventContainer, type BaseEventProps } from "./BaseEventRenderer";
import { P2pOrderRenderer } from "./P2pOrderRenderer";
import { P2pOrderDetailRenderer } from "./P2pOrderDetailRenderer";
import { BadgeDefinitionRenderer } from "./BadgeDefinitionRenderer";
@@ -240,19 +236,17 @@ const kindRenderers: Record<number, React.ComponentType<BaseEventProps>> = {
/**
* Default renderer for kinds without custom implementations
* Shows basic event info with raw content
* Right-click to access event menu
* Right-click or tap menu button to access event menu
*/
function DefaultKindRenderer({ event }: BaseEventProps) {
return (
<EventContextMenu event={event}>
<BaseEventContainer event={event}>
<div className="text-sm text-muted-foreground">
<pre className="text-xs overflow-x-auto whitespace-pre-wrap break-words">
{event.content || "(empty content)"}
</pre>
</div>
</BaseEventContainer>
</EventContextMenu>
<BaseEventContainer event={event}>
<div className="text-sm text-muted-foreground">
<pre className="text-xs overflow-x-auto whitespace-pre-wrap break-words">
{event.content || "(empty content)"}
</pre>
</div>
</BaseEventContainer>
);
}