/** * CommoditySearch - Commodity selection with search, recent history, and quick picks. * * Features: * - Searchable dropdown for commodity selection * - Recent searches stored in localStorage (up to 5) * - Popular commodities quick-select chips with emojis */ import { useState, useCallback, useRef, useEffect } from "react"; import PropTypes from "prop-types"; import { MagnifyingGlassIcon, ClockIcon, } from "@heroicons/react/24/outline"; import storage from "@utils/storage"; const RECENT_KEY = "farmhelp_recent_commodities"; const MAX_RECENT = 5; // Commodity emojis mapping const COMMODITY_EMOJIS = { Wheat: "\uD83C\uDF3E", Rice: "\uD83C\uDF5A", Paddy: "\uD83C\uDF3E", Cotton: "\uD83E\uDDF6", Onion: "\uD83E\uDDC5", Potato: "\uD83E\uDD54", Tomato: "\uD83C\uDF45", Soyabean: "\uD83C\uDF31", Maize: "\uD83C\uDF3D", Corn: "\uD83C\uDF3D", Groundnut: "\uD83E\uDD5C", Chilli: "\uD83C\uDF36\uFE0F", Banana: "\uD83C\uDF4C", Apple: "\uD83C\uDF4E", Mango: "\uD83E\uDD6D", Grapes: "\uD83C\uDF47", Orange: "\uD83C\uDF4A", Cabbage: "\uD83E\uDD6C", Carrot: "\uD83E\uDD55", Cauliflower: "\uD83E\uDD66", Garlic: "\uD83E\uDDC4", Ginger: "\uD83E\uDED0", Lemon: "\uD83C\uDF4B", Peas: "\uD83E\uDED1", Brinjal: "\uD83C\uDF46", Cucumber: "\uD83E\uDD52", Spinach: "\uD83E\uDD6C", Mustard: "\uD83C\uDF3B", Bajra: "\uD83C\uDF3E", Jowar: "\uD83C\uDF3E", Barley: "\uD83C\uDF3E", Pulses: "\uD83E\uDED8", Oilseeds: "\uD83C\uDF3B", Millets: "\uD83C\uDF3E", Cumin: "\uD83E\uDED2", Coriander: "\uD83C\uDF3F", Turmeric: "\uD83D\uDFE1", Coconut: "\uD83E\uDD65", Arecanut: "\uD83C\uDF30", Cashew: "\uD83C\uDF30", Coffee: "\u2615", Tea: "\uD83C\uDF75", Pepper: "\uD83C\uDF36\uFE0F", Cardamom: "\uD83C\uDF3F", Jute: "\uD83E\uDDF6", Tobacco: "\uD83C\uDF43", }; // Get emoji for a commodity (with fallback) function getCommodityEmoji(commodity) { return COMMODITY_EMOJIS[commodity] || "\uD83C\uDF3F"; } const POPULAR_COMMODITIES = [ "Wheat", "Rice", "Cotton", "Onion", "Potato", "Tomato", "Soyabean", "Groundnut", ]; function getRecentCommodities() { return storage.get(RECENT_KEY, []); } function saveRecentCommodity(commodity) { const recent = getRecentCommodities().filter((c) => c !== commodity); recent.unshift(commodity); storage.set(RECENT_KEY, recent.slice(0, MAX_RECENT)); } function CommoditySearch({ commodities = [], value = "", onSelect, loading = false, }) { const [query, setQuery] = useState(""); const [isOpen, setIsOpen] = useState(false); const containerRef = useRef(null); const inputRef = useRef(null); const recentCommodities = getRecentCommodities(); // Close on outside click useEffect(() => { function handleClickOutside(e) { if (containerRef.current && !containerRef.current.contains(e.target)) { setIsOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); // Build commodity names from the list or use popular as fallback const commodityNames = commodities.length > 0 ? commodities.map((c) => (typeof c === "string" ? c : c.commodity || c.name)) : POPULAR_COMMODITIES; const filtered = query ? commodityNames.filter((name) => name.toLowerCase().includes(query.toLowerCase()), ) : commodityNames; const handleSelect = useCallback( (commodity) => { saveRecentCommodity(commodity); setQuery(""); setIsOpen(false); onSelect(commodity); }, [onSelect], ); const handleInputChange = useCallback((e) => { setQuery(e.target.value); setIsOpen(true); }, []); const handleFocus = useCallback(() => { setIsOpen(true); }, []); const handleKeyDown = useCallback( (e) => { if (e.key === "Enter" && filtered.length > 0) { handleSelect(filtered[0]); } if (e.key === "Escape") { setIsOpen(false); } }, [filtered, handleSelect], ); return (
Popular Commodities