import { View, Text, ScrollView, TouchableOpacity } from 'react-native'; import { useLocalSearchParams, router, useFocusEffect } from 'expo-router'; import { useState, useCallback } from 'react'; import { ArrowLeft, Edit2, Trash2 } from 'lucide-react-native'; import { getDatabase } from '@/lib/database'; import { dbToContact } from '@/lib/contactHelpers'; import { Contact } from '@/store/useContactStore'; import { EditContactSheet } from '@/components/contacts/EditContactSheet'; import { LogVisitSheet } from '@/components/visits/LogVisitSheet'; import { ConfirmDialog } from '@/components/ui/ConfirmDialog'; import { EmptyState } from '@/components/ui/EmptyState'; import { useToast } from '@/components/ui/Toast'; import { Visit, dbToVisit, formatDate } from '@/lib/visitHelpers'; const statusColors: Record = { 'Active': '#4CAF7D', 'Return Visit': '#2196F3', 'Bible Study': '#9C27B0', 'Not Interested': '#9CA3AF', 'Do Not Call': '#C0392B', }; export default function ContactDetailScreen() { const { id } = useLocalSearchParams<{ id: string }>(); const [contact, setContact] = useState(null); const [visits, setVisits] = useState([]); const [showEdit, setShowEdit] = useState(false); const [showLogVisit, setShowLogVisit] = useState(false); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const { showToast } = useToast(); async function loadData() { const db = await getDatabase(); const row = await db.getFirstAsync('SELECT * FROM contacts WHERE id = ?', [id]); if (row) setContact(dbToContact(row)); const visitRows = await db.getAllAsync('SELECT * FROM visits WHERE contact_id = ? ORDER BY visit_date DESC', [id]); setVisits(visitRows.map(dbToVisit)); } useFocusEffect(useCallback(() => { loadData(); }, [id])); async function handleDeleteConfirmed() { const db = await getDatabase(); await db.runAsync('UPDATE contacts SET deleted_at = ? WHERE id = ?', [Math.floor(Date.now() / 1000), id]); showToast(`${contact?.fullName} deleted`, 'success'); router.back(); } if (!contact) return ; const statusColor = statusColors[contact.status] ?? '#9CA3AF'; return ( router.back()} className="bg-white/20 rounded-full p-2" accessibilityRole="button" accessibilityLabel="Go back" style={{ minWidth: 44, minHeight: 44, alignItems: 'center', justifyContent: 'center' }} > setShowEdit(true)} className="bg-white/20 rounded-full p-2" accessibilityRole="button" accessibilityLabel="Edit contact" style={{ minWidth: 44, minHeight: 44, alignItems: 'center', justifyContent: 'center' }} > setShowDeleteConfirm(true)} className="bg-white/20 rounded-full p-2" accessibilityRole="button" accessibilityLabel="Delete contact" style={{ minWidth: 44, minHeight: 44, alignItems: 'center', justifyContent: 'center' }} > {contact.fullName.split(' ').map((n) => n[0]).join('').substring(0, 2).toUpperCase()} {contact.fullName} {contact.status} Information {contact.address && } {contact.territoryCode && } {contact.notes && ( Notes {contact.notes} )} Visit History ({visits.length}) setShowLogVisit(true)} className="bg-primary rounded-lg px-3 py-1.5" accessibilityRole="button" accessibilityLabel="Log a new visit" style={{ minHeight: 36 }} > + Log Visit {visits.length === 0 ? ( ) : ( visits.map((v) => ( {formatDate(v.visitDate)} {v.topic && 📖 {v.topic}} {v.response && 💬 {v.response}} {v.remarks && {v.remarks}} {v.nextVisitDate && Next: {formatDate(v.nextVisitDate)}} )) )} setShowEdit(false)} onSaved={() => { setShowEdit(false); loadData(); }} /> setShowLogVisit(false)} onSaved={() => { setShowLogVisit(false); loadData(); }} /> { setShowDeleteConfirm(false); handleDeleteConfirmed(); }} onCancel={() => setShowDeleteConfirm(false)} /> ); } function InfoRow({ label, value }: { label: string; value: string }) { return ( {label} {value} ); }