feat: add search

This commit is contained in:
gosangam
2026-05-10 20:41:58 +05:30
parent 4cbb146bc1
commit 09fbcf93ed
9 changed files with 1012 additions and 6 deletions
+22 -2
View File
@@ -1,7 +1,7 @@
"use client";
import { useState, useMemo, useRef, useEffect, useCallback } from "react";
import { useRouter } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";
import Link from "next/link";
import { Search, X, Menu, ChevronLeft, ChevronRight } from "lucide-react";
import { Input } from "@/components/ui/input";
@@ -291,8 +291,28 @@ export function GlossaryClient({
letterCounts,
}: Props) {
const router = useRouter();
const searchParams = useSearchParams();
const [query, setQuery] = useState("");
const [activeTermRaw, setActiveTerm] = useState(entries[0]?.term || "");
// Initial active term: prefer ?term= URL param, then fall back to first entry
const initialTerm = useMemo(() => {
const termParam = searchParams.get("term");
if (termParam) {
// Match case-insensitively and ignore diacritics
const normalize = (s: string) =>
s
.toLowerCase()
.normalize("NFD")
.replace(/[\u0300-\u036f]/g, "");
const normalizedParam = normalize(termParam);
const match = entries.find((e) => normalize(e.term) === normalizedParam);
if (match) return match.term;
}
return entries[0]?.term || "";
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const [activeTermRaw, setActiveTerm] = useState(initialTerm);
const contentRef = useRef<HTMLDivElement>(null);
// All term names