Вивчай
Домашнє завдання #21 ·
балівintermediate

Pokedex — каталог покемонів

Побудуй додаток-каталог покемонів з використанням компонентів, props, useState та умовного рендерингу. Дані візьмеш з безкоштовного PokeAPI.


Підготовка

npm create vite@latest pokedex -- --template react-ts
cd pokedex
npm install
npm run dev

Завдання

1. Компонент PokemonCard

Створи перевикористовуваний компонент картки покемона:

interface PokemonCardProps {
  name: string
  image: string
  types: string[]
  id: number
}

Картка показує: зображення, ім'я (з великої літери), номер (#001), список типів (як бейджики різних кольорів).

2. Завантаження даних

Використай PokeAPI для отримання перших 150 покемонів:

https://pokeapi.co/api/v2/pokemon?limit=150

Для кожного покемона потрібен окремий запит для деталей (image, types):

https://pokeapi.co/api/v2/pokemon/{id}
Порада

Завантаж всіх 150 покемонів при першому рендері через useEffect + Promise.all. Поки дані вантажаться — показуй індикатор завантаження.

3. Пошук за ім'ям

Поле введення зверху сторінки. При введенні тексту список фільтрується в реальному часі (без кнопки "Шукати").

const [search, setSearch] = useState('')

const filtered = pokemons.filter(p =>
  p.name.toLowerCase().includes(search.toLowerCase())
)

4. Фільтр за типом

Кнопки-фільтри для типів: Fire, Water, Grass, Electric, Psychic, Normal (та інші, які знайдеш у даних).

  • Клік на кнопку — показати тільки покемонів цього типу
  • Повторний клік або кнопка "Всі" — скинути фільтр
  • Активна кнопка візуально виділена

5. Порожній стан

Якщо жоден покемон не відповідає фільтрам — показати повідомлення "Покемонів не знайдено" з кнопкою "Скинути фільтри".

6. Стилізація

  • Картки в CSS Grid (responsive: 4 колонки → 2 → 1)
  • Кольори бейджиків типів (Fire — червоний, Water — синій, Grass — зелений тощо)
  • Hover-ефект на картках (тінь або збільшення)

Структура проекту

src/
├── components/
│   ├── PokemonCard.tsx
│   ├── SearchBar.tsx
│   ├── TypeFilter.tsx
│   └── Loader.tsx
├── App.tsx
└── main.tsx

Бонус

  • Клік на картку — розкрити додаткову інформацію (stats: HP, Attack, Defense) як модальне вікно або розгортку
  • Сортування за ім'ям (A-Z, Z-A) та номером
  • Лічильник: "Знайдено 23 з 150 покемонів"
  • Анімація появи карток (CSS transitions)

Критерії оцінки

КритерійБали
PokemonCard компонент з props (image, name, types)15
Завантаження даних з PokeAPI (useEffect + Promise.all)20
Пошук за ім'ям (фільтрація в реальному часі)15
Фільтр за типом (кнопки, toggle)15
Порожній стан (повідомлення + скидання фільтрів)10
Responsive CSS Grid + стилізація карток та бейджиків15
Індикатор завантаження (Loader)10
Бонус: Модальне вікно / Сортування / Лічильник / Анімації+20