| import React, { useState } from 'react'; |
| import { User, Building2, Mail, ChevronDown, ChevronUp, Copy, CheckCircle2 } from 'lucide-react'; |
| import { Button } from "@/components/ui/button"; |
| import { Badge } from "@/components/ui/badge"; |
| import { motion } from 'framer-motion'; |
|
|
| export default function SequenceCard({ contact, index }) { |
| const [isExpanded, setIsExpanded] = useState(index < 3); |
| const [copiedEmailNum, setCopiedEmailNum] = useState(null); |
| const [expandedEmailNum, setExpandedEmailNum] = useState(null); |
|
|
| |
| const emails = contact.emails || []; |
| const firstEmail = emails[0] || contact; |
| |
| const handleCopy = (emailContent, emailNum) => { |
| navigator.clipboard.writeText(emailContent); |
| setCopiedEmailNum(emailNum); |
| setTimeout(() => setCopiedEmailNum(null), 2000); |
| }; |
|
|
| return ( |
| <motion.div |
| initial={{ opacity: 0, y: 20 }} |
| animate={{ opacity: 1, y: 0 }} |
| transition={{ duration: 0.3, delay: index * 0.05 }} |
| className="rounded-xl border border-slate-200 bg-white overflow-hidden hover:shadow-md transition-shadow" |
| > |
| <div |
| className="px-5 py-4 flex items-center justify-between cursor-pointer hover:bg-slate-50/50 transition-colors" |
| onClick={() => setIsExpanded(!isExpanded)} |
| > |
| <div className="flex items-center gap-4"> |
| <div className="h-10 w-10 rounded-full bg-gradient-to-br from-violet-500 to-purple-600 |
| flex items-center justify-center text-white font-semibold text-sm"> |
| {firstEmail.firstName?.[0]}{firstEmail.lastName?.[0]} |
| </div> |
| <div> |
| <h4 className="font-semibold text-slate-800"> |
| {firstEmail.firstName} {firstEmail.lastName} |
| </h4> |
| <div className="flex items-center gap-3 text-sm text-slate-500"> |
| <span className="flex items-center gap-1"> |
| <Building2 className="h-3.5 w-3.5" /> |
| {firstEmail.company} |
| </span> |
| <span className="flex items-center gap-1"> |
| <Mail className="h-3.5 w-3.5" /> |
| {firstEmail.email} |
| </span> |
| {emails.length > 1 && ( |
| <span className="text-violet-600 font-medium"> |
| {emails.length} emails |
| </span> |
| )} |
| </div> |
| </div> |
| </div> |
| <div className="flex items-center gap-3"> |
| <Badge className="bg-violet-100 text-violet-700 hover:bg-violet-100"> |
| {firstEmail.product} |
| </Badge> |
| {isExpanded ? ( |
| <ChevronUp className="h-5 w-5 text-slate-400" /> |
| ) : ( |
| <ChevronDown className="h-5 w-5 text-slate-400" /> |
| )} |
| </div> |
| </div> |
| |
| {isExpanded && ( |
| <motion.div |
| initial={{ opacity: 0, height: 0 }} |
| animate={{ opacity: 1, height: 'auto' }} |
| exit={{ opacity: 0, height: 0 }} |
| className="border-t border-slate-100" |
| > |
| <div className="px-5 py-4 bg-slate-50/50 space-y-4"> |
| {emails.map((email, emailIdx) => ( |
| <div key={emailIdx} className="bg-white rounded-lg border border-slate-200 p-4"> |
| <div className="flex items-center justify-between mb-3"> |
| <div className="flex items-center gap-2"> |
| <h5 className="text-sm font-medium text-slate-600"> |
| Email {email.emailNumber || emailIdx + 1} |
| </h5> |
| {emails.length > 1 && ( |
| <Badge variant="outline" className="text-xs"> |
| {email.emailNumber || emailIdx + 1} of {emails.length} |
| </Badge> |
| )} |
| </div> |
| <Button |
| variant="ghost" |
| size="sm" |
| onClick={(e) => { |
| e.stopPropagation(); |
| handleCopy(email.emailContent, email.emailNumber || emailIdx + 1); |
| }} |
| className="h-8 text-slate-500 hover:text-violet-600" |
| > |
| {copiedEmailNum === (email.emailNumber || emailIdx + 1) ? ( |
| <> |
| <CheckCircle2 className="h-4 w-4 mr-1 text-green-500" /> |
| Copied! |
| </> |
| ) : ( |
| <> |
| <Copy className="h-4 w-4 mr-1" /> |
| Copy |
| </> |
| )} |
| </Button> |
| </div> |
| <div className="mb-3 pb-3 border-b border-slate-100"> |
| <span className="text-xs text-slate-400 uppercase tracking-wide">Subject</span> |
| <p className="text-sm font-medium text-slate-800 mt-1">{email.subject}</p> |
| </div> |
| <div className="text-sm text-slate-700 whitespace-pre-wrap leading-relaxed"> |
| {email.emailContent} |
| </div> |
| </div> |
| ))} |
| </div> |
| </motion.div> |
| )} |
| </motion.div> |
| ); |
| } |
|
|