diff --git a/src/App.tsx b/src/App.tsx index a88cd7a6d..64f8ed5c9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,73 +1,103 @@ -import React from 'react'; +import React, { useMemo, useState } from 'react'; +import debounce from 'lodash.debounce'; import './App.scss'; import { peopleFromServer } from './data/people'; -export const App: React.FC = () => { - const { name, born, died } = peopleFromServer[0]; +type Person = (typeof peopleFromServer)[number]; + +type Props = { + onSelected?: (person: Person) => void; + delay?: number; +}; + +export const App: React.FC = ({ onSelected, delay = 300 }) => { + const [query, setQuery] = useState(''); + const [debouncedQuery, setDebouncedQuery] = useState(''); + const [isOpen, setIsOpen] = useState(false); + const [selectedPerson, setSelectedPerson] = useState(null); + + const normalizedQuery = debouncedQuery.trim().toLowerCase(); + + let filteredPeople = peopleFromServer; + + if (normalizedQuery) { + filteredPeople = peopleFromServer.filter(person => { + return person.name.toLowerCase().includes(normalizedQuery); + }); + } + + const applyDebounce = useMemo(() => { + return debounce((value: string) => { + setDebouncedQuery(value); + }, delay); + }, []); return (

- {`${name} (${born} - ${died})`} + {selectedPerson + ? `${selectedPerson.name} (${selectedPerson.born} - ${selectedPerson.died})` + : 'No selected person'}

-
+
{ + setQuery(event.target.value); + setSelectedPerson(null); + + applyDebounce(event.target.value); + setIsOpen(true); + }} + onFocus={() => setIsOpen(true)} />
-
-

Pieter Haverbeke

-
+ {filteredPeople.map(person => ( +
{ + setSelectedPerson(person); + setQuery(person.name); + setDebouncedQuery(person.name); + setIsOpen(false); -
-

Pieter Bernard Haverbeke

-
- -
-

Pieter Antone Haverbeke

-
- -
-

Elisabeth Haverbeke

-
- -
-

Pieter de Decker

-
- -
-

Petronella de Decker

-
- -
-

Elisabeth Hercke

-
+ onSelected?.(person); + }} + > +

{person.name}

+
+ ))}
-
-

No matching suggestions

-
+ role="alert" + data-cy="no-suggestions-message" + > +

No matching suggestions

+
+ )}
);