aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/src/app/(main)/layout.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/app/(main)/layout.tsx')
-rw-r--r--frontend/src/app/(main)/layout.tsx94
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