TypeScript · 36 строк
Хук useAdSearch грузит объявления по 20 штук и подгружает следующую страницу, когда пользователь докрутил до низа. Запрос и город меняются из строки поиска и фильтра.
Отметьте строки с ошибками.
В работе: Выдача поиска в веб-версии: самая посещаемая страница сайта.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах Авито: поиск и выдача объявлений. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
import { useEffect, useState } from "react";type Ad = { id: number; title: string; price: number; city: string };export function useAdSearch(query: string, city: string) {const [ads, setAds] = useState<Ad[]>([]);const [page, setPage] = useState(1);const [hasMore, setHasMore] = useState(true);useEffect(() => {setPage(1);setAds([]);}, [query]);useEffect(() => {if (query.length < 2) return;fetch(`/api/search?q=${query}&city=${city}&page=${page}`).then((r) => r.json()).then((data: { items: Ad[]; total: number }) => {setAds([...ads, ...data.items]);setHasMore(page * 20 <= data.total);});}, [query, city, page]);useEffect(() => {const onScroll = () => {if (hasMore && window.innerHeight + window.scrollY >= document.body.offsetHeight - 300) {setPage(page + 1);}};window.addEventListener("scroll", onScroll);return () => window.removeEventListener("scroll", onScroll);}, []);return { ads, hasMore };}