47 lines
1.2 KiB
TypeScript
Raw Permalink Normal View History

"use client";
import { Input } from "@/components/ui/input";
import { cn } from "@/lib/utils";
import { usePathname, useRouter, useSearchParams } from "next/navigation";
import { useRef, useTransition } from "react";
export default function Search({ disabled }: { disabled?: boolean }) {
const inputRef = useRef<HTMLInputElement>(null);
const { replace } = useRouter();
const pathname = usePathname();
const [isPending, startTransition] = useTransition();
const searchParams = useSearchParams();
const searchQuery = searchParams.get("query");
function handleSearch(term: string) {
const params = new URLSearchParams(searchParams.toString());
if (term) {
params.set("query", term);
params.set("page", "1");
} else {
params.delete("query");
}
startTransition(() => {
replace(`${pathname}?${params.toString()}`);
});
}
return (
<Input
ref={inputRef}
placeholder="Search..."
type="search"
className={cn("w-fit", isPending && "animate-pulse")}
name="search"
id="search"
defaultValue={searchQuery ? searchQuery : ""}
disabled={disabled}
spellCheck={false}
onChange={(e) => handleSearch(e.target.value)}
/>
);
}