@burdenoff/microfe-housingvista 2026.709.2 → 2026.709.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/housingvista/HousingVistaRoutes.d.ts.map +1 -1
  2. package/dist/housingvista/HousingVistaRoutes.js +136 -37
  3. package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
  4. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +1 -1
  5. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -1
  6. package/dist/housingvista/hooks/useHousingVistaAnalytics.js +4 -4
  7. package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -1
  8. package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -1
  9. package/dist/housingvista/pages/amc/AMCManagementPage.js +62 -60
  10. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  11. package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -1
  12. package/dist/housingvista/pages/assets/AssetDetailPage.js +141 -138
  13. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  14. package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -1
  15. package/dist/housingvista/pages/assets/AssetManagementPage.js +193 -191
  16. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  17. package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -1
  18. package/dist/housingvista/pages/chat/ChatPage.js +115 -113
  19. package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
  20. package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -1
  21. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +152 -149
  22. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
  23. package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -1
  24. package/dist/housingvista/pages/finance/HomeLoansPage.js +141 -139
  25. package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
  26. package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -1
  27. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +290 -287
  28. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  29. package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -1
  30. package/dist/housingvista/pages/investments/InvestmentsPage.js +64 -62
  31. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  32. package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -1
  33. package/dist/housingvista/pages/legal/LegalPage.js +95 -93
  34. package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
  35. package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -1
  36. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +129 -126
  37. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
  38. package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
  39. package/dist/housingvista/pages/market/AreaInsightsPage.js +99 -97
  40. package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
  41. package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -1
  42. package/dist/housingvista/pages/market/MarketAnalyticsPage.js +138 -136
  43. package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
  44. package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -1
  45. package/dist/housingvista/pages/marketplace/MarketplacePage.js +99 -97
  46. package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
  47. package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -1
  48. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +137 -134
  49. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
  50. package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -1
  51. package/dist/housingvista/pages/offers/OffersPage.js +94 -92
  52. package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
  53. package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -1
  54. package/dist/housingvista/pages/properties/AddPropertyPage.js +280 -279
  55. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  56. package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -1
  57. package/dist/housingvista/pages/rental/RentalManagementPage.js +153 -151
  58. package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
  59. package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -1
  60. package/dist/housingvista/pages/settings/ProfilePage.js +52 -50
  61. package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
  62. package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -1
  63. package/dist/housingvista/pages/settings/SettingsPage.js +54 -52
  64. package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
  65. package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
  66. package/dist/housingvista/pages/shortlist/ShortlistPage.js +43 -41
  67. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  68. package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -1
  69. package/dist/housingvista/pages/transactions/TransactionDetailPage.js +211 -208
  70. package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
  71. package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
  72. package/dist/housingvista/pages/transactions/TransactionsPage.js +85 -83
  73. package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
  74. package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -1
  75. package/dist/housingvista/pages/verification/VerificationDetailPage.js +25 -22
  76. package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
  77. package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -1
  78. package/dist/housingvista/pages/verification/VerificationPage.js +123 -121
  79. package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
  80. package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -1
  81. package/dist/housingvista/pages/viewings/ViewingsPage.js +128 -126
  82. package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentDetailPage.js","names":[],"sources":["../../../../src/housingvista/pages/investments/InvestmentDetailPage.tsx"],"sourcesContent":["import { useState, type FormEvent } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n ArrowLeft,\n Building,\n DollarSign,\n TrendingUp,\n Calendar,\n MapPin,\n Percent,\n Trash2,\n Users,\n Target,\n Clock,\n ArrowUpRight,\n ArrowDownRight,\n BarChart3,\n} from 'lucide-react';\nimport { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport {\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n Button,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { Breadcrumbs, StatCard, StatusBadge, EmptyState, ChartCard, LoadingSkeleton } from '../../components';\nimport { useInvestment, useUpdateInvestment, useDeleteInvestment } from '../../hooks';\nimport { notify } from '../../lib/toast';\nimport { cn, formatCurrency, formatDate } from '../../utils/helpers';\nimport type { InvestmentStatus } from '../../types';\n\nconst inputClass =\n 'h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\n\nconst investmentTypeOptions: { value: string; label: string }[] = [\n { value: 'full_ownership', label: 'Full ownership' },\n { value: 'fractional', label: 'Fractional' },\n { value: 'reits', label: 'REITs' },\n { value: 'fund', label: 'Fund' },\n];\n\nconst investmentStatusOptions: { value: string; label: string }[] = [\n { value: 'draft', label: 'Draft' },\n { value: 'open', label: 'Open' },\n { value: 'funding', label: 'Funding' },\n { value: 'active', label: 'Active' },\n { value: 'mature', label: 'Mature' },\n { value: 'closed', label: 'Closed' },\n];\n\nconst riskOptions: { value: string; label: string }[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\n// ---------------------------------------------------------------------------\n// Safe accessors — `investors` and `returns` are opaque JSON columns and the\n// date fields arrive as ISO strings at runtime, so every access is guarded\n// against missing/wrong-shaped data rather than trusting the domain type.\n// ---------------------------------------------------------------------------\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction toText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction toIsoString(value: unknown): string {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? '' : value.toISOString();\n if (typeof value === 'string') return value;\n return '';\n}\n\nfunction toTimestamp(value: unknown): number | null {\n const iso = toIsoString(value);\n if (!iso) return null;\n const ms = new Date(iso).getTime();\n return Number.isNaN(ms) ? null : ms;\n}\n\nfunction formatDateSafe(value: unknown): string {\n const iso = toIsoString(value);\n if (!iso) return '—';\n const ms = new Date(iso).getTime();\n return Number.isNaN(ms) ? '—' : formatDate(iso);\n}\n\n/** Normalise an ISO/date value to the `yyyy-mm-dd` string a date input expects. */\nfunction toDateInput(value: unknown): string {\n const ms = toTimestamp(value);\n return ms === null ? '' : new Date(ms).toISOString().slice(0, 10);\n}\n\nfunction personName(value: unknown): string {\n const rec = asRecord(value);\n const full = `${toText(rec.firstName)} ${toText(rec.lastName)}`.trim();\n return full || toText(rec.name) || toText(rec.email) || 'Investor';\n}\n\nfunction getStatusVariant(status: InvestmentStatus): 'success' | 'warning' | 'error' | 'info' | 'muted' | 'default' {\n switch (status) {\n case 'active':\n return 'success';\n case 'funding':\n return 'warning';\n case 'closed':\n case 'mature':\n return 'info';\n case 'draft':\n case 'open':\n return 'muted';\n default:\n return 'default';\n }\n}\n\nfunction getReturnColor(returnValue: number) {\n if (returnValue > 0) return 'text-status-success-text';\n if (returnValue < 0) return 'text-status-error-text';\n return 'text-text-secondary';\n}\n\nexport function InvestmentDetailPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const { data: investment, loading } = useInvestment(id);\n const { updateInvestment, loading: updating } = useUpdateInvestment();\n const { deleteInvestment, loading: deleting } = useDeleteInvestment();\n const [activeTab, setActiveTab] = useState<'overview' | 'returns'>('overview');\n\n // Manage / delete dialog state\n const [manageOpen, setManageOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [editTitle, setEditTitle] = useState('');\n const [editStatus, setEditStatus] = useState<string>('draft');\n const [editRisk, setEditRisk] = useState<string>('medium');\n const [editType, setEditType] = useState<string>('full_ownership');\n const [editTotalValue, setEditTotalValue] = useState('');\n const [editStart, setEditStart] = useState('');\n const [editMaturity, setEditMaturity] = useState('');\n\n if (loading) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <LoadingSkeleton variant=\"detail\" />\n </div>\n );\n }\n\n if (!investment) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Building className=\"h-16 w-16\" />}\n title=\"Investment Not Found\"\n description=\"The investment you're looking for doesn't exist or has been removed.\"\n action={\n <button\n onClick={() => navigate('../investments')}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Investments\n </button>\n }\n />\n </div>\n );\n }\n\n // Opaque JSON columns — normalise to typed, guarded view models.\n const investorsRaw: unknown[] = Array.isArray(investment.investors) ? investment.investors : [];\n const investors = investorsRaw.map((raw) => {\n const rec = asRecord(raw);\n return {\n name: personName(rec.user),\n investmentAmount: toNumber(rec.investmentAmount),\n shares: toNumber(rec.shares),\n joinedAt: rec.joinedAt,\n };\n });\n\n const returnsRaw: unknown[] = Array.isArray(investment.returns) ? investment.returns : [];\n const returns = returnsRaw.map((raw, index) => {\n const rec = asRecord(raw);\n return {\n id: toText(rec.id) || `return-${index}`,\n type: toText(rec.type) || 'return',\n amount: toNumber(rec.amount),\n date: rec.date,\n investorName: personName(rec.investor),\n };\n });\n\n // Real performance series: cumulative returns paid out over time, ordered by date.\n const chartData = returns\n .map((r) => ({ ts: toTimestamp(r.date) ?? 0, label: formatDateSafe(r.date), amount: r.amount }))\n .sort((a, b) => a.ts - b.ts)\n .reduce<{ label: string; amount: number; cumulative: number }[]>((acc, item) => {\n const previous = acc.length > 0 ? acc[acc.length - 1].cumulative : 0;\n acc.push({ label: item.label, amount: item.amount, cumulative: previous + item.amount });\n return acc;\n }, []);\n\n const property = asRecord(investment.property);\n const propertyTitle = toText(property.title) || 'Investment';\n const propertyLocation = asRecord(property.location);\n const propertyType = toText(property.type);\n const locationParts = [toText(propertyLocation.city), toText(propertyLocation.state)].filter(Boolean);\n const neighborhood = toText(propertyLocation.neighborhood);\n\n const totalInvested = investors.reduce((s, i) => s + i.investmentAmount, 0);\n const totalReturns = returns.reduce((s, r) => s + r.amount, 0);\n const currentValue = totalInvested + totalReturns;\n const returnPercentage = totalInvested > 0 ? (totalReturns / totalInvested) * 100 : 0;\n\n const startMs = toTimestamp(investment.startDate);\n const maturityMs = toTimestamp(investment.maturityDate);\n const durationMonths =\n startMs !== null && maturityMs !== null\n ? Math.max(0, Math.round((maturityMs - startMs) / (1000 * 60 * 60 * 24 * 30)))\n : null;\n\n const riskLevel = toText(investment.riskLevel);\n const riskLabel = riskLevel ? riskLevel.charAt(0).toUpperCase() + riskLevel.slice(1) : 'Unknown';\n const investmentTypeLabel = toText(investment.investmentType).replace('_', ' ') || 'Investment';\n\n const tabs = [\n { id: 'overview' as const, label: 'Overview', icon: Building },\n { id: 'returns' as const, label: 'Returns History', icon: BarChart3 },\n ];\n\n const openManage = () => {\n setEditTitle(toText(investment.title) || propertyTitle);\n setEditStatus(toText(investment.status) || 'draft');\n setEditRisk(toText(investment.riskLevel) || 'medium');\n setEditType(toText(investment.investmentType) || 'full_ownership');\n const value = toNumber(investment.totalValue);\n setEditTotalValue(value > 0 ? String(value) : '');\n setEditStart(toDateInput(investment.startDate));\n setEditMaturity(toDateInput(investment.maturityDate));\n setManageOpen(true);\n };\n\n const handleUpdate = async (e: FormEvent) => {\n e.preventDefault();\n if (!id) return;\n if (!editTitle.trim()) {\n notify.warning('Enter an investment title');\n return;\n }\n const value = Number(editTotalValue);\n if (!Number.isFinite(value) || value <= 0) {\n notify.warning('Enter a valid total value');\n return;\n }\n try {\n await updateInvestment(id, {\n title: editTitle.trim(),\n status: editStatus,\n riskLevel: editRisk,\n investmentType: editType,\n totalValue: value,\n startDate: editStart ? new Date(editStart).toISOString() : undefined,\n maturityDate: editMaturity ? new Date(editMaturity).toISOString() : undefined,\n });\n notify.success('Investment updated', `${editTitle.trim()} was saved.`);\n setManageOpen(false);\n } catch (err) {\n notify.error('Could not update investment', (err as Error).message);\n }\n };\n\n const handleDelete = async () => {\n if (!id) return;\n try {\n await deleteInvestment(id);\n notify.success('Investment deleted');\n setDeleteOpen(false);\n navigate('../investments');\n } catch (err) {\n notify.error('Could not delete investment', (err as Error).message);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n {/* Breadcrumbs */}\n <Breadcrumbs items={[{ label: 'Investments', href: '../investments' }, { label: propertyTitle }]} />\n\n {/* Header */}\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div>\n <button\n onClick={() => navigate('../investments')}\n className=\"mb-2 inline-flex items-center gap-2 rounded-md px-2 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Investments\n </button>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{propertyTitle}</h1>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusBadge label={investment.status} variant={getStatusVariant(investment.status)} />\n <StatusBadge label={investmentTypeLabel} variant=\"muted\" />\n <StatusBadge label={`${riskLabel} Risk`} variant=\"muted\" />\n </div>\n </div>\n <div className=\"flex gap-3\">\n <button\n onClick={openManage}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <DollarSign className=\"h-4 w-4\" />\n Manage Investment\n </button>\n <button\n onClick={() => setDeleteOpen(true)}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle\"\n >\n <Trash2 className=\"h-4 w-4\" />\n Delete\n </button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n A full breakdown of one investment — how much was put in, what it is worth today, every return paid out, and the\n co-investors. Use it to judge performance and decide whether to hold, add, or exit.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-investment-detail\"\n steps={[\n {\n id: 'returns',\n label: 'Review returns history',\n description: 'See every distribution paid and the performance trend.',\n onClick: () => setActiveTab('returns'),\n },\n {\n id: 'manage',\n label: 'Manage this investment',\n description: 'Update the title, status, risk level, or total value.',\n onClick: openManage,\n },\n {\n id: 'back',\n label: 'Back to all investments',\n description: 'Return to your full investment portfolio.',\n onClick: () => navigate('../investments'),\n },\n ]}\n />\n\n {/* Key Metrics — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label=\"Invested Amount\"\n value={totalInvested}\n prefix=\"$\"\n icon={<DollarSign className=\"h-4 w-4\" />}\n />\n <StatCard label=\"Current Value\" value={currentValue} prefix=\"$\" icon={<TrendingUp className=\"h-4 w-4\" />} />\n <StatCard label=\"Total Returns\" value={totalReturns} prefix=\"$\" icon={<Percent className=\"h-4 w-4\" />} />\n <StatCard label=\"Risk Level\" value={riskLabel} icon={<Target className=\"h-4 w-4\" />} />\n </div>\n </EmphasisPanel>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex gap-0 border-b border-border-subtle\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 border-b-2 px-4 py-3 text-sm font-medium transition-colors',\n activeTab === tab.id\n ? 'border-action-primary-border text-text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </div>\n\n <div className=\"p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n {/* Investment Details */}\n <div>\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">Investment Details</h3>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4 space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Investment Type</span>\n <span className=\"font-medium capitalize text-text-primary\">{investmentTypeLabel}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Property</span>\n <span className=\"font-medium text-text-primary\">{propertyTitle}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Total Property Value</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(toNumber(investment.totalValue))}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Risk Level</span>\n <span className=\"font-medium capitalize text-text-primary\">{riskLabel}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Start Date</span>\n <span className=\"font-medium text-text-primary\">{formatDateSafe(investment.startDate)}</span>\n </div>\n {investment.maturityDate && (\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Maturity Date</span>\n <span className=\"font-medium text-text-primary\">{formatDateSafe(investment.maturityDate)}</span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-3\">\n <span className=\"font-medium text-text-secondary\">Total Return</span>\n <div className={cn('font-bold', getReturnColor(totalReturns))}>\n <div className=\"flex items-center gap-1\">\n {totalReturns > 0 && <ArrowUpRight className=\"h-4 w-4\" />}\n {totalReturns < 0 && <ArrowDownRight className=\"h-4 w-4\" />}\n {formatCurrency(totalReturns)} ({returnPercentage.toFixed(1)}%)\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Property Info */}\n <div>\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">Property Information</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Building className=\"h-4 w-4\" />\n Property Type\n </div>\n <div className=\"font-semibold capitalize text-text-primary\">\n {propertyType ? propertyType.replace('_', ' ') : 'Not specified'}\n </div>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <MapPin className=\"h-4 w-4\" />\n Location\n </div>\n <div className=\"font-semibold text-text-primary\">\n {locationParts.length > 0 ? locationParts.join(', ') : 'Location not available'}\n </div>\n {neighborhood && <div className=\"text-sm text-text-secondary\">{neighborhood}</div>}\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Calendar className=\"h-4 w-4\" />\n Start Date\n </div>\n <div className=\"font-semibold text-text-primary\">{formatDateSafe(investment.startDate)}</div>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Duration\n </div>\n <div className=\"font-semibold text-text-primary\">\n {durationMonths !== null ? `${durationMonths} months` : 'Ongoing'}\n </div>\n </div>\n </div>\n </div>\n\n {/* Investors */}\n {investors.length > 0 && (\n <div>\n <h3 className=\"mb-4 flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Users className=\"h-5 w-5\" />\n Investors ({investors.length})\n </h3>\n <div className=\"space-y-2\">\n {investors.map((investor, index) => (\n <div key={index} className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-4\">\n <div>\n <div className=\"font-medium text-text-primary\">{investor.name}</div>\n <div className=\"text-sm text-text-secondary\">\n Invested: {formatCurrency(investor.investmentAmount)}\n </div>\n </div>\n <div className=\"text-right\">\n <div className=\"font-semibold text-text-primary\">{investor.shares}% share</div>\n <div className=\"text-sm text-text-secondary\">Joined: {formatDateSafe(investor.joinedAt)}</div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Returns Tab */}\n {activeTab === 'returns' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Returns History</h3>\n <div className=\"text-right\">\n <div className=\"text-sm text-text-secondary\">Total Returns</div>\n <div className={cn('text-2xl font-bold', getReturnColor(totalReturns))}>\n {formatCurrency(totalReturns)}\n </div>\n </div>\n </div>\n\n {returns.length > 0 ? (\n <div className=\"space-y-6\">\n {/* Real performance chart driven by the investment's returns JSON */}\n <ChartCard title=\"Performance Over Time\" description=\"Cumulative returns paid out over time\">\n <div className=\"h-64\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={chartData}>\n <defs>\n <linearGradient id=\"returnsGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor=\"var(--color-chart-1)\" stopOpacity={0.3} />\n <stop offset=\"95%\" stopColor=\"var(--color-chart-1)\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-border\" />\n <XAxis dataKey=\"label\" tick={{ fontSize: 11 }} className=\"text-text-secondary\" />\n <YAxis\n tick={{ fontSize: 11 }}\n tickFormatter={(v: number) => `$${(v / 1000).toFixed(0)}K`}\n className=\"text-text-secondary\"\n />\n <Tooltip\n formatter={(value: number) => [formatCurrency(value), 'Cumulative returns']}\n labelClassName=\"text-text-primary\"\n />\n <Area\n type=\"monotone\"\n dataKey=\"cumulative\"\n stroke=\"var(--color-chart-1)\"\n fill=\"url(#returnsGrad)\"\n strokeWidth={2}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </ChartCard>\n\n <div className=\"space-y-3\">\n {returns.map((returnItem) => (\n <div\n key={returnItem.id}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-4\"\n >\n <div>\n <div className=\"font-medium capitalize text-text-primary\">{returnItem.type}</div>\n <div className=\"text-sm text-text-secondary\">{formatDateSafe(returnItem.date)}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"font-bold text-status-success-text\">+{formatCurrency(returnItem.amount)}</div>\n <div className=\"text-sm text-text-secondary\">{returnItem.investorName}</div>\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No returns recorded yet\"\n description=\"Returns will appear here once distributions are made.\"\n />\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Manage investment dialog */}\n <ResponsiveDialog open={manageOpen} onOpenChange={setManageOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-md\">\n <form onSubmit={handleUpdate}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Manage investment</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the details of this holding. Changes apply immediately.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3 py-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Title *</label>\n <input\n type=\"text\"\n required\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n className={inputClass}\n />\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Type</label>\n <select value={editType} onChange={(e) => setEditType(e.target.value)} className={inputClass}>\n {investmentTypeOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Status</label>\n <select value={editStatus} onChange={(e) => setEditStatus(e.target.value)} className={inputClass}>\n {investmentStatusOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Risk level</label>\n <select value={editRisk} onChange={(e) => setEditRisk(e.target.value)} className={inputClass}>\n {riskOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Total value (USD) *</label>\n <input\n type=\"number\"\n required\n min={1}\n step=\"any\"\n value={editTotalValue}\n onChange={(e) => setEditTotalValue(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Start date</label>\n <input\n type=\"date\"\n value={editStart}\n onChange={(e) => setEditStart(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Maturity date</label>\n <input\n type=\"date\"\n value={editMaturity}\n onChange={(e) => setEditMaturity(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setManageOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating || !editTitle.trim() || !editTotalValue}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete confirmation dialog */}\n <ResponsiveDialog open={deleteOpen} onOpenChange={setDeleteOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-sm\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete investment?</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This permanently removes “{propertyTitle}” from your portfolio. This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setDeleteOpen(false)}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={handleDelete} disabled={deleting}>\n {deleting ? 'Deleting…' : 'Delete investment'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InvestmentDetailPage.js","names":[],"sources":["../../../../src/housingvista/pages/investments/InvestmentDetailPage.tsx"],"sourcesContent":["import { useState, type FormEvent } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n ArrowLeft,\n Building,\n DollarSign,\n TrendingUp,\n Calendar,\n MapPin,\n Percent,\n Trash2,\n Users,\n Target,\n Clock,\n ArrowUpRight,\n ArrowDownRight,\n BarChart3,\n} from 'lucide-react';\nimport { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';\nimport {\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n Button,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { Breadcrumbs, StatCard, StatusBadge, EmptyState, ChartCard, LoadingSkeleton } from '../../components';\nimport { useInvestment, useUpdateInvestment, useDeleteInvestment } from '../../hooks';\nimport { notify } from '../../lib/toast';\nimport { cn, formatCurrency, formatDate } from '../../utils/helpers';\nimport type { InvestmentStatus } from '../../types';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\nconst inputClass =\n 'h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\n\nconst investmentTypeOptions: { value: string; label: string }[] = [\n { value: 'full_ownership', label: 'Full ownership' },\n { value: 'fractional', label: 'Fractional' },\n { value: 'reits', label: 'REITs' },\n { value: 'fund', label: 'Fund' },\n];\n\nconst investmentStatusOptions: { value: string; label: string }[] = [\n { value: 'draft', label: 'Draft' },\n { value: 'open', label: 'Open' },\n { value: 'funding', label: 'Funding' },\n { value: 'active', label: 'Active' },\n { value: 'mature', label: 'Mature' },\n { value: 'closed', label: 'Closed' },\n];\n\nconst riskOptions: { value: string; label: string }[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\n// ---------------------------------------------------------------------------\n// Safe accessors — `investors` and `returns` are opaque JSON columns and the\n// date fields arrive as ISO strings at runtime, so every access is guarded\n// against missing/wrong-shaped data rather than trusting the domain type.\n// ---------------------------------------------------------------------------\ntype JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord {\n return typeof value === 'object' && value !== null ? (value as JsonRecord) : {};\n}\n\nfunction toNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction toText(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction toIsoString(value: unknown): string {\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? '' : value.toISOString();\n if (typeof value === 'string') return value;\n return '';\n}\n\nfunction toTimestamp(value: unknown): number | null {\n const iso = toIsoString(value);\n if (!iso) return null;\n const ms = new Date(iso).getTime();\n return Number.isNaN(ms) ? null : ms;\n}\n\nfunction formatDateSafe(value: unknown): string {\n const iso = toIsoString(value);\n if (!iso) return '—';\n const ms = new Date(iso).getTime();\n return Number.isNaN(ms) ? '—' : formatDate(iso);\n}\n\n/** Normalise an ISO/date value to the `yyyy-mm-dd` string a date input expects. */\nfunction toDateInput(value: unknown): string {\n const ms = toTimestamp(value);\n return ms === null ? '' : new Date(ms).toISOString().slice(0, 10);\n}\n\nfunction personName(value: unknown): string {\n const rec = asRecord(value);\n const full = `${toText(rec.firstName)} ${toText(rec.lastName)}`.trim();\n return full || toText(rec.name) || toText(rec.email) || 'Investor';\n}\n\nfunction getStatusVariant(status: InvestmentStatus): 'success' | 'warning' | 'error' | 'info' | 'muted' | 'default' {\n switch (status) {\n case 'active':\n return 'success';\n case 'funding':\n return 'warning';\n case 'closed':\n case 'mature':\n return 'info';\n case 'draft':\n case 'open':\n return 'muted';\n default:\n return 'default';\n }\n}\n\nfunction getReturnColor(returnValue: number) {\n if (returnValue > 0) return 'text-status-success-text';\n if (returnValue < 0) return 'text-status-error-text';\n return 'text-text-secondary';\n}\n\nexport function InvestmentDetailPage() {\n const { id } = useParams<{ id: string }>();\n\n useTrackPageView('housingvista.investment.viewed', id);\n const navigate = useNavigate();\n const { data: investment, loading } = useInvestment(id);\n const { updateInvestment, loading: updating } = useUpdateInvestment();\n const { deleteInvestment, loading: deleting } = useDeleteInvestment();\n const [activeTab, setActiveTab] = useState<'overview' | 'returns'>('overview');\n\n // Manage / delete dialog state\n const [manageOpen, setManageOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [editTitle, setEditTitle] = useState('');\n const [editStatus, setEditStatus] = useState<string>('draft');\n const [editRisk, setEditRisk] = useState<string>('medium');\n const [editType, setEditType] = useState<string>('full_ownership');\n const [editTotalValue, setEditTotalValue] = useState('');\n const [editStart, setEditStart] = useState('');\n const [editMaturity, setEditMaturity] = useState('');\n\n if (loading) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <LoadingSkeleton variant=\"detail\" />\n </div>\n );\n }\n\n if (!investment) {\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Building className=\"h-16 w-16\" />}\n title=\"Investment Not Found\"\n description=\"The investment you're looking for doesn't exist or has been removed.\"\n action={\n <button\n onClick={() => navigate('../investments')}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Investments\n </button>\n }\n />\n </div>\n );\n }\n\n // Opaque JSON columns — normalise to typed, guarded view models.\n const investorsRaw: unknown[] = Array.isArray(investment.investors) ? investment.investors : [];\n const investors = investorsRaw.map((raw) => {\n const rec = asRecord(raw);\n return {\n name: personName(rec.user),\n investmentAmount: toNumber(rec.investmentAmount),\n shares: toNumber(rec.shares),\n joinedAt: rec.joinedAt,\n };\n });\n\n const returnsRaw: unknown[] = Array.isArray(investment.returns) ? investment.returns : [];\n const returns = returnsRaw.map((raw, index) => {\n const rec = asRecord(raw);\n return {\n id: toText(rec.id) || `return-${index}`,\n type: toText(rec.type) || 'return',\n amount: toNumber(rec.amount),\n date: rec.date,\n investorName: personName(rec.investor),\n };\n });\n\n // Real performance series: cumulative returns paid out over time, ordered by date.\n const chartData = returns\n .map((r) => ({ ts: toTimestamp(r.date) ?? 0, label: formatDateSafe(r.date), amount: r.amount }))\n .sort((a, b) => a.ts - b.ts)\n .reduce<{ label: string; amount: number; cumulative: number }[]>((acc, item) => {\n const previous = acc.length > 0 ? acc[acc.length - 1].cumulative : 0;\n acc.push({ label: item.label, amount: item.amount, cumulative: previous + item.amount });\n return acc;\n }, []);\n\n const property = asRecord(investment.property);\n const propertyTitle = toText(property.title) || 'Investment';\n const propertyLocation = asRecord(property.location);\n const propertyType = toText(property.type);\n const locationParts = [toText(propertyLocation.city), toText(propertyLocation.state)].filter(Boolean);\n const neighborhood = toText(propertyLocation.neighborhood);\n\n const totalInvested = investors.reduce((s, i) => s + i.investmentAmount, 0);\n const totalReturns = returns.reduce((s, r) => s + r.amount, 0);\n const currentValue = totalInvested + totalReturns;\n const returnPercentage = totalInvested > 0 ? (totalReturns / totalInvested) * 100 : 0;\n\n const startMs = toTimestamp(investment.startDate);\n const maturityMs = toTimestamp(investment.maturityDate);\n const durationMonths =\n startMs !== null && maturityMs !== null\n ? Math.max(0, Math.round((maturityMs - startMs) / (1000 * 60 * 60 * 24 * 30)))\n : null;\n\n const riskLevel = toText(investment.riskLevel);\n const riskLabel = riskLevel ? riskLevel.charAt(0).toUpperCase() + riskLevel.slice(1) : 'Unknown';\n const investmentTypeLabel = toText(investment.investmentType).replace('_', ' ') || 'Investment';\n\n const tabs = [\n { id: 'overview' as const, label: 'Overview', icon: Building },\n { id: 'returns' as const, label: 'Returns History', icon: BarChart3 },\n ];\n\n const openManage = () => {\n setEditTitle(toText(investment.title) || propertyTitle);\n setEditStatus(toText(investment.status) || 'draft');\n setEditRisk(toText(investment.riskLevel) || 'medium');\n setEditType(toText(investment.investmentType) || 'full_ownership');\n const value = toNumber(investment.totalValue);\n setEditTotalValue(value > 0 ? String(value) : '');\n setEditStart(toDateInput(investment.startDate));\n setEditMaturity(toDateInput(investment.maturityDate));\n setManageOpen(true);\n };\n\n const handleUpdate = async (e: FormEvent) => {\n e.preventDefault();\n if (!id) return;\n if (!editTitle.trim()) {\n notify.warning('Enter an investment title');\n return;\n }\n const value = Number(editTotalValue);\n if (!Number.isFinite(value) || value <= 0) {\n notify.warning('Enter a valid total value');\n return;\n }\n try {\n await updateInvestment(id, {\n title: editTitle.trim(),\n status: editStatus,\n riskLevel: editRisk,\n investmentType: editType,\n totalValue: value,\n startDate: editStart ? new Date(editStart).toISOString() : undefined,\n maturityDate: editMaturity ? new Date(editMaturity).toISOString() : undefined,\n });\n notify.success('Investment updated', `${editTitle.trim()} was saved.`);\n setManageOpen(false);\n } catch (err) {\n notify.error('Could not update investment', (err as Error).message);\n }\n };\n\n const handleDelete = async () => {\n if (!id) return;\n try {\n await deleteInvestment(id);\n notify.success('Investment deleted');\n setDeleteOpen(false);\n navigate('../investments');\n } catch (err) {\n notify.error('Could not delete investment', (err as Error).message);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n {/* Breadcrumbs */}\n <Breadcrumbs items={[{ label: 'Investments', href: '../investments' }, { label: propertyTitle }]} />\n\n {/* Header */}\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div>\n <button\n onClick={() => navigate('../investments')}\n className=\"mb-2 inline-flex items-center gap-2 rounded-md px-2 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Investments\n </button>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{propertyTitle}</h1>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusBadge label={investment.status} variant={getStatusVariant(investment.status)} />\n <StatusBadge label={investmentTypeLabel} variant=\"muted\" />\n <StatusBadge label={`${riskLabel} Risk`} variant=\"muted\" />\n </div>\n </div>\n <div className=\"flex gap-3\">\n <button\n onClick={openManage}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <DollarSign className=\"h-4 w-4\" />\n Manage Investment\n </button>\n <button\n onClick={() => setDeleteOpen(true)}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle\"\n >\n <Trash2 className=\"h-4 w-4\" />\n Delete\n </button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n A full breakdown of one investment — how much was put in, what it is worth today, every return paid out, and the\n co-investors. Use it to judge performance and decide whether to hold, add, or exit.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-investment-detail\"\n steps={[\n {\n id: 'returns',\n label: 'Review returns history',\n description: 'See every distribution paid and the performance trend.',\n onClick: () => setActiveTab('returns'),\n },\n {\n id: 'manage',\n label: 'Manage this investment',\n description: 'Update the title, status, risk level, or total value.',\n onClick: openManage,\n },\n {\n id: 'back',\n label: 'Back to all investments',\n description: 'Return to your full investment portfolio.',\n onClick: () => navigate('../investments'),\n },\n ]}\n />\n\n {/* Key Metrics — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label=\"Invested Amount\"\n value={totalInvested}\n prefix=\"$\"\n icon={<DollarSign className=\"h-4 w-4\" />}\n />\n <StatCard label=\"Current Value\" value={currentValue} prefix=\"$\" icon={<TrendingUp className=\"h-4 w-4\" />} />\n <StatCard label=\"Total Returns\" value={totalReturns} prefix=\"$\" icon={<Percent className=\"h-4 w-4\" />} />\n <StatCard label=\"Risk Level\" value={riskLabel} icon={<Target className=\"h-4 w-4\" />} />\n </div>\n </EmphasisPanel>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex gap-0 border-b border-border-subtle\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 border-b-2 px-4 py-3 text-sm font-medium transition-colors',\n activeTab === tab.id\n ? 'border-action-primary-border text-text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </div>\n\n <div className=\"p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n {/* Investment Details */}\n <div>\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">Investment Details</h3>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4 space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Investment Type</span>\n <span className=\"font-medium capitalize text-text-primary\">{investmentTypeLabel}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Property</span>\n <span className=\"font-medium text-text-primary\">{propertyTitle}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Total Property Value</span>\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(toNumber(investment.totalValue))}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Risk Level</span>\n <span className=\"font-medium capitalize text-text-primary\">{riskLabel}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Start Date</span>\n <span className=\"font-medium text-text-primary\">{formatDateSafe(investment.startDate)}</span>\n </div>\n {investment.maturityDate && (\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Maturity Date</span>\n <span className=\"font-medium text-text-primary\">{formatDateSafe(investment.maturityDate)}</span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-3\">\n <span className=\"font-medium text-text-secondary\">Total Return</span>\n <div className={cn('font-bold', getReturnColor(totalReturns))}>\n <div className=\"flex items-center gap-1\">\n {totalReturns > 0 && <ArrowUpRight className=\"h-4 w-4\" />}\n {totalReturns < 0 && <ArrowDownRight className=\"h-4 w-4\" />}\n {formatCurrency(totalReturns)} ({returnPercentage.toFixed(1)}%)\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Property Info */}\n <div>\n <h3 className=\"mb-4 text-lg font-semibold text-text-primary\">Property Information</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Building className=\"h-4 w-4\" />\n Property Type\n </div>\n <div className=\"font-semibold capitalize text-text-primary\">\n {propertyType ? propertyType.replace('_', ' ') : 'Not specified'}\n </div>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <MapPin className=\"h-4 w-4\" />\n Location\n </div>\n <div className=\"font-semibold text-text-primary\">\n {locationParts.length > 0 ? locationParts.join(', ') : 'Location not available'}\n </div>\n {neighborhood && <div className=\"text-sm text-text-secondary\">{neighborhood}</div>}\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Calendar className=\"h-4 w-4\" />\n Start Date\n </div>\n <div className=\"font-semibold text-text-primary\">{formatDateSafe(investment.startDate)}</div>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <div className=\"mb-1 flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Duration\n </div>\n <div className=\"font-semibold text-text-primary\">\n {durationMonths !== null ? `${durationMonths} months` : 'Ongoing'}\n </div>\n </div>\n </div>\n </div>\n\n {/* Investors */}\n {investors.length > 0 && (\n <div>\n <h3 className=\"mb-4 flex items-center gap-2 text-lg font-semibold text-text-primary\">\n <Users className=\"h-5 w-5\" />\n Investors ({investors.length})\n </h3>\n <div className=\"space-y-2\">\n {investors.map((investor, index) => (\n <div key={index} className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-4\">\n <div>\n <div className=\"font-medium text-text-primary\">{investor.name}</div>\n <div className=\"text-sm text-text-secondary\">\n Invested: {formatCurrency(investor.investmentAmount)}\n </div>\n </div>\n <div className=\"text-right\">\n <div className=\"font-semibold text-text-primary\">{investor.shares}% share</div>\n <div className=\"text-sm text-text-secondary\">Joined: {formatDateSafe(investor.joinedAt)}</div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Returns Tab */}\n {activeTab === 'returns' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Returns History</h3>\n <div className=\"text-right\">\n <div className=\"text-sm text-text-secondary\">Total Returns</div>\n <div className={cn('text-2xl font-bold', getReturnColor(totalReturns))}>\n {formatCurrency(totalReturns)}\n </div>\n </div>\n </div>\n\n {returns.length > 0 ? (\n <div className=\"space-y-6\">\n {/* Real performance chart driven by the investment's returns JSON */}\n <ChartCard title=\"Performance Over Time\" description=\"Cumulative returns paid out over time\">\n <div className=\"h-64\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={chartData}>\n <defs>\n <linearGradient id=\"returnsGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor=\"var(--color-chart-1)\" stopOpacity={0.3} />\n <stop offset=\"95%\" stopColor=\"var(--color-chart-1)\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-border\" />\n <XAxis dataKey=\"label\" tick={{ fontSize: 11 }} className=\"text-text-secondary\" />\n <YAxis\n tick={{ fontSize: 11 }}\n tickFormatter={(v: number) => `$${(v / 1000).toFixed(0)}K`}\n className=\"text-text-secondary\"\n />\n <Tooltip\n formatter={(value: number) => [formatCurrency(value), 'Cumulative returns']}\n labelClassName=\"text-text-primary\"\n />\n <Area\n type=\"monotone\"\n dataKey=\"cumulative\"\n stroke=\"var(--color-chart-1)\"\n fill=\"url(#returnsGrad)\"\n strokeWidth={2}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </ChartCard>\n\n <div className=\"space-y-3\">\n {returns.map((returnItem) => (\n <div\n key={returnItem.id}\n className=\"flex items-center justify-between rounded-lg bg-bg-sunken/50 p-4\"\n >\n <div>\n <div className=\"font-medium capitalize text-text-primary\">{returnItem.type}</div>\n <div className=\"text-sm text-text-secondary\">{formatDateSafe(returnItem.date)}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"font-bold text-status-success-text\">+{formatCurrency(returnItem.amount)}</div>\n <div className=\"text-sm text-text-secondary\">{returnItem.investorName}</div>\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No returns recorded yet\"\n description=\"Returns will appear here once distributions are made.\"\n />\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Manage investment dialog */}\n <ResponsiveDialog open={manageOpen} onOpenChange={setManageOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-md\">\n <form onSubmit={handleUpdate}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Manage investment</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update the details of this holding. Changes apply immediately.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3 py-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Title *</label>\n <input\n type=\"text\"\n required\n value={editTitle}\n onChange={(e) => setEditTitle(e.target.value)}\n className={inputClass}\n />\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Type</label>\n <select value={editType} onChange={(e) => setEditType(e.target.value)} className={inputClass}>\n {investmentTypeOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Status</label>\n <select value={editStatus} onChange={(e) => setEditStatus(e.target.value)} className={inputClass}>\n {investmentStatusOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Risk level</label>\n <select value={editRisk} onChange={(e) => setEditRisk(e.target.value)} className={inputClass}>\n {riskOptions.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Total value (USD) *</label>\n <input\n type=\"number\"\n required\n min={1}\n step=\"any\"\n value={editTotalValue}\n onChange={(e) => setEditTotalValue(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Start date</label>\n <input\n type=\"date\"\n value={editStart}\n onChange={(e) => setEditStart(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Maturity date</label>\n <input\n type=\"date\"\n value={editMaturity}\n onChange={(e) => setEditMaturity(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setManageOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating || !editTitle.trim() || !editTotalValue}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete confirmation dialog */}\n <ResponsiveDialog open={deleteOpen} onOpenChange={setDeleteOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-sm\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete investment?</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This permanently removes “{propertyTitle}” from your portfolio. This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setDeleteOpen(false)}>\n Cancel\n </Button>\n <Button type=\"button\" variant=\"destructive\" onClick={handleDelete} disabled={deleting}>\n {deleting ? 'Deleting…' : 'Delete investment'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentsPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/investments/InvestmentsPage.tsx"],"names":[],"mappings":"AA+JA,wBAAgB,eAAe,gCAgiB9B"}
1
+ {"version":3,"file":"InvestmentsPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/investments/InvestmentsPage.tsx"],"names":[],"mappings":"AAgKA,wBAAgB,eAAe,gCAiiB9B"}