@burdenoff/microfe-atheletebridge 2026.626.1 → 2026.629.1
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.
- package/dist/atheletebridge/AthleteBridgeRoot.js +49 -129
- package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -1
- package/dist/atheletebridge/AthleteBridgeRoutes.js +65 -184
- package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -1
- package/dist/atheletebridge/components/CursorPager.js +34 -0
- package/dist/atheletebridge/components/CursorPager.js.map +1 -0
- package/dist/atheletebridge/components/FilterSelect.js +22 -0
- package/dist/atheletebridge/components/FilterSelect.js.map +1 -0
- package/dist/atheletebridge/components/FixtureCard.js +76 -0
- package/dist/atheletebridge/components/FixtureCard.js.map +1 -0
- package/dist/atheletebridge/components/LoadingState.js +36 -0
- package/dist/atheletebridge/components/LoadingState.js.map +1 -0
- package/dist/atheletebridge/components/ProgramCard.js +69 -0
- package/dist/atheletebridge/components/ProgramCard.js.map +1 -0
- package/dist/atheletebridge/components/SessionCard.js +76 -0
- package/dist/atheletebridge/components/SessionCard.js.map +1 -0
- package/dist/atheletebridge/components/StatusBadge.js +44 -35
- package/dist/atheletebridge/components/StatusBadge.js.map +1 -1
- package/dist/atheletebridge/components/TeamCard.js +81 -0
- package/dist/atheletebridge/components/TeamCard.js.map +1 -0
- package/dist/atheletebridge/components/domain.js +47 -0
- package/dist/atheletebridge/components/domain.js.map +1 -0
- package/dist/atheletebridge/components/form.js +29 -0
- package/dist/atheletebridge/components/form.js.map +1 -0
- package/dist/atheletebridge/context/AthleteBridgeContext.js +6 -6
- package/dist/atheletebridge/context/AthleteBridgeContext.js.map +1 -1
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +342 -165
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -1
- package/dist/atheletebridge/index.js +1 -1
- package/dist/atheletebridge/pages/DashboardPage.js +169 -0
- package/dist/atheletebridge/pages/DashboardPage.js.map +1 -0
- package/dist/atheletebridge/pages/StandingsPage.js +166 -0
- package/dist/atheletebridge/pages/StandingsPage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js +201 -0
- package/dist/atheletebridge/pages/fixtures/FixtureDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js +205 -0
- package/dist/atheletebridge/pages/fixtures/FixtureFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js +92 -0
- package/dist/atheletebridge/pages/fixtures/FixturesListPage.js.map +1 -0
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js +374 -0
- package/dist/atheletebridge/pages/programs/ProgramDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/programs/ProgramFormPage.js +207 -0
- package/dist/atheletebridge/pages/programs/ProgramFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js +113 -0
- package/dist/atheletebridge/pages/programs/ProgramsListPage.js.map +1 -0
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js +224 -0
- package/dist/atheletebridge/pages/sessions/SessionDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js +206 -0
- package/dist/atheletebridge/pages/sessions/SessionFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js +92 -0
- package/dist/atheletebridge/pages/sessions/SessionsListPage.js.map +1 -0
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js +350 -0
- package/dist/atheletebridge/pages/teams/TeamDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/teams/TeamFormPage.js +222 -0
- package/dist/atheletebridge/pages/teams/TeamFormPage.js.map +1 -0
- package/dist/atheletebridge/pages/teams/TeamsListPage.js +101 -0
- package/dist/atheletebridge/pages/teams/TeamsListPage.js.map +1 -0
- package/dist/atheletebridge/store/atheletebridgeStore.js +2 -13
- package/dist/atheletebridge/store/atheletebridgeStore.js.map +1 -1
- package/dist/atheletebridge/utils/datetime.js +10 -0
- package/dist/atheletebridge/utils/datetime.js.map +1 -0
- package/dist/atheletebridge/utils/formatters.js +1 -4
- package/dist/atheletebridge/utils/formatters.js.map +1 -1
- package/package.json +1 -1
- package/dist/atheletebridge/components/InvestmentCard.js +0 -96
- package/dist/atheletebridge/components/InvestmentCard.js.map +0 -1
- package/dist/atheletebridge/components/RatingDisplay.js +0 -35
- package/dist/atheletebridge/components/RatingDisplay.js.map +0 -1
- package/dist/atheletebridge/mocks/data.js +0 -1517
- package/dist/atheletebridge/mocks/data.js.map +0 -1
- package/dist/atheletebridge/mocks/users.js +0 -34
- package/dist/atheletebridge/mocks/users.js.map +0 -1
- package/dist/atheletebridge/pages/HomePage.js +0 -936
- package/dist/atheletebridge/pages/HomePage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js +0 -653
- package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminDashboard.js +0 -671
- package/dist/atheletebridge/pages/admin/AdminDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminFinancialPage.js +0 -429
- package/dist/atheletebridge/pages/admin/AdminFinancialPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminOrdersPage.js +0 -667
- package/dist/atheletebridge/pages/admin/AdminOrdersPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminProfilePage.js +0 -261
- package/dist/atheletebridge/pages/admin/AdminProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/AdminSettingsPage.js +0 -653
- package/dist/atheletebridge/pages/admin/AdminSettingsPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/CartManagementPage.js +0 -876
- package/dist/atheletebridge/pages/admin/CartManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/admin/UserManagementPage.js +0 -900
- package/dist/atheletebridge/pages/admin/UserManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js +0 -839
- package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js +0 -704
- package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js +0 -792
- package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js +0 -891
- package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js +0 -633
- package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js +0 -913
- package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js +0 -881
- package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js +0 -841
- package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js.map +0 -1
- package/dist/atheletebridge/pages/common/HelpSupportPage.js +0 -1319
- package/dist/atheletebridge/pages/common/HelpSupportPage.js.map +0 -1
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js +0 -674
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js.map +0 -1
- package/dist/atheletebridge/pages/common/SettingsPage.js +0 -972
- package/dist/atheletebridge/pages/common/SettingsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js +0 -602
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CartDetailPage.js +0 -656
- package/dist/atheletebridge/pages/customer/CartDetailPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js +0 -558
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CheckoutPage.js +0 -536
- package/dist/atheletebridge/pages/customer/CheckoutPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CustomerDashboard.js +0 -539
- package/dist/atheletebridge/pages/customer/CustomerDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/customer/CustomerProfilePage.js +0 -657
- package/dist/atheletebridge/pages/customer/CustomerProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js +0 -635
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/FavoritesPage.js +0 -486
- package/dist/atheletebridge/pages/customer/FavoritesPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js +0 -447
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js +0 -393
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js +0 -494
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/ReviewsPage.js +0 -615
- package/dist/atheletebridge/pages/customer/ReviewsPage.js.map +0 -1
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js +0 -451
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js +0 -881
- package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js +0 -945
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js +0 -686
- package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorDashboard.js +0 -453
- package/dist/atheletebridge/pages/investor/InvestorDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js +0 -405
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js +0 -577
- package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js.map +0 -1
- package/dist/atheletebridge/pages/investor/InvestorProfilePage.js +0 -1069
- package/dist/atheletebridge/pages/investor/InvestorProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js +0 -530
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerDashboard.js +0 -669
- package/dist/atheletebridge/pages/worker/WorkerDashboard.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js +0 -681
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerProfilePage.js +0 -691
- package/dist/atheletebridge/pages/worker/WorkerProfilePage.js.map +0 -1
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js +0 -588
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InvestorAnalyticsPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/investor/InvestorAnalyticsPage.tsx"],"sourcesContent":["/**\n * Investor Analytics Page\n * @module atheletebridge/pages/investor\n *\n * Date range selector, export button, metrics grid, performance by cart\n * with rankings, category distribution with progress bars, monthly\n * performance table, risk analysis with scores, diversification score,\n * and recommendations list.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n TrendingUp,\n PieChart,\n BarChart3,\n Calendar,\n Download,\n Target,\n Activity,\n Wallet,\n IndianRupee,\n Lightbulb,\n Shield,\n AlertTriangle,\n ArrowUp,\n ArrowDown,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { MetricsCard } from '../../components/MetricsCard';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AnalyticsData {\n portfolioMetrics: {\n totalValue: number;\n totalInvested: number;\n totalReturns: number;\n averageRoi: number;\n portfolioGrowth: number;\n bestPerforming: string;\n worstPerforming: string;\n };\n performanceByCart: Array<{\n cartName: string;\n investedAmount: number;\n currentValue: number;\n returns: number;\n roi: number;\n }>;\n performanceByCategory: Array<{\n category: string;\n investedAmount: number;\n returns: number;\n percentage: number;\n }>;\n monthlyPerformance: Array<{\n month: string;\n invested: number;\n value: number;\n returns: number;\n }>;\n riskAnalysis: {\n riskScore: number;\n diversificationScore: number;\n volatilityScore: number;\n recommendations: string[];\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock data\n// ---------------------------------------------------------------------------\n\nconst mockAnalytics: AnalyticsData = {\n portfolioMetrics: {\n totalValue: 283700,\n totalInvested: 255000,\n totalReturns: 28700,\n averageRoi: 19.6,\n portfolioGrowth: 11.3,\n bestPerforming: 'Biryani House',\n worstPerforming: 'Healthy Bites',\n },\n performanceByCart: [\n {\n cartName: 'Biryani House',\n investedAmount: 60000,\n currentValue: 72000,\n returns: 12000,\n roi: 20.0,\n },\n {\n cartName: 'South Indian Express',\n investedAmount: 50000,\n currentValue: 58500,\n returns: 8500,\n roi: 17.0,\n },\n {\n cartName: 'Pizza Corner',\n investedAmount: 75000,\n currentValue: 82000,\n returns: 7000,\n roi: 9.3,\n },\n {\n cartName: 'Healthy Bites',\n investedAmount: 30000,\n currentValue: 31200,\n returns: 1200,\n roi: 4.0,\n },\n {\n cartName: 'Street Food Junction',\n investedAmount: 40000,\n currentValue: 40000,\n returns: 0,\n roi: 0,\n },\n ],\n performanceByCategory: [\n {\n category: 'South Indian',\n investedAmount: 110000,\n returns: 20500,\n percentage: 43.1,\n },\n {\n category: 'Fast Food',\n investedAmount: 75000,\n returns: 7000,\n percentage: 29.4,\n },\n {\n category: 'Street Food',\n investedAmount: 40000,\n returns: 0,\n percentage: 15.7,\n },\n {\n category: 'Healthy Food',\n investedAmount: 30000,\n returns: 1200,\n percentage: 11.8,\n },\n ],\n monthlyPerformance: [\n { month: 'Jun 2024', invested: 195000, value: 202000, returns: 7000 },\n { month: 'Jul 2024', invested: 215000, value: 228000, returns: 13000 },\n { month: 'Aug 2024', invested: 255000, value: 265000, returns: 10000 },\n { month: 'Sep 2024', invested: 255000, value: 275000, returns: 20000 },\n { month: 'Oct 2024', invested: 255000, value: 280000, returns: 25000 },\n { month: 'Nov 2024', invested: 255000, value: 283700, returns: 28700 },\n ],\n riskAnalysis: {\n riskScore: 3.2,\n diversificationScore: 7.8,\n volatilityScore: 2.5,\n recommendations: [\n 'Consider diversifying into more food categories',\n 'Your portfolio shows good risk distribution',\n 'Consider investing in carts from different locations',\n 'Monitor underperforming investments closely',\n 'Explore premium segment opportunities for higher returns',\n ],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getRiskLevel(score: number): { label: string; color: string } {\n if (score <= 2) return { label: 'Low Risk', color: 'text-green-600 dark:text-green-400' };\n if (score <= 4) return { label: 'Moderate Risk', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'High Risk', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getRiskBgColor(score: number): string {\n if (score <= 2) return 'bg-green-500';\n if (score <= 4) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\nfunction getDiversificationLevel(score: number): { label: string; color: string } {\n if (score >= 8) return { label: 'Well Diversified', color: 'text-green-600 dark:text-green-400' };\n if (score >= 6)\n return { label: 'Moderately Diversified', color: 'text-yellow-600 dark:text-yellow-400' };\n return { label: 'Poorly Diversified', color: 'text-red-600 dark:text-red-400' };\n}\n\nfunction getDiversificationBgColor(score: number): string {\n if (score >= 8) return 'bg-green-500';\n if (score >= 6) return 'bg-yellow-500';\n return 'bg-red-500';\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function InvestorAnalyticsPage() {\n const { navigateTo } = useAthleteBridge();\n const [isLoading, setIsLoading] = useState(true);\n const [dateRange, setDateRange] = useState('6m');\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [exportStatus, setExportStatus] = useState<'idle' | 'exporting' | 'done'>('idle');\n\n useEffect(() => {\n setIsLoading(true);\n const timer = setTimeout(() => {\n setAnalytics(mockAnalytics);\n setIsLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [dateRange]);\n\n const handleExportReport = useCallback(() => {\n setExportStatus('exporting');\n setTimeout(() => {\n setExportStatus('done');\n setTimeout(() => setExportStatus('idle'), 2000);\n }, 1200);\n }, []);\n\n if (isLoading || !analytics) {\n return (\n <PageLayout title=\"Investment Analytics\" description=\"Loading analytics...\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary\" />\n <p className=\"text-sm text-text-secondary\">Loading analytics data...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n const riskLevel = getRiskLevel(analytics.riskAnalysis.riskScore);\n const diversificationLevel = getDiversificationLevel(analytics.riskAnalysis.diversificationScore);\n\n // Sort carts by ROI for ranking\n const sortedCarts = [...analytics.performanceByCart].sort((a, b) => b.roi - a.roi);\n\n return (\n <PageLayout\n title=\"Investment Analytics\"\n description=\"Comprehensive analysis of your portfolio performance\"\n actions={\n <div className=\"flex items-center gap-3\">\n {/* Date Range Selector */}\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"1m\">Last Month</option>\n <option value=\"3m\">Last 3 Months</option>\n <option value=\"6m\">Last 6 Months</option>\n <option value=\"1y\">Last Year</option>\n <option value=\"all\">All Time</option>\n </select>\n\n {/* Export Button */}\n <button\n type=\"button\"\n onClick={handleExportReport}\n disabled={exportStatus === 'exporting'}\n className={cn(\n 'flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n exportStatus === 'exporting'\n ? 'cursor-not-allowed bg-bg-sunken text-text-secondary'\n : exportStatus === 'done'\n ? 'bg-green-600 text-white'\n : 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n )}\n >\n <Download className=\"h-4 w-4\" />\n {exportStatus === 'exporting'\n ? 'Exporting...'\n : exportStatus === 'done'\n ? 'Exported!'\n : 'Export Report'}\n </button>\n </div>\n }\n >\n <PagePurpose className=\"mb-6\">\n Understand how your money is really performing. Analyse portfolio value, returns and ROI\n over your chosen time range, spot your best and worst performers, gauge your risk exposure,\n and export the report. Use this to refine where you invest next.\n </PagePurpose>\n\n {/* Key Metrics */}\n <EmphasisPanel>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricsCard\n icon={<Wallet className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalValue, {\n minimumFractionDigits: 0,\n })}\n label=\"Portfolio Value\"\n trend=\"up\"\n trendValue={`+${analytics.portfolioMetrics.portfolioGrowth}% total growth`}\n />\n <MetricsCard\n icon={<TrendingUp className=\"h-5 w-5\" />}\n value={formatCurrency(analytics.portfolioMetrics.totalReturns, {\n minimumFractionDigits: 0,\n })}\n label=\"Total Returns\"\n trend=\"up\"\n trendValue=\"Profit earned so far\"\n />\n <MetricsCard\n icon={<Target className=\"h-5 w-5\" />}\n value={`${analytics.portfolioMetrics.averageRoi}%`}\n label=\"Average ROI\"\n trend=\"up\"\n trendValue=\"Across all investments\"\n />\n <MetricsCard\n icon={<Activity className=\"h-5 w-5\" />}\n value={`${analytics.riskAnalysis.riskScore}/5`}\n label=\"Risk Score\"\n trend=\"neutral\"\n trendValue={riskLevel.label}\n />\n </div>\n </EmphasisPanel>\n\n {/* Best / Worst Performers */}\n <div className=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-green-500/10\">\n <ArrowUp className=\"h-5 w-5 text-green-600 dark:text-green-400\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Best Performing</p>\n <p className=\"text-sm font-semibold text-green-600 dark:text-green-400\">\n {analytics.portfolioMetrics.bestPerforming}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-red-500/10\">\n <ArrowDown className=\"h-5 w-5 text-red-600 dark:text-red-400\" />\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Worst Performing</p>\n <p className=\"text-sm font-semibold text-text-primary\">\n {analytics.portfolioMetrics.worstPerforming}\n </p>\n </div>\n </div>\n </div>\n\n {/* Performance by Cart & Category Distribution */}\n <div className=\"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Performance by Cart */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Performance by Cart</h2>\n </div>\n\n <div className=\"space-y-3\">\n {sortedCarts.map((cart, index) => (\n <div\n key={cart.cartName}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle bg-bg-surface p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{cart.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(cart.investedAmount, { minimumFractionDigits: 0 })} invested\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={cn(\n 'text-sm font-semibold',\n cart.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.returns >= 0 ? '+' : ''}\n {formatCurrency(cart.returns, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n cart.roi >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {cart.roi >= 0 ? '+' : ''}\n {cart.roi}% ROI\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Category Distribution */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <PieChart className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Category Distribution</h2>\n </div>\n\n <div className=\"space-y-4\">\n {analytics.performanceByCategory.map((category) => (\n <div key={category.category} className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">{category.category}</span>\n <span className=\"text-sm text-text-secondary\">{category.percentage}%</span>\n </div>\n <div className=\"mb-2 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${category.percentage}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {formatCurrency(category.investedAmount, { minimumFractionDigits: 0 })} invested\n </span>\n <span\n className={cn(\n 'text-xs font-semibold',\n category.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {category.returns >= 0 ? '+' : ''}\n {formatCurrency(category.returns, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Monthly Performance Table */}\n <section className=\"mt-8\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Calendar className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Portfolio Growth Trend</h2>\n </div>\n\n <div className=\"overflow-hidden rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Month\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Invested\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Portfolio Value\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Returns\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary sm:px-6\">\n Growth %\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.monthlyPerformance.map((month) => {\n const growthPct =\n month.invested > 0\n ? (((month.value - month.invested) / month.invested) * 100).toFixed(1)\n : '0.0';\n\n return (\n <tr key={month.month} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"whitespace-nowrap px-4 py-4 text-sm font-medium text-text-primary sm:px-6\">\n {month.month}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.invested, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm text-text-primary sm:px-6\">\n {formatCurrency(month.value, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-semibold',\n month.returns >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {month.returns >= 0 ? '+' : ''}\n {formatCurrency(month.returns, { minimumFractionDigits: 0 })}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-4 text-sm sm:px-6\">\n <span\n className={cn(\n 'font-medium',\n parseFloat(growthPct) >= 0\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {parseFloat(growthPct) >= 0 ? '+' : ''}\n {growthPct}%\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </section>\n\n {/* Risk Analysis & Diversification */}\n <div className=\"mt-8 grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Risk Analysis */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Risk Analysis</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-5\">\n {/* Risk Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Risk Score</span>\n <span className={cn('text-sm font-semibold', riskLevel.color)}>\n {analytics.riskAnalysis.riskScore}/5 ({riskLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.riskScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.riskScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Diversification Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Diversification</span>\n <span className={cn('text-sm font-semibold', diversificationLevel.color)}>\n {analytics.riskAnalysis.diversificationScore}/10 ({diversificationLevel.label})\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getDiversificationBgColor(analytics.riskAnalysis.diversificationScore)\n )}\n style={{\n width: `${(analytics.riskAnalysis.diversificationScore / 10) * 100}%`,\n }}\n />\n </div>\n </div>\n\n {/* Volatility Score */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Volatility</span>\n <span\n className={cn(\n 'text-sm font-semibold',\n getRiskLevel(analytics.riskAnalysis.volatilityScore).color\n )}\n >\n {analytics.riskAnalysis.volatilityScore}/5\n </span>\n </div>\n <div className=\"h-3 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300',\n getRiskBgColor(analytics.riskAnalysis.volatilityScore)\n )}\n style={{ width: `${(analytics.riskAnalysis.volatilityScore / 5) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Quick Stats */}\n <div className=\"grid grid-cols-2 gap-3 border-t border-border-subtle pt-4\">\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCart.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Active Investments</p>\n </div>\n <div className=\"rounded-lg bg-bg-sunken/50 p-3 text-center\">\n <p className=\"text-lg font-bold text-text-primary\">\n {analytics.performanceByCategory.length}\n </p>\n <p className=\"text-xs text-text-secondary\">Sectors Covered</p>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Recommendations */}\n <section>\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-yellow-500\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">Recommendations</h2>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"space-y-3\">\n {analytics.riskAnalysis.recommendations.map((recommendation, index) => (\n <div\n key={index}\n className=\"flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3\"\n >\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {index + 1}\n </div>\n <p className=\"text-sm leading-relaxed text-text-primary\">{recommendation}</p>\n </div>\n ))}\n </div>\n\n {/* Overall Assessment */}\n <div className=\"mt-5 rounded-lg border border-border-subtle bg-bg-sunken/50 p-4\">\n <h4 className=\"mb-2 text-sm font-semibold text-text-primary\">Overall Assessment</h4>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Portfolio Health</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Growth Potential</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn(\n 'h-2 w-4 rounded-sm',\n i <= 3 ? 'bg-yellow-500' : 'bg-bg-sunken'\n )}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">3/5</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Income Stability</span>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div\n key={i}\n className={cn('h-2 w-4 rounded-sm', i <= 4 ? 'bg-green-500' : 'bg-bg-sunken')}\n />\n ))}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">4/5</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n </div>\n\n {/* Quick Navigation */}\n <div className=\"mt-8 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/portfolio')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <PieChart className=\"h-4 w-4\" />\n View Portfolio\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/opportunities')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Target className=\"h-4 w-4\" />\n Browse Opportunities\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/investor/investments')}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Wallet className=\"h-4 w-4\" />\n My Investments\n </button>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
import { useAthleteBridge as e } from "../../context/AthleteBridgeContext.js";
|
|
2
|
-
import { cn as t } from "../../utils/cn.js";
|
|
3
|
-
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
4
|
-
import { MetricsCard as r } from "../../components/MetricsCard.js";
|
|
5
|
-
import { EmptyState as i } from "../../components/EmptyState.js";
|
|
6
|
-
import { useInvestmentOpportunities as a, useInvestments as o } from "../../hooks/useAthleteBridgeApi.js";
|
|
7
|
-
import { formatCurrency as s } from "../../utils/formatters.js";
|
|
8
|
-
import { InvestmentCard as c } from "../../components/InvestmentCard.js";
|
|
9
|
-
import { useMemo as l, useState as u } from "react";
|
|
10
|
-
import { Activity as d, Award as f, BarChart3 as p, Eye as m, Filter as h, IndianRupee as g, Lightbulb as _, MapPin as v, PieChart as y, Plus as b, Target as x, Wallet as S } from "lucide-react";
|
|
11
|
-
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
12
|
-
import { EmphasisPanel as T, NextSteps as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
|
|
13
|
-
//#region src/atheletebridge/pages/investor/InvestorDashboard.tsx
|
|
14
|
-
var O = [
|
|
15
|
-
{
|
|
16
|
-
id: "1",
|
|
17
|
-
type: "opportunity",
|
|
18
|
-
title: "High-Potential Business Detected",
|
|
19
|
-
description: "Glow Beauty Services in Koramangala shows 95% growth potential based on location analytics and market demand.",
|
|
20
|
-
confidence: 94
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
id: "2",
|
|
24
|
-
type: "suggestion",
|
|
25
|
-
title: "Portfolio Diversification Recommended",
|
|
26
|
-
description: "Consider investing in Education & Skills to balance your services-heavy portfolio. Current allocation: 70% services, 30% retail.",
|
|
27
|
-
confidence: 87
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: "3",
|
|
31
|
-
type: "trend",
|
|
32
|
-
title: "Market Trend Alert",
|
|
33
|
-
description: "Health & Wellness businesses in tech hubs are experiencing 40% higher returns. Whitefield shows promising opportunities.",
|
|
34
|
-
confidence: 91
|
|
35
|
-
}
|
|
36
|
-
], k = [
|
|
37
|
-
{
|
|
38
|
-
id: "act-1",
|
|
39
|
-
type: "dividend",
|
|
40
|
-
description: "Dividend received from Quick Cuts Salon",
|
|
41
|
-
amount: 4200,
|
|
42
|
-
date: "2024-01-14T10:00:00Z"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: "act-2",
|
|
46
|
-
type: "investment",
|
|
47
|
-
description: "Invested in Spotless Cleaning Services",
|
|
48
|
-
amount: -4e4,
|
|
49
|
-
date: "2024-01-10T09:30:00Z"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
id: "act-3",
|
|
53
|
-
type: "return",
|
|
54
|
-
description: "Returns from Fix-It Mobile Repair",
|
|
55
|
-
amount: 6800,
|
|
56
|
-
date: "2024-01-05T14:00:00Z"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
id: "act-4",
|
|
60
|
-
type: "investment",
|
|
61
|
-
description: "Invested in Fix-It Mobile Repair",
|
|
62
|
-
amount: -75e3,
|
|
63
|
-
date: "2023-12-20T11:00:00Z"
|
|
64
|
-
}
|
|
65
|
-
];
|
|
66
|
-
function A(e) {
|
|
67
|
-
switch (e) {
|
|
68
|
-
case "active": return "bg-green-500/20 text-green-600 dark:text-green-400";
|
|
69
|
-
case "pending": return "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400";
|
|
70
|
-
case "completed": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
|
|
71
|
-
default: return "bg-secondary text-secondary-foreground";
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function j() {
|
|
75
|
-
let { navigateTo: j, currentUser: M } = e(), [N, P] = u("portfolio"), { data: F = [], isLoading: I } = a(), { data: L = [], isLoading: R } = o(M?.id || ""), z = M?.firstName ?? M?.name ?? "Investor", B = F.filter((e) => e.status === "active"), V = l(() => {
|
|
76
|
-
let e = L.reduce((e, t) => e + t.investedAmount, 0), t = L.reduce((e, t) => e + t.currentValue, 0), n = L.reduce((e, t) => e + t.returns, 0);
|
|
77
|
-
return {
|
|
78
|
-
totalInvested: e,
|
|
79
|
-
currentValue: t,
|
|
80
|
-
totalReturns: n,
|
|
81
|
-
monthlyIncome: n / 12,
|
|
82
|
-
roi: e > 0 ? n / e * 100 : 0
|
|
83
|
-
};
|
|
84
|
-
}, [L]);
|
|
85
|
-
return I || R ? /* @__PURE__ */ C(n, {
|
|
86
|
-
title: "Investment Dashboard",
|
|
87
|
-
description: "Loading your portfolio...",
|
|
88
|
-
children: /* @__PURE__ */ C("div", {
|
|
89
|
-
className: "flex items-center justify-center py-20",
|
|
90
|
-
children: /* @__PURE__ */ w("div", {
|
|
91
|
-
className: "text-center",
|
|
92
|
-
children: [/* @__PURE__ */ C("div", { className: "mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-primary" }), /* @__PURE__ */ C("p", {
|
|
93
|
-
className: "text-sm text-text-secondary",
|
|
94
|
-
children: "Loading your portfolio..."
|
|
95
|
-
})]
|
|
96
|
-
})
|
|
97
|
-
})
|
|
98
|
-
}) : /* @__PURE__ */ w(n, {
|
|
99
|
-
title: `Welcome back, ${z}!`,
|
|
100
|
-
description: "Here's your investment portfolio overview.",
|
|
101
|
-
children: [
|
|
102
|
-
/* @__PURE__ */ C(D, {
|
|
103
|
-
className: "mb-6",
|
|
104
|
-
children: "Your investment command center. See how your money is performing across every business you back — total invested, current value, returns and monthly income — then act on AI-spotted opportunities. Use this page to track your portfolio and decide where to invest next."
|
|
105
|
-
}),
|
|
106
|
-
/* @__PURE__ */ C(E, {
|
|
107
|
-
className: "mb-6",
|
|
108
|
-
storageKey: "atheletebridge-investor-dashboard",
|
|
109
|
-
steps: [
|
|
110
|
-
{
|
|
111
|
-
id: "browse",
|
|
112
|
-
label: "Browse investment opportunities",
|
|
113
|
-
description: "Discover vetted carts seeking funding and their expected returns.",
|
|
114
|
-
icon: /* @__PURE__ */ C(x, { className: "h-4 w-4" }),
|
|
115
|
-
onClick: () => j("/investor/opportunities")
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
id: "portfolio",
|
|
119
|
-
label: "Review your full portfolio",
|
|
120
|
-
description: "Drill into each active investment and its performance.",
|
|
121
|
-
icon: /* @__PURE__ */ C(y, { className: "h-4 w-4" }),
|
|
122
|
-
onClick: () => j("/investor/portfolio")
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
id: "analytics",
|
|
126
|
-
label: "Open investment analytics",
|
|
127
|
-
description: "See diversification, ROI trends and risk breakdown.",
|
|
128
|
-
icon: /* @__PURE__ */ C(p, { className: "h-4 w-4" }),
|
|
129
|
-
onClick: () => j("/investor/analytics")
|
|
130
|
-
}
|
|
131
|
-
]
|
|
132
|
-
}),
|
|
133
|
-
/* @__PURE__ */ w(T, { children: [/* @__PURE__ */ C("h2", {
|
|
134
|
-
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
135
|
-
children: "Portfolio Overview"
|
|
136
|
-
}), /* @__PURE__ */ w("div", {
|
|
137
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
138
|
-
children: [
|
|
139
|
-
/* @__PURE__ */ C(r, {
|
|
140
|
-
icon: /* @__PURE__ */ C(S, { className: "h-5 w-5" }),
|
|
141
|
-
value: s(V.totalInvested, { minimumFractionDigits: 0 }),
|
|
142
|
-
label: "Total Invested",
|
|
143
|
-
trend: "up",
|
|
144
|
-
trendValue: "Across all businesses"
|
|
145
|
-
}),
|
|
146
|
-
/* @__PURE__ */ C(r, {
|
|
147
|
-
icon: /* @__PURE__ */ C(g, { className: "h-5 w-5" }),
|
|
148
|
-
value: s(V.currentValue, { minimumFractionDigits: 0 }),
|
|
149
|
-
label: "Current Value",
|
|
150
|
-
trend: "up",
|
|
151
|
-
trendValue: `+${V.roi.toFixed(1)}%`
|
|
152
|
-
}),
|
|
153
|
-
/* @__PURE__ */ C(r, {
|
|
154
|
-
icon: /* @__PURE__ */ C(x, { className: "h-5 w-5" }),
|
|
155
|
-
value: s(V.totalReturns, { minimumFractionDigits: 0 }),
|
|
156
|
-
label: "Total Returns",
|
|
157
|
-
trend: "up",
|
|
158
|
-
trendValue: "+15.2% this month"
|
|
159
|
-
}),
|
|
160
|
-
/* @__PURE__ */ C(r, {
|
|
161
|
-
icon: /* @__PURE__ */ C(d, { className: "h-5 w-5" }),
|
|
162
|
-
value: s(V.monthlyIncome, { minimumFractionDigits: 0 }),
|
|
163
|
-
label: "Monthly Income",
|
|
164
|
-
trend: "up",
|
|
165
|
-
trendValue: "+8.5% vs last month"
|
|
166
|
-
})
|
|
167
|
-
]
|
|
168
|
-
})] }),
|
|
169
|
-
/* @__PURE__ */ w("div", {
|
|
170
|
-
className: "mt-8 grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
171
|
-
children: [/* @__PURE__ */ w("div", {
|
|
172
|
-
className: "lg:col-span-2",
|
|
173
|
-
children: [
|
|
174
|
-
/* @__PURE__ */ w("div", {
|
|
175
|
-
className: "mb-6 flex rounded-lg bg-bg-sunken p-1",
|
|
176
|
-
children: [/* @__PURE__ */ C("button", {
|
|
177
|
-
type: "button",
|
|
178
|
-
onClick: () => P("portfolio"),
|
|
179
|
-
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", N === "portfolio" ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
180
|
-
children: "My Investments"
|
|
181
|
-
}), /* @__PURE__ */ C("button", {
|
|
182
|
-
type: "button",
|
|
183
|
-
onClick: () => P("opportunities"),
|
|
184
|
-
className: t("flex-1 rounded-md px-4 py-2 text-sm font-medium transition-colors", N === "opportunities" ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
185
|
-
children: "New Opportunities"
|
|
186
|
-
})]
|
|
187
|
-
}),
|
|
188
|
-
N === "portfolio" && /* @__PURE__ */ w("div", {
|
|
189
|
-
className: "space-y-4",
|
|
190
|
-
children: [/* @__PURE__ */ w("div", {
|
|
191
|
-
className: "flex items-center justify-between",
|
|
192
|
-
children: [/* @__PURE__ */ C("h3", {
|
|
193
|
-
className: "text-base font-semibold text-text-primary",
|
|
194
|
-
children: "Active Investments"
|
|
195
|
-
}), /* @__PURE__ */ w("button", {
|
|
196
|
-
type: "button",
|
|
197
|
-
onClick: () => alert("Filter functionality coming soon!"),
|
|
198
|
-
className: "flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
199
|
-
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), "Filter"]
|
|
200
|
-
})]
|
|
201
|
-
}), L.length === 0 ? /* @__PURE__ */ C("div", {
|
|
202
|
-
className: "rounded-lg border border-dashed border-border-subtle",
|
|
203
|
-
children: /* @__PURE__ */ C(i, {
|
|
204
|
-
illustration: "empty-data",
|
|
205
|
-
title: "No active investments yet",
|
|
206
|
-
description: "Once you back a business, it will show up here with live performance. Start by exploring open opportunities.",
|
|
207
|
-
action: /* @__PURE__ */ w("button", {
|
|
208
|
-
type: "button",
|
|
209
|
-
onClick: () => P("opportunities"),
|
|
210
|
-
className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors",
|
|
211
|
-
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4" }), "Browse opportunities"]
|
|
212
|
-
})
|
|
213
|
-
})
|
|
214
|
-
}) : L.map((e) => /* @__PURE__ */ w("div", {
|
|
215
|
-
className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm hover:shadow-md transition-shadow",
|
|
216
|
-
children: [/* @__PURE__ */ w("div", {
|
|
217
|
-
className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
|
|
218
|
-
children: [/* @__PURE__ */ w("div", {
|
|
219
|
-
className: "flex-1",
|
|
220
|
-
children: [/* @__PURE__ */ w("div", {
|
|
221
|
-
className: "mb-2 flex flex-wrap items-center gap-2",
|
|
222
|
-
children: [/* @__PURE__ */ C("h4", {
|
|
223
|
-
className: "text-base font-semibold text-text-primary",
|
|
224
|
-
children: e.cartName
|
|
225
|
-
}), /* @__PURE__ */ C("span", {
|
|
226
|
-
className: t("rounded-full px-2 py-0.5 text-xs font-medium", A(e.status)),
|
|
227
|
-
children: e.status
|
|
228
|
-
})]
|
|
229
|
-
}), /* @__PURE__ */ w("div", {
|
|
230
|
-
className: "mb-3 flex flex-wrap items-center gap-3 text-xs text-text-secondary",
|
|
231
|
-
children: [/* @__PURE__ */ w("span", {
|
|
232
|
-
className: "flex items-center gap-1",
|
|
233
|
-
children: [/* @__PURE__ */ C(v, { className: "h-3.5 w-3.5" }), "India"]
|
|
234
|
-
}), /* @__PURE__ */ C("span", { children: "Services" })]
|
|
235
|
-
})]
|
|
236
|
-
}), /* @__PURE__ */ w("button", {
|
|
237
|
-
type: "button",
|
|
238
|
-
onClick: () => j(`/investor/investments/${e.id}`),
|
|
239
|
-
className: "flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
240
|
-
children: [/* @__PURE__ */ C(m, { className: "h-4 w-4" }), "View Details"]
|
|
241
|
-
})]
|
|
242
|
-
}), /* @__PURE__ */ w("div", {
|
|
243
|
-
className: "grid grid-cols-2 gap-3 sm:grid-cols-4",
|
|
244
|
-
children: [
|
|
245
|
-
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
246
|
-
className: "text-xs text-text-secondary",
|
|
247
|
-
children: "Invested"
|
|
248
|
-
}), /* @__PURE__ */ C("p", {
|
|
249
|
-
className: "text-sm font-semibold text-text-primary",
|
|
250
|
-
children: s(e.investedAmount, { minimumFractionDigits: 0 })
|
|
251
|
-
})] }),
|
|
252
|
-
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
253
|
-
className: "text-xs text-text-secondary",
|
|
254
|
-
children: "Current Value"
|
|
255
|
-
}), /* @__PURE__ */ C("p", {
|
|
256
|
-
className: "text-sm font-semibold text-green-600 dark:text-green-400",
|
|
257
|
-
children: s(e.currentValue, { minimumFractionDigits: 0 })
|
|
258
|
-
})] }),
|
|
259
|
-
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
260
|
-
className: "text-xs text-text-secondary",
|
|
261
|
-
children: "Returns"
|
|
262
|
-
}), /* @__PURE__ */ C("p", {
|
|
263
|
-
className: "text-sm font-semibold text-text-primary",
|
|
264
|
-
children: s(e.returns, { minimumFractionDigits: 0 })
|
|
265
|
-
})] }),
|
|
266
|
-
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
267
|
-
className: "text-xs text-text-secondary",
|
|
268
|
-
children: "Growth"
|
|
269
|
-
}), /* @__PURE__ */ w("p", {
|
|
270
|
-
className: "text-sm font-semibold text-green-600 dark:text-green-400",
|
|
271
|
-
children: [e.returnsPercentage, "%"]
|
|
272
|
-
})] })
|
|
273
|
-
]
|
|
274
|
-
})]
|
|
275
|
-
}, e.id))]
|
|
276
|
-
}),
|
|
277
|
-
N === "opportunities" && /* @__PURE__ */ w("div", {
|
|
278
|
-
className: "space-y-4",
|
|
279
|
-
children: [/* @__PURE__ */ w("div", {
|
|
280
|
-
className: "flex items-center justify-between",
|
|
281
|
-
children: [/* @__PURE__ */ C("h3", {
|
|
282
|
-
className: "text-base font-semibold text-text-primary",
|
|
283
|
-
children: "Investment Opportunities"
|
|
284
|
-
}), /* @__PURE__ */ w("button", {
|
|
285
|
-
type: "button",
|
|
286
|
-
onClick: () => j("/investor/opportunities"),
|
|
287
|
-
className: "flex items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors",
|
|
288
|
-
children: [/* @__PURE__ */ C(b, { className: "h-4 w-4" }), "Browse All"]
|
|
289
|
-
})]
|
|
290
|
-
}), /* @__PURE__ */ C("div", {
|
|
291
|
-
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
292
|
-
children: B.slice(0, 2).map((e) => /* @__PURE__ */ C(c, {
|
|
293
|
-
id: e.id,
|
|
294
|
-
cartName: e.cartName,
|
|
295
|
-
targetAmount: e.targetAmount,
|
|
296
|
-
raisedAmount: e.raisedAmount,
|
|
297
|
-
expectedReturns: `${e.expectedReturns}%`,
|
|
298
|
-
riskLevel: e.riskLevel,
|
|
299
|
-
status: e.status,
|
|
300
|
-
onClick: (e) => j(`/investor/opportunities/${e}`)
|
|
301
|
-
}, e.id))
|
|
302
|
-
})]
|
|
303
|
-
}),
|
|
304
|
-
/* @__PURE__ */ w("section", {
|
|
305
|
-
className: "mt-8",
|
|
306
|
-
children: [/* @__PURE__ */ C("h2", {
|
|
307
|
-
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
308
|
-
children: "Recent Activity"
|
|
309
|
-
}), /* @__PURE__ */ C("div", {
|
|
310
|
-
className: "divide-y divide-border rounded-lg border border-border-subtle bg-bg-surface",
|
|
311
|
-
children: k.map((e) => /* @__PURE__ */ w("div", {
|
|
312
|
-
className: "flex items-center justify-between px-4 py-3",
|
|
313
|
-
children: [/* @__PURE__ */ w("div", {
|
|
314
|
-
className: "flex items-center gap-3",
|
|
315
|
-
children: [/* @__PURE__ */ C("div", {
|
|
316
|
-
className: t("flex h-8 w-8 items-center justify-center rounded-full", e.amount > 0 ? "bg-green-500/10" : "bg-bg-sunken"),
|
|
317
|
-
children: /* @__PURE__ */ C(d, { className: t("h-4 w-4", e.amount > 0 ? "text-green-600 dark:text-green-400" : "text-text-secondary") })
|
|
318
|
-
}), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
319
|
-
className: "text-sm font-medium text-text-primary",
|
|
320
|
-
children: e.description
|
|
321
|
-
}), /* @__PURE__ */ C("p", {
|
|
322
|
-
className: "text-xs text-text-secondary",
|
|
323
|
-
children: new Date(e.date).toLocaleDateString("en-IN", {
|
|
324
|
-
day: "numeric",
|
|
325
|
-
month: "short",
|
|
326
|
-
year: "numeric"
|
|
327
|
-
})
|
|
328
|
-
})] })]
|
|
329
|
-
}), /* @__PURE__ */ w("span", {
|
|
330
|
-
className: t("text-sm font-semibold", e.amount > 0 ? "text-green-600 dark:text-green-400" : "text-text-primary"),
|
|
331
|
-
children: [e.amount > 0 ? "+" : "", s(Math.abs(e.amount), { minimumFractionDigits: 0 })]
|
|
332
|
-
})]
|
|
333
|
-
}, e.id))
|
|
334
|
-
})]
|
|
335
|
-
})
|
|
336
|
-
]
|
|
337
|
-
}), /* @__PURE__ */ w("div", {
|
|
338
|
-
className: "space-y-6",
|
|
339
|
-
children: [
|
|
340
|
-
/* @__PURE__ */ w("div", {
|
|
341
|
-
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
342
|
-
children: [/* @__PURE__ */ w("div", {
|
|
343
|
-
className: "mb-3 flex items-center gap-2",
|
|
344
|
-
children: [/* @__PURE__ */ C(_, { className: "h-5 w-5 text-yellow-500" }), /* @__PURE__ */ C("h3", {
|
|
345
|
-
className: "text-base font-semibold text-text-primary",
|
|
346
|
-
children: "AI Insights"
|
|
347
|
-
})]
|
|
348
|
-
}), /* @__PURE__ */ C("div", {
|
|
349
|
-
className: "space-y-3",
|
|
350
|
-
children: O.map((e) => /* @__PURE__ */ w("div", {
|
|
351
|
-
className: "rounded-lg border border-border-subtle bg-bg-sunken/50 p-3",
|
|
352
|
-
children: [/* @__PURE__ */ w("div", {
|
|
353
|
-
className: "mb-1 flex items-center justify-between",
|
|
354
|
-
children: [/* @__PURE__ */ C("h4", {
|
|
355
|
-
className: "text-xs font-semibold text-text-primary",
|
|
356
|
-
children: e.title
|
|
357
|
-
}), /* @__PURE__ */ w("span", {
|
|
358
|
-
className: "rounded-full bg-action-primary-bg/10 px-2 py-0.5 text-xs font-medium text-primary",
|
|
359
|
-
children: [e.confidence, "%"]
|
|
360
|
-
})]
|
|
361
|
-
}), /* @__PURE__ */ C("p", {
|
|
362
|
-
className: "text-xs leading-relaxed text-text-secondary",
|
|
363
|
-
children: e.description
|
|
364
|
-
})]
|
|
365
|
-
}, e.id))
|
|
366
|
-
})]
|
|
367
|
-
}),
|
|
368
|
-
/* @__PURE__ */ w("div", {
|
|
369
|
-
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
370
|
-
children: [/* @__PURE__ */ C("h3", {
|
|
371
|
-
className: "mb-3 text-base font-semibold text-text-primary",
|
|
372
|
-
children: "Quick Actions"
|
|
373
|
-
}), /* @__PURE__ */ w("div", {
|
|
374
|
-
className: "space-y-2",
|
|
375
|
-
children: [
|
|
376
|
-
/* @__PURE__ */ w("button", {
|
|
377
|
-
type: "button",
|
|
378
|
-
onClick: () => j("/investor/portfolio"),
|
|
379
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
380
|
-
children: [/* @__PURE__ */ C(y, { className: "h-4 w-4 text-text-secondary" }), "View Full Portfolio"]
|
|
381
|
-
}),
|
|
382
|
-
/* @__PURE__ */ w("button", {
|
|
383
|
-
type: "button",
|
|
384
|
-
onClick: () => j("/investor/opportunities"),
|
|
385
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
386
|
-
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-text-secondary" }), "Browse Opportunities"]
|
|
387
|
-
}),
|
|
388
|
-
/* @__PURE__ */ w("button", {
|
|
389
|
-
type: "button",
|
|
390
|
-
onClick: () => j("/investor/analytics"),
|
|
391
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
392
|
-
children: [/* @__PURE__ */ C(p, { className: "h-4 w-4 text-text-secondary" }), "Investment Analytics"]
|
|
393
|
-
}),
|
|
394
|
-
/* @__PURE__ */ w("button", {
|
|
395
|
-
type: "button",
|
|
396
|
-
onClick: () => j("/investor/profile"),
|
|
397
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-left text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
398
|
-
children: [/* @__PURE__ */ C(f, { className: "h-4 w-4 text-text-secondary" }), "View Profile"]
|
|
399
|
-
})
|
|
400
|
-
]
|
|
401
|
-
})]
|
|
402
|
-
}),
|
|
403
|
-
/* @__PURE__ */ w("div", {
|
|
404
|
-
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
405
|
-
children: [/* @__PURE__ */ C("h3", {
|
|
406
|
-
className: "mb-3 text-base font-semibold text-text-primary",
|
|
407
|
-
children: "Market Updates"
|
|
408
|
-
}), /* @__PURE__ */ w("div", {
|
|
409
|
-
className: "space-y-3",
|
|
410
|
-
children: [
|
|
411
|
-
/* @__PURE__ */ w("div", {
|
|
412
|
-
className: "border-l-4 border-green-500 pl-3",
|
|
413
|
-
children: [/* @__PURE__ */ C("h4", {
|
|
414
|
-
className: "text-xs font-semibold text-text-primary",
|
|
415
|
-
children: "Mobile Services Market Growing"
|
|
416
|
-
}), /* @__PURE__ */ C("p", {
|
|
417
|
-
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
418
|
-
children: "Mobile service industry shows 35% growth in Q4 2024"
|
|
419
|
-
})]
|
|
420
|
-
}),
|
|
421
|
-
/* @__PURE__ */ w("div", {
|
|
422
|
-
className: "border-l-4 border-blue-500 pl-3",
|
|
423
|
-
children: [/* @__PURE__ */ C("h4", {
|
|
424
|
-
className: "text-xs font-semibold text-text-primary",
|
|
425
|
-
children: "New Investment Tax Benefits"
|
|
426
|
-
}), /* @__PURE__ */ C("p", {
|
|
427
|
-
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
428
|
-
children: "Government announces SME investment incentives"
|
|
429
|
-
})]
|
|
430
|
-
}),
|
|
431
|
-
/* @__PURE__ */ w("div", {
|
|
432
|
-
className: "border-l-4 border-yellow-500 pl-3",
|
|
433
|
-
children: [/* @__PURE__ */ C("h4", {
|
|
434
|
-
className: "text-xs font-semibold text-text-primary",
|
|
435
|
-
children: "Home Services Demand Surge"
|
|
436
|
-
}), /* @__PURE__ */ C("p", {
|
|
437
|
-
className: "mt-1 text-xs leading-relaxed text-text-secondary",
|
|
438
|
-
children: "Cleaning and maintenance businesses up 25% this quarter"
|
|
439
|
-
})]
|
|
440
|
-
})
|
|
441
|
-
]
|
|
442
|
-
})]
|
|
443
|
-
})
|
|
444
|
-
]
|
|
445
|
-
})]
|
|
446
|
-
})
|
|
447
|
-
]
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
//#endregion
|
|
451
|
-
export { j as InvestorDashboard };
|
|
452
|
-
|
|
453
|
-
//# sourceMappingURL=InvestorDashboard.js.map
|