diff --git a/apps/api/src/services/ActivityService.ts b/apps/api/src/services/ActivityService.ts index f46e47e..6e3ef61 100644 --- a/apps/api/src/services/ActivityService.ts +++ b/apps/api/src/services/ActivityService.ts @@ -454,6 +454,11 @@ export class ActivityService { for (const email of emails) { const baseMetadata = { subject: email.subject, + body: email.body, + from: email.from, + fromName: email.fromName, + replyTo: email.replyTo, + toName: email.toName, sourceType: email.sourceType, campaignName: email.campaign?.name, workflowName: email.workflowExecution?.workflow?.name, diff --git a/apps/web/src/components/ActivityItem.tsx b/apps/web/src/components/ActivityItem.tsx index cf32c14..5f934e0 100644 --- a/apps/web/src/components/ActivityItem.tsx +++ b/apps/web/src/components/ActivityItem.tsx @@ -1,6 +1,7 @@ -import {Badge, Collapsible, CollapsibleContent, CollapsibleTrigger} from '@plunk/ui'; +import {Badge, Button, Collapsible, CollapsibleContent, CollapsibleTrigger} from '@plunk/ui'; import type {Activity} from './ActivityFeed'; -import {memo} from 'react'; +import {memo, useState} from 'react'; +import {EmailPreviewModal} from './EmailPreviewModal'; import { AlertCircle, Calendar, @@ -90,6 +91,13 @@ function getUpcomingTime(date: Date): string { return `in ${diffInMonths} ${diffInMonths === 1 ? 'month' : 'months'}`; } +/** + * Check if an activity is an email activity + */ +function isEmailActivity(type: string): boolean { + return ['email.sent', 'email.delivered', 'email.opened', 'email.clicked', 'email.bounced'].includes(type); +} + interface ActivityItemProps { activity: Activity; isUpcoming?: boolean; @@ -295,6 +303,7 @@ function getActivityConfig(activity: Activity): ActivityConfig { } export const ActivityItem = memo(function ActivityItem({activity, isUpcoming = false}: ActivityItemProps) { + const [showPreviewModal, setShowPreviewModal] = useState(false); const config = getActivityConfig(activity); const Icon = config.icon; const timestamp = new Date(activity.timestamp); @@ -318,6 +327,17 @@ export const ActivityItem = memo(function ActivityItem({activity, isUpcoming = f {config.title}
{config.badge &&{config.description}
} {activity.contactEmail && ( @@ -357,6 +377,21 @@ export const ActivityItem = memo(function ActivityItem({activity, isUpcoming = f + + {/* Email Preview Modal */} + {showPreviewModal && activity.metadata.subject && activity.metadata.body ? ( +