'use client' import { useEffect, useState, useMemo, useCallback } from 'react' import { useStore } from '@/lib/store' import { api, PortfolioDomain, PortfolioSummary, DomainHealthReport, HealthStatus } from '@/lib/api' import { Sidebar } from '@/components/Sidebar' import { Toast, useToast } from '@/components/Toast' import { Plus, Trash2, RefreshCw, Loader2, Briefcase, X, Target, ExternalLink, Gavel, TrendingUp, Menu, Settings, ShieldCheck, LogOut, Crown, Tag, Zap, Eye, ChevronUp, ChevronDown, DollarSign, Calendar, Edit3, CheckCircle, AlertCircle, Copy, Check, ArrowUpRight, Navigation, Coins, Activity, Save, FileText, Clock, Building2, CreditCard, MoreVertical, RotateCcw } from 'lucide-react' import clsx from 'clsx' import Link from 'next/link' import Image from 'next/image' // ============================================================================ // TYPES // ============================================================================ interface EditFormData { purchase_date: string purchase_price: string purchase_registrar: string registrar: string renewal_date: string renewal_cost: string auto_renew: boolean notes: string tags: string is_sold: boolean sale_date: string sale_price: string } // ============================================================================ // HELPERS // ============================================================================ const healthConfig: Record = { healthy: { label: 'Healthy', color: 'text-accent', bg: 'bg-accent/10', border: 'border-accent/20' }, weakening: { label: 'Weak', color: 'text-amber-400', bg: 'bg-amber-500/10', border: 'border-amber-500/20' }, parked: { label: 'Parked', color: 'text-blue-400', bg: 'bg-blue-500/10', border: 'border-blue-500/20' }, critical: { label: 'Critical', color: 'text-rose-400', bg: 'bg-rose-500/10', border: 'border-rose-500/20' }, unknown: { label: '—', color: 'text-white/30', bg: 'bg-white/5', border: 'border-white/10' }, } function getDaysUntil(date: string | null): number | null { if (!date) return null const d = new Date(date) const now = new Date() return Math.ceil((d.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)) } function formatDate(date: string | null): string { if (!date) return '—' return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) } function formatShortDate(date: string | null): string { if (!date) return '—' return new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: '2-digit' }) } function formatCurrency(value: number | null): string { if (value === null || value === undefined) return '—' return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }).format(value) } function formatROI(roi: number | null): string { if (roi === null || roi === undefined) return '—' const sign = roi >= 0 ? '+' : '' return `${sign}${roi.toFixed(0)}%` } // ============================================================================ // EDIT MODAL COMPONENT // ============================================================================ function EditModal({ domain, onClose, onSave }: { domain: PortfolioDomain onClose: () => void onSave: (data: Partial) => Promise }) { const [form, setForm] = useState({ purchase_date: domain.purchase_date?.split('T')[0] || '', purchase_price: domain.purchase_price?.toString() || '', purchase_registrar: domain.purchase_registrar || '', registrar: domain.registrar || '', renewal_date: domain.renewal_date?.split('T')[0] || '', renewal_cost: domain.renewal_cost?.toString() || '', auto_renew: domain.auto_renew || false, notes: domain.notes || '', tags: domain.tags || '', is_sold: domain.is_sold || false, sale_date: domain.sale_date?.split('T')[0] || '', sale_price: domain.sale_price?.toString() || '', }) const [saving, setSaving] = useState(false) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSaving(true) try { await onSave({ purchase_date: form.purchase_date || undefined, purchase_price: form.purchase_price ? parseFloat(form.purchase_price) : undefined, purchase_registrar: form.purchase_registrar || undefined, registrar: form.registrar || undefined, renewal_date: form.renewal_date || undefined, renewal_cost: form.renewal_cost ? parseFloat(form.renewal_cost) : undefined, auto_renew: form.auto_renew, notes: form.notes || undefined, tags: form.tags || undefined, is_sold: form.is_sold, sale_date: form.is_sold && form.sale_date ? form.sale_date : undefined, sale_price: form.is_sold && form.sale_price ? parseFloat(form.sale_price) : undefined, } as any) onClose() } finally { setSaving(false) } } return (
e.stopPropagation()} > {/* Header */}
Edit Domain

{domain.domain}

{/* Purchase Info */}
Purchase Information
setForm(f => ({ ...f, purchase_date: e.target.value }))} className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none" />
setForm(f => ({ ...f, purchase_price: e.target.value }))} placeholder="e.g. 500" className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none placeholder:text-white/20" />
setForm(f => ({ ...f, purchase_registrar: e.target.value }))} placeholder="e.g. GoDaddy Auctions, Sedo" className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none placeholder:text-white/20" />
{/* Current Registrar & Renewal */}
Registrar & Renewal
setForm(f => ({ ...f, registrar: e.target.value }))} placeholder="e.g. Namecheap" className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none placeholder:text-white/20" />
setForm(f => ({ ...f, renewal_cost: e.target.value }))} placeholder="e.g. 12" className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none placeholder:text-white/20" />
setForm(f => ({ ...f, renewal_date: e.target.value }))} className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none" />
{/* Notes & Tags */}
Notes & Tags
setForm(f => ({ ...f, tags: e.target.value }))} placeholder="e.g. premium, brandable, crypto" className="w-full px-3 py-2 bg-white/5 border border-white/10 text-white text-sm font-mono focus:border-accent/50 focus:outline-none placeholder:text-white/20" />