"use client" import getEnv from "@/lib/env-entry" import { cn } from "@/lib/utils" import { useTranslations } from "next-intl" import { createRef, useEffect, useRef, useState } from "react" export default function Switch({ allTag, nowTag, tagCountMap, onTagChange, }: { allTag: string[] nowTag: string tagCountMap: Record onTagChange: (tag: string) => void }) { const scrollRef = useRef(null) const tagRefs = useRef(allTag.map(() => createRef())) const t = useTranslations("ServerListClient") const [indicator, setIndicator] = useState<{ x: number; w: number }>({ x: 0, w: 0, }) useEffect(() => { const savedTag = sessionStorage.getItem("selectedTag") if (savedTag && allTag.includes(savedTag)) { onTagChange(savedTag) } }, [allTag, onTagChange]) useEffect(() => { const container = scrollRef.current if (!container) return const isOverflowing = container.scrollWidth > container.clientWidth if (!isOverflowing) return const onWheel = (e: WheelEvent) => { e.preventDefault() container.scrollLeft += e.deltaY } container.addEventListener("wheel", onWheel, { passive: false }) return () => { container.removeEventListener("wheel", onWheel) } }, []) useEffect(() => { const currentTagElement = tagRefs.current[allTag.indexOf(nowTag)]?.current if (currentTagElement) { setIndicator({ x: currentTagElement.offsetLeft, w: currentTagElement.offsetWidth, }) } }, [nowTag]) useEffect(() => { const currentTagElement = tagRefs.current[allTag.indexOf(nowTag)]?.current const container = scrollRef.current if (currentTagElement && container) { const containerRect = container.getBoundingClientRect() const tagRect = currentTagElement.getBoundingClientRect() const scrollLeft = currentTagElement.offsetLeft - (containerRect.width - tagRect.width) / 2 container.scrollTo({ left: Math.max(0, scrollLeft), behavior: "smooth", }) } }, [nowTag]) return (
{indicator.w > 0 && (
)} {allTag.map((tag, index) => (
{ onTagChange(tag) sessionStorage.setItem("selectedTag", tag) }} className={cn( "relative cursor-pointer rounded-3xl px-2.5 py-[8px] text-[13px] font-[600]", "transition-all duration-500 ease-in-out text-stone-400 dark:text-stone-500 hover:text-stone-950 hover:dark:text-stone-50", { "text-stone-950 dark:text-stone-50": nowTag === tag, }, )} >
{tag === "defaultTag" ? t("defaultTag") : tag}{" "} {getEnv("NEXT_PUBLIC_ShowTagCount") === "true" && tag !== "defaultTag" && (
{tagCountMap[tag]}
)}
))}
) }