diff options
author | 2025-04-24 09:13:07 +0530 | |
---|---|---|
committer | 2025-04-24 09:13:07 +0530 | |
commit | caace928ac81c284629ee50942d72179d4da9784 (patch) | |
tree | b2f4e87b7a53e30ac5ac9af94cdc70c2da5bbfb9 /frontend/src/app/(main)/layout.tsx | |
parent | 50d5e6534f5e593297a09323e683c7c8b850117b (diff) | |
download | finance-caace928ac81c284629ee50942d72179d4da9784.tar.gz finance-caace928ac81c284629ee50942d72179d4da9784.tar.bz2 finance-caace928ac81c284629ee50942d72179d4da9784.zip |
feat: Fix loan API type assertion and complete core loan features
- Resolve interface conversion panic in loan handlers by correcting
user type assertions from *models.User to models.User
- Finalize loan management API integration with frontend components
- Implement remaining loan calculation logic and CRUD operations
- Connect loan display components to backend APIs as per Phase 3
- Update project status in README.md to reflect completed loan features
- Add CORS middleware configuration for frontend-backend communication
This commit completes core loan management functionality and fixes critical
type safety issues in the API handlers, enabling proper user context handling.
Diffstat (limited to 'frontend/src/app/(main)/layout.tsx')
-rw-r--r-- | frontend/src/app/(main)/layout.tsx | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/frontend/src/app/(main)/layout.tsx b/frontend/src/app/(main)/layout.tsx new file mode 100644 index 0000000..846a118 --- /dev/null +++ b/frontend/src/app/(main)/layout.tsx @@ -0,0 +1,94 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import Link from 'next/link'; +import { Button } from '@/components/ui/button'; +import { authApi, userApi } from '@/lib/api'; +import { ThemeToggle } from '@/components/shared/ThemeToggle'; + + +export default function MainLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const router = useRouter(); + const [userName, setUserName] = useState<string>(''); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + // Check if user is authenticated + const token = localStorage.getItem('token'); + if (!token) { + router.push('/login'); + return; + } + + // Fetch user profile + userApi.getProfile() + .then(data => { + setUserName(data.user.Name); + setIsLoading(false); + }) + .catch(() => { + // If error fetching profile, redirect to login + router.push('/login'); + }); + }, [router]); + + const handleLogout = () => { + authApi.logout(); + }; + + if (isLoading) { + return <div className="flex h-screen items-center justify-center">Loading...</div>; + } + + return ( + <div className="min-h-screen bg-background"> + {/* Top Navigation */} + <header className="border-b"> + <div className="w-full flex h-16 items-center px-4"> + <div className="flex items-center gap-4"> + <div className="font-semibold text-xl">Finance Management</div> + </div> + + <div className="flex items-center ms-auto gap-4"> + <span className='text-sm font-medium'>Welcome!, {userName}</span> + <ThemeToggle /> + <Button variant="ghost" size="sm" onClick={handleLogout}> + Logout + </Button> + </div> + </div> + </header> + + {/* Main Content */} + <div className="container flex flex-row"> + {/* Sidebar */} + <aside className="w-64 pt-8 pr-6"> + <nav className="space-y-2"> + <Link href="/dashboard" className="block p-2 rounded-md hover:bg-muted"> + Dashboard + </Link> + <Link href="/loans" className="block p-2 rounded-md hover:bg-muted"> + Loans + </Link> + <Link href="/goals" className="block p-2 rounded-md hover:bg-muted"> + Goals + </Link> + <Link href="/settings" className="block p-2 rounded-md hover:bg-muted"> + Settings + </Link> + </nav> + </aside> + + {/* Page Content */} + <main className="flex-1 p-8"> + {children} + </main> + </div> + </div> + ); +}
\ No newline at end of file |