listing-facebook/client/app/components/input-search.tsx

46 lines
1.3 KiB
TypeScript

import { Search, X } from "lucide-react";
import { useState, useEffect, type ComponentProps } from "react";
import { Button } from "./ui/button";
import { Input } from "./ui/input";
import { cn } from "~/lib/utils";
export default function InputSearch(props: ComponentProps<"input">) {
const [value, setValue] = useState(String(props.value ?? ""));
// Đồng bộ khi value từ props thay đổi
useEffect(() => {
setValue(String(props.value ?? ""));
}, [props.value]);
const handleChange = (newValue: string) => {
setValue(newValue);
props.onChange?.({
...({} as any), // Type trick
target: { value: newValue },
} as React.ChangeEvent<HTMLInputElement>);
};
return (
<div className="relative">
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400" />
<Input
{...props}
className={cn("pl-10", props.className)}
onChange={(e) => handleChange(e.target.value)}
value={value}
/>
{value.length > 0 && (
<Button
type="button"
variant="ghost"
size="sm"
className="absolute right-0 top-0 h-full px-3 py-2 hover:bg-transparent"
onClick={() => handleChange("")}
>
<X className="h-4 w-4" />
</Button>
)}
</div>
);
}