import type { ChangeEventHandler } from 'react' import { useCallback, useRef, useState, } from 'react' import { useTranslation } from 'react-i18next' import { useEducation } from './hooks' import Input from '@/app/components/base/input' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' type SearchInputProps = { value?: string onChange: (value: string) => void } const SearchInput = ({ value, onChange, }: SearchInputProps) => { const { t } = useTranslation() const [open, setOpen] = useState(false) const { schools, setSchools, querySchoolsWithDebounced, handleUpdateSchools, hasNext, } = useEducation() const pageRef = useRef(0) const valueRef = useRef(value) const handleSearch = useCallback((debounced?: boolean) => { const keywords = valueRef.current const page = pageRef.current if (debounced) { querySchoolsWithDebounced({ keywords, page, }) return } handleUpdateSchools({ keywords, page, }) }, [querySchoolsWithDebounced, handleUpdateSchools]) const handleValueChange: ChangeEventHandler = useCallback((e) => { setOpen(true) setSchools([]) pageRef.current = 0 const inputValue = e.target.value valueRef.current = inputValue onChange(inputValue) handleSearch(true) }, [onChange, handleSearch, setSchools]) const handleScroll = useCallback((e: Event) => { const target = e.target as HTMLDivElement const { scrollTop, scrollHeight, clientHeight, } = target if (scrollTop + clientHeight >= scrollHeight - 5 && scrollTop > 0 && hasNext) { pageRef.current += 1 handleSearch() } }, [handleSearch, hasNext]) return ( { !!schools.length && value && (
{ schools.map((school, index) => (
{ onChange(school) setOpen(false) }} > {school}
)) }
) }
) } export default SearchInput