← back to Wine Finder Next
src/components/SearchBar.tsx
56 lines
'use client';
import { useState } from 'react';
interface SearchBarProps {
onSearch: (query: string) => void;
isLoading?: boolean;
}
export default function SearchBar({ onSearch, isLoading = false }: SearchBarProps) {
const [query, setQuery] = useState('');
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (query.trim()) {
onSearch(query.trim());
}
};
return (
<form onSubmit={handleSubmit} className="w-full max-w-4xl mx-auto mb-8">
<div className="flex gap-3">
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search wines... (e.g., 'Caymus Cabernet', 'Opus One', 'Screaming Eagle')"
className="flex-1 px-6 py-4 text-lg bg-black text-white border-2 border-gray-600 rounded-lg focus:outline-none focus:border-purple-500 focus:ring-2 focus:ring-purple-400 transition-all placeholder-gray-400"
style={{ fontSize: '16px' }}
disabled={isLoading}
/>
<button
type="submit"
disabled={isLoading || !query.trim()}
className="px-8 py-4 bg-gradient-to-r from-purple-600 to-pink-600 text-white font-bold text-lg rounded-lg hover:from-purple-700 hover:to-pink-700 disabled:from-gray-400 disabled:to-gray-500 disabled:cursor-not-allowed transition-all shadow-lg hover:shadow-xl"
>
{isLoading ? (
<span className="flex items-center gap-2">
<svg className="animate-spin h-5 w-5" viewBox="0 0 24 24">
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" fill="none" />
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
</svg>
Searching...
</span>
) : (
'Search All Sources'
)}
</button>
</div>
<div className="mt-3 text-sm text-white text-center font-semibold">
Searching across: WineBid • Sotheby's • Zachys • Wine.com • Vivino • Wine-Searcher
</div>
</form>
);
}