React Typeahead Search

import { useState } from "react";

const allCities = [
  {
    city: "New York",
    val: "www.newyork.com",
  },
  {
    city: "New York City",
    val: "www.newyorkcity.com",
  },
  {
    city: "Rome",
    val: "www.rome.com",
  },
  {
    city: "RomeCity",
    val: "www.romecity.com",
  },
];

export default function App() {
  const [cities, setCities] = useState([]);
  const [selectedCity, setSelectedCity] = useState({});

  const handleChange = (e) => {
    console.log(e.target.value);
    input = e.target.value;

    if (input.trim()) {
      try {
        // Create a regex to match city names starting with the input
        const regex = new RegExp(`^${input}`, "i");
        const filteredCities = allCities.filter((city) =>
          regex.test(city.city)
        );
        setCities(filteredCities);
      } catch (err) {
        console.error("Invalid regex input:", err.message);
        setCities([]);
      }
    } else {
      setCities([]);
    }
  };

  return (
    <div className="App">
      <input onChange={(e) => handleChange(e)} />
      <ul>
        {cities.map((city) => {
          return (
            <li key={city.city}>
              {city.city}
              <button onClick={() => setSelectedCity(city)}>set city</button>
            </li>
          );
        })}
      </ul>
      <div>Selected city</div>
      {selectedCity && (
        <div>
          {selectedCity.city}, {selectedCity.val}{" "}
        </div>
      )}
    </div>
  );
}

Last updated