diff --git a/apps/dashboard/src/features/conversations/conversation-identity.ts b/apps/dashboard/src/features/conversations/conversation-identity.ts index e21d355..6a7a907 100644 --- a/apps/dashboard/src/features/conversations/conversation-identity.ts +++ b/apps/dashboard/src/features/conversations/conversation-identity.ts @@ -1,8 +1,12 @@ import type { ActiveChat } from '../../../../../packages/api-contracts/src/index.js'; +export function createOwnedConversationId(accountId: string | undefined, conversationId: string): string { + return accountId + ? `${encodeURIComponent(accountId)}~${encodeURIComponent(conversationId)}` + : conversationId; +} + export function ownedConversationId(conversation: ActiveChat): string { const conversationId = conversation.roomId ?? conversation.username; - return conversation.owner - ? `${encodeURIComponent(conversation.owner.accountId)}~${encodeURIComponent(conversationId)}` - : conversationId; + return createOwnedConversationId(conversation.owner?.accountId, conversationId); } diff --git a/apps/dashboard/src/features/media/media-card.tsx b/apps/dashboard/src/features/media/media-card.tsx index 2d38e52..580bd4d 100644 --- a/apps/dashboard/src/features/media/media-card.tsx +++ b/apps/dashboard/src/features/media/media-card.tsx @@ -1,5 +1,7 @@ import type { MediaItem } from '../../../../../packages/api-contracts/src/index.js'; +import { Link } from 'react-router-dom'; import { RedditUsernameLink } from '../../components/reddit-username-link.js'; +import { createOwnedConversationId } from '../conversations/conversation-identity.js'; import { mediaConversation, mediaType } from './filters.js'; import { AccountOwnerBadge } from '../../components/account-owner-badge.js'; @@ -15,6 +17,11 @@ function formatMediaDate(timestamp: number): string { } export function MediaCard({ item, isRevealed, onToggleReveal, onOpenPreview }: MediaCardProps) { + const conversationId = item.chatRoomId ?? item.chatUsername; + const conversationPath = conversationId + ? `/conversations/${encodeURIComponent(createOwnedConversationId(item.owner?.accountId, conversationId))}` + : null; + return (
@@ -41,6 +48,11 @@ export function MediaCard({ item, isRevealed, onToggleReveal, onOpenPreview }: M
Type
{mediaType(item) === 'gif' ? 'GIF' : 'Image'}
Received
{formatMediaDate(item.timestamp)}
+ {conversationPath ? ( + + Open conversation + + ) : null}