diff options
Diffstat (limited to 'frontend/src/components/layouts/MainLayout.js')
-rw-r--r-- | frontend/src/components/layouts/MainLayout.js | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/frontend/src/components/layouts/MainLayout.js b/frontend/src/components/layouts/MainLayout.js new file mode 100644 index 0000000..51e0e7e --- /dev/null +++ b/frontend/src/components/layouts/MainLayout.js @@ -0,0 +1,256 @@ +import Link from 'next/link'; +import { useAuth } from '@/context/auth-context'; +import { useCart } from '@/context/cart-context'; +import { useTheme } from '@/context/theme-context'; + +const MainLayout = ({ children }) => { + const { user, isAuthenticated, logout } = useAuth(); + const { getItemCount } = useCart(); + const { theme, toggleTheme } = useTheme(); + + const cartItemCount = getItemCount(); + + return ( + <div className="flex flex-col min-h-screen"> + {/* Header */} + <header className="bg-white dark:bg-slate-900 border-b border-gray-200 dark:border-slate-700 sticky top-0 z-10"> + <div className="container mx-auto px-4 py-3 flex items-center justify-between"> + {/* Logo */} + <Link href="/" className="text-xl font-bold text-primary"> + Restaurant + </Link> + + {/* Navigation Menu */} + <nav className="hidden md:flex items-center space-x-6"> + <Link href="/" className="hover:text-primary transition-colors"> + Home + </Link> + <Link href="/menu" className="hover:text-primary transition-colors"> + Menu + </Link> + <Link href="/reservations" className="hover:text-primary transition-colors"> + Reservations + </Link> + <Link href="/about" className="hover:text-primary transition-colors"> + About + </Link> + <Link href="/contact" className="hover:text-primary transition-colors"> + Contact + </Link> + </nav> + + {/* User Actions */} + <div className="flex items-center space-x-4"> + {/* Cart Icon */} + <Link href="/cart" className="relative"> + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + className="hover:text-primary transition-colors" + > + <circle cx="8" cy="21" r="1" /> + <circle cx="19" cy="21" r="1" /> + <path d="M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12" /> + </svg> + {cartItemCount > 0 && ( + <span className="absolute -top-2 -right-2 bg-primary text-white text-xs font-bold rounded-full h-5 w-5 flex items-center justify-center"> + {cartItemCount} + </span> + )} + </Link> + + {/* Theme Toggle */} + <button onClick={toggleTheme} className="hover:text-primary transition-colors"> + {theme === 'light' ? ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + > + <path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" /> + </svg> + ) : ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + > + <circle cx="12" cy="12" r="4" /> + <path d="M12 2v2" /> + <path d="M12 20v2" /> + <path d="m4.93 4.93 1.41 1.41" /> + <path d="m17.66 17.66 1.41 1.41" /> + <path d="M2 12h2" /> + <path d="M20 12h2" /> + <path d="m6.34 17.66-1.41 1.41" /> + <path d="m19.07 4.93-1.41 1.41" /> + </svg> + )} + </button> + + {/* Auth Actions */} + {isAuthenticated ? ( + <div className="relative group"> + <button className="flex items-center hover:text-primary transition-colors"> + <span className="mr-2">{user?.name || 'User'}</span> + <svg + xmlns="http://www.w3.org/2000/svg" + width="16" + height="16" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + > + <path d="m6 9 6 6 6-6" /> + </svg> + </button> + + {/* Dropdown Menu */} + <div className="absolute right-0 mt-2 w-48 bg-white dark:bg-slate-900 rounded-md shadow-lg border border-gray-200 dark:border-slate-700 hidden group-hover:block"> + <div className="py-1"> + <Link + href="/profile" + className="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-800" + > + Profile + </Link> + <Link + href="/orders" + className="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-800" + > + Orders + </Link> + {user?.role === 'admin' && ( + <Link + href="/admin" + className="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-800" + > + Admin Dashboard + </Link> + )} + {user?.role === 'staff' && ( + <Link + href="/staff" + className="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-800" + > + Staff Dashboard + </Link> + )} + <button + onClick={logout} + className="block w-full text-left px-4 py-2 hover:bg-gray-100 dark:hover:bg-slate-800 text-red-600" + > + Logout + </button> + </div> + </div> + </div> + ) : ( + <div className="flex items-center space-x-4"> + <Link + href="/login" + className="hover:text-primary transition-colors" + > + Login + </Link> + <Link + href="/register" + className="bg-primary text-white px-4 py-2 rounded-md hover:bg-primary/90 transition-colors" + > + Register + </Link> + </div> + )} + </div> + </div> + </header> + + {/* Main Content */} + <main className="flex-1 container mx-auto px-4 py-8">{children}</main> + + {/* Footer */} + <footer className="bg-white dark:bg-slate-900 border-t border-gray-200 dark:border-slate-700"> + <div className="container mx-auto px-4 py-8"> + <div className="grid grid-cols-1 md:grid-cols-3 gap-8"> + {/* Restaurant Info */} + <div> + <h3 className="text-lg font-bold mb-4">Restaurant</h3> + <p className="mb-2">123 Main Street</p> + <p className="mb-2">City, State 12345</p> + <p className="mb-2">Phone: (123) 456-7890</p> + <p>Email: [email protected]</p> + </div> + + {/* Opening Hours */} + <div> + <h3 className="text-lg font-bold mb-4">Opening Hours</h3> + <p className="mb-2">Monday - Friday: 9am - 10pm</p> + <p className="mb-2">Saturday: 10am - 11pm</p> + <p>Sunday: 10am - 9pm</p> + </div> + + {/* Quick Links */} + <div> + <h3 className="text-lg font-bold mb-4">Quick Links</h3> + <ul className="space-y-2"> + <li> + <Link href="/menu" className="hover:text-primary transition-colors"> + Menu + </Link> + </li> + <li> + <Link href="/reservations" className="hover:text-primary transition-colors"> + Reservations + </Link> + </li> + <li> + <Link href="/about" className="hover:text-primary transition-colors"> + About Us + </Link> + </li> + <li> + <Link href="/contact" className="hover:text-primary transition-colors"> + Contact + </Link> + </li> + <li> + <Link href="/privacy" className="hover:text-primary transition-colors"> + Privacy Policy + </Link> + </li> + </ul> + </div> + </div> + + <div className="border-t border-gray-200 dark:border-slate-700 mt-8 pt-6 text-center"> + <p>© {new Date().getFullYear()} Restaurant. All rights reserved.</p> + </div> + </div> + </footer> + </div> + ); +}; + +export default MainLayout;
\ No newline at end of file |