Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 81 additions & 50 deletions frontend/src/components/Layout.jsx
Original file line number Diff line number Diff line change
@@ -1,74 +1,71 @@
import React from 'react';
import { Outlet, NavLink, useNavigate } from 'react-router-dom'; // 1. Import Link
import useAuth from '../hooks/useAuth';
import CurrencySelector from './CurrencySelector';
import ThemeToggle from './ThemeToggle';
import React from "react";
import { Outlet, NavLink, useNavigate } from "react-router-dom";
import useAuth from "../hooks/useAuth";
import CurrencySelector from "./CurrencySelector";
import ThemeToggle from "./ThemeToggle";

const Layout = () => {
const { logout } = useAuth();
const navigate = useNavigate();


const getNavLinkClass = ({ isActive }) => {
const baseClasses = 'px-3 py-2 rounded-md text-sm font-medium';
const baseClasses =
"px-3 py-2 rounded-md text-sm font-medium transition-all duration-200";
if (isActive) {
return `${baseClasses} bg-blue-600 text-white`;
return `${baseClasses} bg-blue-600 text-white shadow-sm`;
}
return `${baseClasses} text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 hover:text-black dark:hover:text-white`;
return `${baseClasses} text-gray-700 dark:text-gray-300 hover:bg-blue-100 dark:hover:bg-gray-700 hover:text-blue-700 dark:hover:text-white`;
};

const handleClick = (e) => {
navigate("/");
const handleLogoClick = () => {
navigate("/");
};


return (
<div className="min-h-screen bg-gray-100 dark:bg-gray-900">
<nav className="bg-white dark:bg-gray-800 shadow-md">
<div className="min-h-screen flex flex-col bg-gray-100 dark:bg-gray-900 transition-all duration-300">
{/* ======= NAVBAR ======= */}
<nav className="bg-white dark:bg-gray-800 shadow-md sticky top-0 z-50">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex items-center justify-between h-16">
<div className="flex items-center">
{/* 2. Wrap the span in a Link to the dashboard */}
<span
onClick={handleClick}
className="font-bold text-xl text-blue-600 dark:text-blue-400 cursor-pointer transition-all duration-500 hover:scale-105 hover:drop-shadow-lg hover:text-blue-500 dark:hover:text-blue-300"
title="Go to home"
>
Paisable
</span>
{/* Left: Logo + Nav Links */}
<div className="flex items-center space-x-8">
<span
onClick={handleLogoClick}
className="font-bold text-xl text-blue-600 dark:text-blue-400 cursor-pointer transition-all duration-300 hover:scale-105 hover:text-blue-500 dark:hover:text-blue-300"
title="Go to Home"
>
Paisable
</span>

<div className="hidden md:block">
<div className="ml-10 flex items-baseline space-x-4">
<NavLink to="/dashboard" className={getNavLinkClass}>
Dashboard
</NavLink>
<NavLink to="/transactions" className={getNavLinkClass}>
Transactions
</NavLink>
<NavLink to="/receipts" className={getNavLinkClass}>
Receipts
</NavLink>
<NavLink to="/settings" className={getNavLinkClass}>
Settings
</NavLink>
<NavLink to="/budgets" className={getNavLinkClass}>
Budgets
</NavLink>
<NavLink
to="/recurring-transactions"
className={getNavLinkClass}
>
Recurring Transactions
</NavLink>
</div>
<div className="hidden md:flex space-x-4">
<NavLink to="/dashboard" className={getNavLinkClass}>
Dashboard
</NavLink>
<NavLink to="/transactions" className={getNavLinkClass}>
Transactions
</NavLink>
<NavLink to="/budgets" className={getNavLinkClass}>
Budgets
</NavLink>
<NavLink to="/recurring-transactions" className={getNavLinkClass}>
Recurring
</NavLink>
<NavLink to="/receipts" className={getNavLinkClass}>
Receipts
</NavLink>
<NavLink to="/settings" className={getNavLinkClass}>
Settings
</NavLink>
</div>
</div>

{/* Right: Utilities */}
<div className="flex items-center gap-4">
<ThemeToggle />
<CurrencySelector />
<button
onClick={logout}
className="bg-red-500 text-white px-3 py-2 rounded-md text-sm font-medium hover:bg-red-600"
className="bg-red-500 text-white px-3 py-2 rounded-md text-sm font-medium hover:bg-red-600 transition-all duration-200"
>
Logout
</button>
Expand All @@ -77,11 +74,45 @@ const Layout = () => {
</div>
</nav>

<main>
<div className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
{/* ======= MAIN CONTENT ======= */}
<main className="flex-grow">
<div className="max-w-7xl mx-auto py-8 sm:px-6 lg:px-8">
<Outlet />
</div>
</main>

{/* ======= FOOTER ======= */}
<footer className="bg-white dark:bg-gray-800 shadow-inner mt-8">
<div className="max-w-7xl mx-auto px-4 py-6 sm:px-6 lg:px-8 text-center md:text-left text-sm text-gray-600 dark:text-gray-400 flex flex-col md:flex-row items-center justify-between space-y-2 md:space-y-0">
<p>
© {new Date().getFullYear()}{" "}
<span className="font-semibold text-blue-600 dark:text-blue-400">
Paisable
</span>
. All rights reserved.
</p>
<div className="flex space-x-4">
<NavLink
to="/privacy"
className="hover:text-blue-500 dark:hover:text-blue-300 transition-colors duration-200"
>
Privacy Policy
</NavLink>
<NavLink
to="/terms"
className="hover:text-blue-500 dark:hover:text-blue-300 transition-colors duration-200"
>
Terms of Use
</NavLink>
<NavLink
to="/contact"
className="hover:text-blue-500 dark:hover:text-blue-300 transition-colors duration-200"
>
Contact
</NavLink>
</div>
</div>
</footer>
</div>
);
};
Expand Down
Loading