import { View, Text, ScrollView, TouchableOpacity, Alert } from 'react-native'; import { useLocalSearchParams, router, useFocusEffect } from 'expo-router'; import { useState, useCallback } from 'react'; import { ArrowLeft, Edit2, Trash2, MapPin } 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 { 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); 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 handleDelete() { Alert.alert('Delete Contact', `Are you sure you want to delete ${contact?.fullName}?`, [ { text: 'Cancel', style: 'cancel' }, { text: 'Delete', style: 'destructive', onPress: async () => { const db = await getDatabase(); await db.runAsync('UPDATE contacts SET deleted_at = ? WHERE id = ?', [Math.floor(Date.now() / 1000), id]); router.back(); } } ]); } if (!contact) return ; const statusColor = statusColors[contact.status] ?? '#9CA3AF'; return ( router.back()} className="bg-white/20 rounded-full p-2"> setShowEdit(true)} className="bg-white/20 rounded-full p-2"> {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"> + Log Visit {visits.length === 0 ? ( No visits recorded yet ) : ( 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(); }} /> ); } function InfoRow({ label, value }: { label: string; value: string }) { return ( {label} {value} ); }