"use client"; import { cn } from "@/lib/utils"; import { IconMenu2, IconX, IconBrandGoogleFilled } from "@tabler/icons-react"; import { motion, AnimatePresence, useScroll, useMotionValueEvent, } from "framer-motion"; import Link from "next/link"; import React, { useRef, useState } from "react"; import { Button } from "./ui/button"; import { Logo } from "./Logo"; import { ThemeTogglerComponent } from "./theme/theme-toggle"; interface NavbarProps { navItems: { name: string; link: string; }[]; visible: boolean; } export const Navbar = () => { const navItems = [ { name: "", link: "/", }, // { // name: "Product", // link: "/#product", // }, // { // name: "Pricing", // link: "/#pricing", // }, ]; const ref = useRef(null); const { scrollY } = useScroll({ target: ref, offset: ["start start", "end start"], }); const [visible, setVisible] = useState(false); useMotionValueEvent(scrollY, "change", (latest) => { if (latest > 100) { setVisible(true); } else { setVisible(false); } }); return ( ); }; const DesktopNav = ({ navItems, visible }: NavbarProps) => { const [hoveredIndex, setHoveredIndex] = useState(null); const handleGoogleLogin = () => { // Redirect to Google OAuth authorization URL fetch(`${process.env.NEXT_PUBLIC_FASTAPI_BACKEND_URL}/auth/google/authorize`) .then((response) => { if (!response.ok) { throw new Error('Failed to get authorization URL'); } return response.json(); }) .then((data) => { if (data.authorization_url) { window.location.href = data.authorization_url; } else { console.error('No authorization URL received'); } }) .catch((error) => { console.error('Error during Google login:', error); }); }; return ( setHoveredIndex(null)} animate={{ backdropFilter: "blur(16px)", background: visible ? "rgba(var(--background-rgb), 0.8)" : "rgba(var(--background-rgb), 0.6)", width: visible ? "38%" : "80%", height: visible ? "48px" : "64px", y: visible ? 8 : 0, }} initial={{ width: "80%", height: "64px", background: "rgba(var(--background-rgb), 0.6)", }} transition={{ type: "spring", stiffness: 400, damping: 30, }} className={cn( "hidden lg:flex flex-row self-center items-center justify-between py-2 mx-auto px-6 rounded-full relative z-[60] backdrop-saturate-[1.8]", visible ? "border dark:border-white/10 border-gray-300/30" : "border-0" )} style={{ "--background-rgb": "var(--tw-dark) ? '0, 0, 0' : '255, 255, 255'", } as React.CSSProperties} >
SurfSense
{navItems.map((navItem, idx) => ( setHoveredIndex(idx)} className="relative" > {navItem.name} {hoveredIndex === idx && ( )} ))}
{!visible && ( )}
); }; const MobileNav = ({ navItems, visible }: NavbarProps) => { const [open, setOpen] = useState(false); const handleGoogleLogin = () => { // Redirect to the login page window.location.href = "./login"; }; return ( <>
{open ? ( setOpen(!open)} /> ) : ( setOpen(!open)} /> )}
{open && ( {navItems.map( (navItem: { link: string; name: string }, idx: number) => ( setOpen(false)} className="relative dark:text-white/90 text-gray-800 hover:text-gray-900 dark:hover:text-white transition-colors" > {navItem.name} ) )} )}
); };