import React, { useState, useEffect } from 'react'; import { Filter, Users, TrendingUp, AlertCircle, Clock, Search, Briefcase, PieChart, MapPin, User, Download, ArrowUpDown } from 'lucide-react'; // Sample data for demonstration const generateProspects = () => { const companies = ['TechCorp', 'DataSystems', 'CloudNine', 'QuantumTech', 'DigitalWorks', 'AeroTech', 'VisionAI']; const titles = ['Senior Engineer', 'Product Manager', 'VP of Engineering', 'Director of Product', 'CTO', 'Technical Lead', 'Senior Developer']; const cities = ['San Francisco, CA', 'Seattle, WA', 'Austin, TX', 'Boston, MA', 'New York, NY', 'Denver, CO', 'Chicago, IL']; const sourceTypes = ['Recent Layoff', 'Retirement', 'Layoff', 'Retirement', 'Layoff', 'Retirement', 'Layoff']; const prospects = []; for (let i = 0; i < 100; i++) { const firstName = ['John', 'Emma', 'Michael', 'Sophia', 'William', 'Olivia', 'James', 'Ava', 'Robert', 'Isabella'][Math.floor(Math.random() * 10)]; const lastName = ['Smith', 'Johnson', 'Williams', 'Jones', 'Brown', 'Davis', 'Miller', 'Wilson', 'Moore', 'Taylor'][Math.floor(Math.random() * 10)]; const companyIndex = Math.floor(Math.random() * companies.length); const daysAgo = Math.floor(Math.random() * 120); const date = new Date(); date.setDate(date.getDate() - daysAgo); prospects.push({ id: i + 1, name: `${firstName} ${lastName}`, title: titles[Math.floor(Math.random() * titles.length)], company: companies[companyIndex], location: cities[Math.floor(Math.random() * cities.length)], estimatedAssets: Math.floor(Math.random() * 5000000) + 200000, age: Math.floor(Math.random() * 30) + 35, eventDate: date, daysAgo, sourceType: sourceTypes[Math.floor(Math.random() * sourceTypes.length)], contactInfo: { email: `${firstName.toLowerCase()}.${lastName.toLowerCase()}@example.com`, phone: `(${Math.floor(Math.random() * 900) + 100}) ${Math.floor(Math.random() * 900) + 100}-${Math.floor(Math.random() * 9000) + 1000}` } }); } return prospects; }; const WealthManagementProspectTool = () => { const [prospects, setProspects] = useState([]); const [filteredProspects, setFilteredProspects] = useState([]); const [loading, setLoading] = useState(true); const [filters, setFilters] = useState({ ageMin: 35, ageMax: 70, assetsMin: 250000, daysAgo: 90, sourceType: 'all', searchTerm: '', location: '' }); const [sortConfig, setSortConfig] = useState({ key: 'daysAgo', direction: 'asc' }); const [selectedProspect, setSelectedProspect] = useState(null); const [stats, setStats] = useState({ totalProspects: 0, averageAssets: 0, layoffCount: 0, retirementCount: 0 }); // Load data useEffect(() => { setTimeout(() => { const data = generateProspects(); setProspects(data); setFilteredProspects(data); setLoading(false); // Calculate stats const layoffs = data.filter(p => p.sourceType === 'Layoff' || p.sourceType === 'Recent Layoff'); const retirements = data.filter(p => p.sourceType === 'Retirement'); const totalAssets = data.reduce((sum, p) => sum + p.estimatedAssets, 0); setStats({ totalProspects: data.length, averageAssets: Math.round(totalAssets / data.length), layoffCount: layoffs.length, retirementCount: retirements.length }); }, 1000); }, []); // Apply filters useEffect(() => { if (prospects.length === 0) return; let result = [...prospects]; // Age filter result = result.filter(p => p.age >= filters.ageMin && p.age <= filters.ageMax); // Assets filter result = result.filter(p => p.estimatedAssets >= filters.assetsMin); // Days ago filter result = result.filter(p => p.daysAgo <= filters.daysAgo); // Source type filter if (filters.sourceType !== 'all') { result = result.filter(p => p.sourceType === filters.sourceType); } // Location filter if (filters.location) { result = result.filter(p => p.location.toLowerCase().includes(filters.location.toLowerCase())); } // Search term filter if (filters.searchTerm) { const term = filters.searchTerm.toLowerCase(); result = result.filter(p => p.name.toLowerCase().includes(term) || p.company.toLowerCase().includes(term) || p.title.toLowerCase().includes(term) ); } // Sort results result.sort((a, b) => { if (sortConfig.key === 'name') { return sortConfig.direction === 'asc' ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); } else if (sortConfig.key === 'estimatedAssets') { return sortConfig.direction === 'asc' ? a.estimatedAssets - b.estimatedAssets : b.estimatedAssets - a.estimatedAssets; } else if (sortConfig.key === 'daysAgo') { return sortConfig.direction === 'asc' ? a.daysAgo - b.daysAgo : b.daysAgo - a.daysAgo; } return 0; }); setFilteredProspects(result); }, [prospects, filters, sortConfig]); const handleSort = (key) => { const direction = sortConfig.key === key && sortConfig.direction === 'asc' ? 'desc' : 'asc'; setSortConfig({ key, direction }); }; const formatCurrency = (value) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }).format(value); }; const handleFilterChange = (e) => { const { name, value } = e.target; setFilters(prev => ({ ...prev, [name]: name === 'ageMin' || name === 'ageMax' || name === 'assetsMin' || name === 'daysAgo' ? parseInt(value, 10) : value })); }; const handleProspectSelect = (prospect) => { setSelectedProspect(prospect); }; const handleExportToCRM = () => { alert(`Exported ${filteredProspects.length} prospects to CRM system`); }; const clearFilters = () => { setFilters({ ageMin: 35, ageMax: 70, assetsMin: 250000, daysAgo: 90, sourceType: 'all', searchTerm: '', location: '' }); }; return (
{/* Header */}

Wealth Management Prospect Tool

Last updated: May 6, 2025
{/* Dashboard Stats */}

Total Prospects

{stats.totalProspects}

Average Assets

{formatCurrency(stats.averageAssets)}

Recent Layoffs

{stats.layoffCount}

Recent Retirements

{stats.retirementCount}

{/* Filters Sidebar */}

Filters

{/* Main Content */}
{/* Search Bar */}
{/* Prospect List and Detail View */}
{/* Prospect List */}

Prospects ({filteredProspects.length})

Showing {Math.min(filteredProspects.length, 10)} of {filteredProspects.length}
{loading ? (
) : (
handleSort('name')}> Name
handleSort('estimatedAssets')}> Est. Assets
handleSort('daysAgo')}> Recency
{filteredProspects.slice(0, 10).map((prospect) => (
handleProspectSelect(prospect)} className={`p-3 border-b cursor-pointer hover:bg-blue-50 ${selectedProspect?.id === prospect.id ? 'bg-blue-50' : ''}`} >
{prospect.name}
{prospect.title}
{formatCurrency(prospect.estimatedAssets)}
{prospect.age} years old
{prospect.daysAgo} days ago
{prospect.sourceType}
))}
)}
{/* Prospect Detail */}
{selectedProspect ? (

{selectedProspect.name}

{selectedProspect.title} at {selectedProspect.company}

Personal

Age: {selectedProspect.age}
Email: {selectedProspect.contactInfo.email}
Phone: {selectedProspect.contactInfo.phone}

Financial

Estimated Assets: {formatCurrency(selectedProspect.estimatedAssets)}
Asset Confidence: Medium

Career

Company: {selectedProspect.company}
Position: {selectedProspect.title}

Location

{selectedProspect.location}

Life Event Details

Event Type: {selectedProspect.sourceType}
Date: {selectedProspect.eventDate.toLocaleDateString()} ({selectedProspect.daysAgo} days ago)
Data Source: {selectedProspect.sourceType.includes('Layoff') ? 'layoff.fyi' : 'Public Pension Records'}
) : (

Select a prospect to view details

)}
); }; export default WealthManagementProspectTool;