import React from 'react'; import { View, Text, StyleSheet, TouchableOpacity } from 'react-native'; import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; import { useTheme } from '@/shared/styles/useTheme'; import type { CrmLead, CrmTask, CrmContact, CrmDeal, CrmSalesOrder, CrmPurchaseOrder, CrmInvoice } from '../types/CrmTypes'; interface BaseCardProps { onPress: () => void; } interface LeadCardProps extends BaseCardProps { lead: CrmLead; } interface TaskCardProps extends BaseCardProps { task: CrmTask; } interface ContactCardProps extends BaseCardProps { contact: CrmContact; } interface DealCardProps extends BaseCardProps { deal: CrmDeal; } interface SalesOrderCardProps extends BaseCardProps { salesOrder: CrmSalesOrder; } interface PurchaseOrderCardProps extends BaseCardProps { purchaseOrder: CrmPurchaseOrder; } interface InvoiceCardProps extends BaseCardProps { invoice: CrmInvoice; } const getStatusColor = (status: string, colors: any) => { // return '#3AA0FF'; switch (status.toLowerCase()) { case 'new': case 'not started': case 'attempted to contact': return '#3AA0FF'; case 'contacted': case 'in progress': case 'qualification': return '#F59E0B'; case 'qualified': case 'proposal': return '#10B981'; case 'completed': case 'closed won': return '#22C55E'; case 'unqualified': case 'cancelled': case 'lost lead': return '#EF4444'; default: return colors.textLight; } }; const getPriorityColor = (priority: string) => { return '#EF4444'; switch (priority.toLowerCase()) { case 'high': return '#EF4444'; case 'medium': return '#F59E0B'; case 'low': return '#10B981'; default: return '#6B7280'; } }; export const LeadCard: React.FC = ({ lead, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {lead.Full_Name} {lead.Lead_Status} {lead.Company} {lead.Email} {lead.Phone} Source: {lead.Lead_Source} {lead.Annual_Revenue && ( ${lead.Annual_Revenue.toLocaleString()} )} Created: {new Date(lead.Created_Time)?.toLocaleDateString()} ); }; export const TaskCard: React.FC = ({ task, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {task.Subject} {task.Status} {task.Priority} {task.Description} Priority: {task.Priority} Assigned: {task.Owner.name} Due: {new Date(task.Due_Date)?.toLocaleDateString()} ); }; export const ContactCard: React.FC = ({ contact, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {contact.Full_Name} Active {contact.Title} at {contact.Account_Name?.name || 'N/A'} {contact.Email} {contact.Phone} Source: {contact.Lead_Source} Last contact: {new Date(contact.Last_Activity_Time)?.toLocaleDateString()} ); }; export const DealCard: React.FC = ({ deal, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {deal.Deal_Name} {deal.Stage} {deal.Account_Name?.name || 'N/A'} ${deal.Amount?.toLocaleString()} Probability: {deal.Probability}% Contact: {deal.Contact_Name?.name || 'N/A'} Close date: {new Date(deal.Closing_Date)?.toLocaleDateString()} ); }; export const SalesOrderCard: React.FC = ({ salesOrder, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {salesOrder.Subject} {salesOrder.Status} SO: {salesOrder.SO_Number} {salesOrder.$currency_symbol}{salesOrder.Grand_Total?.toLocaleString()} Account: {salesOrder.Account_Name?.name || 'N/A'} {salesOrder.Billing_City}, {salesOrder.Billing_Country} Carrier: {salesOrder.Carrier} Created: {new Date(salesOrder.Created_Time)?.toLocaleDateString()} ); }; export const PurchaseOrderCard: React.FC = ({ purchaseOrder, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {purchaseOrder.Subject} {purchaseOrder.Status} PO: {purchaseOrder.PO_Number || 'N/A'} {purchaseOrder.$currency_symbol}{purchaseOrder.Grand_Total?.toLocaleString()} Vendor: {purchaseOrder.Vendor_Name?.name || 'N/A'} {purchaseOrder.Billing_City}, {purchaseOrder.Billing_Country} Carrier: {purchaseOrder.Carrier} PO Date: {new Date(purchaseOrder.PO_Date)?.toLocaleDateString()} ); }; export const InvoiceCard: React.FC = ({ invoice, onPress }) => { const { colors, fonts, shadows } = useTheme(); return ( {invoice.Subject} {invoice.Status} Invoice: {invoice.Invoice_Number} {invoice.$currency_symbol}{invoice.Grand_Total?.toLocaleString()} Account: {invoice.Account_Name?.name || 'N/A'} {invoice.Billing_City}, {invoice.Billing_Country} Due: {new Date(invoice.Due_Date)?.toLocaleDateString()} Invoice Date: {new Date(invoice.Invoice_Date)?.toLocaleDateString()} ); }; const styles = StyleSheet.create({ card: { borderRadius: 12, borderWidth: 1, marginBottom: 16, overflow: 'hidden', }, cardHeader: { padding: 16, paddingBottom: 12, }, cardTitleRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 4, }, cardTitle: { fontSize: 16, flex: 1, marginRight: 8, }, cardSubtitle: { fontSize: 14, }, statusBadge: { paddingHorizontal: 8, paddingVertical: 4, borderRadius: 12, }, statusText: { fontSize: 12, }, cardContent: { paddingHorizontal: 16, paddingBottom: 12, }, infoRow: { flexDirection: 'row', alignItems: 'center', marginBottom: 6, }, infoText: { marginLeft: 8, fontSize: 14, flex: 1, }, descriptionText: { fontSize: 14, marginBottom: 8, lineHeight: 20, }, cardFooter: { paddingHorizontal: 16, paddingVertical: 12, backgroundColor: '#F8F9FA', }, dateText: { fontSize: 12, }, });