Skip to content

Commit b192c67

Browse files
authored
feat: make credit dashboard the default route, remove some screens (#29)
1 parent ac548b6 commit b192c67

12 files changed

Lines changed: 146 additions & 1253 deletions

File tree

src/App.tsx

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ import { DashboardPage } from "./auth/DashboardPage";
1212

1313
// Credit-App pages
1414
import CreditDashboardPage from "./credit/pages/DashboardPage";
15-
import CreditDealsPage from "./credit/pages/DealsPage";
1615
import CreditPortfolioPage from "./credit/pages/PortfolioPage";
17-
import CreditOrdersPage from "./credit/pages/OrdersPage";
18-
import CreditPaymentsPage from "./credit/pages/InvestorPaymentsPage";
1916
import CreditAnalyticsPage from "./credit/pages/AnalyticsPage";
2017
import CreditReportsPage from "./credit/pages/ReportsPage";
2118
import CreditProfilePage from "./credit/pages/ProfilePage";
@@ -24,7 +21,6 @@ import CreditAdminUsersPage from "./credit/pages/AdminUsersPage";
2421
import CreditAdminWithdrawalPage from "./credit/pages/AdminWithdrawalPage";
2522
import CreditTransactionHistoryPage from "./credit/pages/TransactionHistoryPage";
2623
import CreditStatusPage from "./credit/pages/StatusPage";
27-
import CreditOriginatorPaymentsPage from "./credit/pages/PaymentsPage";
2824

2925
// IDR pages
3026
import IDRIndex from "./idr/pages/Index";
@@ -37,6 +33,7 @@ import IDRDealDetailPage from "./idr/pages/DealDetailPage";
3733
// Shared components
3834
import { ThemeProvider } from "./shared/contexts/ThemeContext";
3935
import { getConfig } from "./shared/config/runtime";
36+
import { AuthGuard } from "./shared/components/auth/AuthGuard";
4037

4138
// IDR Context Providers
4239
import { DealsProvider } from "./idr/lib/deals-context";
@@ -82,26 +79,11 @@ function AppContent() {
8279
<CreditDashboardPage />
8380
</ThemeProvider>
8481
} />
85-
<Route path="/credit/deals" element={
86-
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
87-
<CreditDealsPage />
88-
</ThemeProvider>
89-
} />
9082
<Route path="/credit/portfolio" element={
9183
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
9284
<CreditPortfolioPage />
9385
</ThemeProvider>
9486
} />
95-
<Route path="/credit/orders" element={
96-
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
97-
<CreditOrdersPage />
98-
</ThemeProvider>
99-
} />
100-
<Route path="/credit/payments" element={
101-
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
102-
<CreditPaymentsPage />
103-
</ThemeProvider>
104-
} />
10587
<Route path="/credit/analytics" element={
10688
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
10789
<CreditAnalyticsPage />
@@ -137,11 +119,6 @@ function AppContent() {
137119
<CreditTransactionHistoryPage />
138120
</ThemeProvider>
139121
} />
140-
<Route path="/credit/originator/payments" element={
141-
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
142-
<CreditOriginatorPaymentsPage />
143-
</ThemeProvider>
144-
} />
145122
<Route path="/credit/status" element={
146123
<ThemeProvider defaultTheme="system" storageKey="arda-theme">
147124
<CreditStatusPage />
@@ -228,7 +205,7 @@ function AppContent() {
228205
} />
229206

230207
{/* Default route */}
231-
<Route path="/" element={<Navigate to="/dashboard" replace />} />
208+
<Route path="/" element={<AuthGuard />} />
232209
</Routes>
233210
<Toaster />
234211
{isAuthenticated && (

src/auth/OnboardingPage.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ export function OnboardingPage() {
110110
timestamp: new Date().toISOString(),
111111
});
112112

113-
// User has companies, redirect to dashboard
114-
navigate("/dashboard");
113+
// User has companies, redirect to credit dashboard
114+
navigate("/credit/dashboard");
115115
return;
116116
}
117117
} else {
@@ -152,8 +152,8 @@ export function OnboardingPage() {
152152
companyType: company.type,
153153
timestamp: new Date().toISOString(),
154154
});
155-
// Company created successfully, redirect to dashboard
156-
navigate("/dashboard");
155+
// Company created successfully, redirect to credit dashboard
156+
navigate("/credit/dashboard");
157157
};
158158

159159
if (loading) {

src/auth/VerifyPage.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ export function VerifyPage() {
7676
});
7777

7878
// Redirect immediately - don't use setTimeout (React StrictMode can cancel it)
79-
console.log('[VerifyPage] Redirecting to dashboard now...');
79+
console.log('[VerifyPage] Redirecting to credit dashboard now...');
8080
console.log('[VerifyPage] Token in storage before redirect:', {
8181
hasToken: !!localStorage.getItem('arda_auth_token'),
8282
tokenLength: localStorage.getItem('arda_auth_token')?.length,
8383
});
84-
navigate('/dashboard', { replace: true });
85-
console.log('[VerifyPage] Navigate called with replace=true, URL will change to /dashboard');
84+
navigate('/credit/dashboard', { replace: true });
85+
console.log('[VerifyPage] Navigate called with replace=true, URL will change to /credit/dashboard');
8686
} else {
8787
setStatus('error');
8888
setErrorMessage(response.error?.message || 'Verification failed');

src/credit/components/dashboard/DashboardHome.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ export function DashboardHome({ user, onUserUpdate }: DashboardHomeProps) {
215215
}
216216
}, [isInvestor, isAdmin, loadAdminData]);
217217

218-
// Redirect investors to dashboard page
218+
// Redirect investors to credit dashboard page
219219
useEffect(() => {
220220
if (isInvestor && !isAdmin) {
221-
navigate('/dashboard');
221+
navigate('/credit/dashboard');
222222
}
223223
}, [isInvestor, isAdmin, navigate]);
224224

src/credit/components/layout/Navigation.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ export function Navigation({ user, onLogout }: NavigationProps) {
3636
const investorTabs = [
3737
{ path: "/credit/dashboard", label: "Dashboard", icon: LayoutDashboard },
3838
{ path: "/credit/portfolio", label: "Portfolio", icon: TrendingUp },
39-
{ path: "/credit/deals", label: "Browse Deals", icon: FileText },
40-
{ path: "/credit/orders", label: "Orders & Trades", icon: ArrowLeftRight },
41-
{ path: "/credit/payments", label: "Payments", icon: CreditCard },
4239
{ path: "/credit/analytics", label: "Intelligence", icon: Zap },
4340
{ path: "/credit/reports", label: "Reports", icon: FileBarChart },
4441
];
@@ -50,7 +47,7 @@ export function Navigation({ user, onLogout }: NavigationProps) {
5047
];
5148

5249
const originatorTabs = [
53-
{ path: "/credit/originator/payments", label: "Payments", icon: CreditCard },
50+
{ path: "/credit/dashboard", label: "Dashboard", icon: LayoutDashboard },
5451
];
5552

5653
const tabs =

src/credit/components/layout/PageLayout.tsx

Lines changed: 115 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { ReactNode } from "react";
1+
import { ReactNode, useEffect, useState } from "react";
22
import { useNavigate } from "react-router-dom";
33
import { Navigation } from "./Navigation";
44
import { clearAuthToken } from "../../../shared/auth/utils";
5+
import { User } from "../../../shared/types";
6+
import { authAPI } from "../../../shared/lib/api";
57

68
interface PageLayoutProps {
79
children: ReactNode;
@@ -13,30 +15,127 @@ interface PageLayoutProps {
1315
*/
1416
export function PageLayout({ children }: PageLayoutProps) {
1517
const navigate = useNavigate();
18+
const [user, setUser] = useState<User | null>(null);
1619

1720
const handleLogout = () => {
1821
clearAuthToken();
1922
navigate('/login');
2023
};
2124

22-
// Mock user data - in a real app this would come from TokenHandler or context
23-
// For now, using a minimal user object to satisfy Navigation component
24-
const mockUser = {
25-
id: "1",
26-
email: "user@example.com",
27-
userType: "investor" as const,
28-
firstName: undefined,
29-
lastName: undefined,
30-
createdAt: new Date().toISOString(),
31-
kycStatus: "not_submitted" as const,
32-
kycSubmittedAt: undefined,
33-
kycVerifiedAt: undefined,
34-
walletAddress: undefined,
35-
};
25+
// Load user data from API
26+
useEffect(() => {
27+
const loadUser = async () => {
28+
try {
29+
console.log("[PageLayout] Fetching current user from API...");
30+
const userResponse = await authAPI.getCurrentUser();
31+
32+
if (userResponse.success && userResponse.data) {
33+
console.log("[PageLayout] User data retrieved:", userResponse.data);
34+
35+
// Get the user ID from the response
36+
const userId = userResponse.data.id || userResponse.data.user_id || userResponse.data.userId;
37+
38+
if (userId) {
39+
// Fetch full user details
40+
const fullUserResponse = await authAPI.getUser(userId);
41+
42+
if (fullUserResponse.success && fullUserResponse.data) {
43+
console.log("[PageLayout] Full user data:", fullUserResponse.data);
44+
45+
// Transform to User type
46+
setUser({
47+
id: fullUserResponse.data.user_id || fullUserResponse.data.id,
48+
email: fullUserResponse.data.email,
49+
userType: fullUserResponse.data.user_type as "investor" | "originator" | "admin",
50+
firstName: fullUserResponse.data.first_name,
51+
lastName: fullUserResponse.data.last_name,
52+
createdAt: fullUserResponse.data.created_at,
53+
kycStatus: fullUserResponse.data.kyc_status as "pending" | "approved" | "rejected" | "not_submitted",
54+
kycSubmittedAt: fullUserResponse.data.kyc_submitted_at,
55+
kycVerifiedAt: fullUserResponse.data.kyc_verified_at,
56+
walletAddress: fullUserResponse.data.wallet_address,
57+
});
58+
} else {
59+
// Use basic user data from getMe
60+
console.warn("[PageLayout] Could not fetch full user details, using basic data");
61+
setUser({
62+
id: userId,
63+
email: userResponse.data.email || "user@example.com",
64+
userType: (userResponse.data.user_type as "investor" | "originator" | "admin") || "investor",
65+
firstName: undefined,
66+
lastName: undefined,
67+
createdAt: new Date().toISOString(),
68+
kycStatus: "not_submitted" as const,
69+
kycSubmittedAt: undefined,
70+
kycVerifiedAt: undefined,
71+
walletAddress: undefined,
72+
});
73+
}
74+
} else {
75+
// No user ID, use basic data
76+
console.warn("[PageLayout] No user ID in response, using basic data");
77+
setUser({
78+
id: "1",
79+
email: userResponse.data.email || "user@example.com",
80+
userType: (userResponse.data.user_type as "investor" | "originator" | "admin") || "investor",
81+
firstName: undefined,
82+
lastName: undefined,
83+
createdAt: new Date().toISOString(),
84+
kycStatus: "not_submitted" as const,
85+
kycSubmittedAt: undefined,
86+
kycVerifiedAt: undefined,
87+
walletAddress: undefined,
88+
});
89+
}
90+
} else {
91+
// API call failed, use fallback
92+
console.warn("[PageLayout] getMe failed, using fallback user");
93+
setUser({
94+
id: "1",
95+
email: "user@example.com",
96+
userType: "investor" as const,
97+
firstName: undefined,
98+
lastName: undefined,
99+
createdAt: new Date().toISOString(),
100+
kycStatus: "not_submitted" as const,
101+
kycSubmittedAt: undefined,
102+
kycVerifiedAt: undefined,
103+
walletAddress: undefined,
104+
});
105+
}
106+
} catch (error) {
107+
console.error("[PageLayout] Error loading user data", error);
108+
// Use fallback user
109+
setUser({
110+
id: "1",
111+
email: "user@example.com",
112+
userType: "investor" as const,
113+
firstName: undefined,
114+
lastName: undefined,
115+
createdAt: new Date().toISOString(),
116+
kycStatus: "not_submitted" as const,
117+
kycSubmittedAt: undefined,
118+
kycVerifiedAt: undefined,
119+
walletAddress: undefined,
120+
});
121+
}
122+
};
123+
124+
loadUser();
125+
}, []);
126+
127+
// Don't render navigation until user is loaded
128+
if (!user) {
129+
return (
130+
<div className="min-h-screen bg-gradient-card flex items-center justify-center">
131+
<div className="text-muted-foreground">Loading...</div>
132+
</div>
133+
);
134+
}
36135

37136
return (
38137
<div className="min-h-screen bg-gradient-card">
39-
<Navigation user={mockUser} onLogout={handleLogout} />
138+
<Navigation user={user} onLogout={handleLogout} />
40139
<main className="container mx-auto px-4 py-6">
41140
{children}
42141
</main>

src/credit/pages/DealsPage.tsx

Lines changed: 0 additions & 61 deletions
This file was deleted.

0 commit comments

Comments
 (0)