crush-level-web/src/components/layout/Topbar.tsx

77 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-11-13 08:38:25 +00:00
"use client"
import React, { useEffect, useState } from "react"
import { cn } from "@/lib/utils"
import Image from "next/image"
import { Button } from "../ui/button"
import { useCurrentUser } from "@/hooks/auth"
import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar"
import Link from "next/link"
import { usePathname, useSearchParams, useRouter } from "next/navigation"
import { useMainLayout } from "@/context/mainLayout"
function Topbar () {
const [isBlur, setIsBlur] = useState(false)
const { data: user } = useCurrentUser()
const router = useRouter()
const pathname = usePathname();
const searchParams = useSearchParams();
const { isSidebarExpanded } = useMainLayout();
const searchParamsString = searchParams.toString()
const redirectURL = `${pathname}${searchParamsString ? `?${searchParamsString}` : ''}`
const isImageCreatePage = ['/generate/image', '/generate/image-2-image', '/generate/image-edit', '/generate/image-2-background'].includes(pathname);
useEffect(() => {
function handleScroll (event: Event) {
const dom = event.target as HTMLElement
setIsBlur(dom.scrollTop > 0)
}
const dom = document.getElementById("main-content")
if (dom) {
dom.addEventListener("scroll", handleScroll, { passive: true })
}
return () => {
if (dom) {
dom.removeEventListener("scroll", handleScroll)
}
}
}, [])
useEffect(() => {
if (user && user.cpUserInfo) {
router.push("/login/fields?redirect=" + encodeURIComponent(redirectURL))
}
}, [user])
return (
<header className={cn("fixed top-0 left-20 right-0 z-40 flex h-16 items-center justify-between px-8 transition-all", {
"backdrop-blur-[10px]": isBlur,
"left-80": isSidebarExpanded,
"left-0": isImageCreatePage,
})}>
{isBlur && <div className="absolute inset-0 bg-background-default opacity-85" />}
<div className="relative inset-0 flex items-center justify-between w-full">
<div className="w-[103.6px] h-8">
<Link href="/">
<Image src="/logo.svg" alt="logo" width={103.6} height={32} />
</Link>
</div>
{user ? (
<Link href="/profile">
<Avatar className="cursor-pointer size-8">
<AvatarImage className="object-cover" src={user.headImage} alt={user.nickname} width={32} height={32} />
<AvatarFallback>{user.nickname?.slice(0, 1)}</AvatarFallback>
</Avatar>
</Link>
) : (
<Link href={`/login?redirect=${encodeURIComponent(redirectURL)}`}>
<Button size="small">Login in or Sign up</Button>
</Link>
)}
</div>
</header>
)
}
export default Topbar