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

DevProfile — профіль розробника

Побудуй додаток, де користувач заповнює форму і бачить в реальному часі, як виглядає його картка розробника. Весь додаток підтримує перемикання між темною та світлою темами через Context API.


Підготовка

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

Завдання

1. ThemeContext

Створи контекст для теми:

src/context/ThemeContext.tsx
  • Два стани: 'light' та 'dark'
  • Custom hook useTheme() для зручного доступу
  • Тема зберігається в localStorage і відновлюється при перезавантаженні
  • ThemeProvider обгортає весь додаток

2. Кнопка перемикання теми

В header додатку — кнопка-toggle:

  • Світла тема: показує іконку місяця (або текст "Темна тема")
  • Темна тема: показує іконку сонця (або текст "Світла тема")
  • Весь інтерфейс змінює кольори при перемиканні

3. Форма профілю

Поля форми (всі controlled через useState):

ПолеТипВалідація
Ім'яtextОбов'язкове, мін. 2 символи
EmailemailОбов'язкове, формат email
URL аватараurlНеобов'язкове
ПосадаtextОбов'язкове
Рівень досвідуselectJunior / Middle / Senior
НавичкиcheckboxesМін. 1 обрана (React, TypeScript, CSS, Node.js, Git, Figma)
Про себеtextareaНеобов'язкове, макс. 300 символів

Валідація:

  • Показувати помилки під кожним полем (червоний текст)
  • Валідація при blur (втраті фокусу) і при submit
  • Кнопка "Створити профіль" неактивна, поки є помилки

4. Прев'ю картки (real-time)

Паралельно з формою (або під нею) — компонент ProfileCard, що відображає введені дані в реальному часі:

┌─────────────────────────┐
│   [Avatar]              │
│   Олена Коваленко       │
│   Frontend Developer    │
│   ● Senior              │
│                         │
│   React  TypeScript CSS │
│                         │
│   "Люблю чистий код"    │
│   olena@example.com     │
└─────────────────────────┘
  • Якщо аватар не вказано — показувати заглушку з ініціалами
  • Кольорові бейджики для навичок
  • Стиль картки залежить від обраної теми

5. Стан після submit

Після успішного submit:

  • Форма зникає
  • Показується фінальна картка профілю у збільшеному вигляді
  • Кнопка "Редагувати" — повертає до форми з заповненими даними

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

src/
├── components/
│   ├── Header.tsx
│   ├── ProfileForm.tsx
│   ├── ProfileCard.tsx
│   └── ThemeToggle.tsx
├── context/
│   └── ThemeContext.tsx
├── App.tsx
└── main.tsx

Бонус

  • Додай валідацію email через regex та перевірку формату URL
  • Анімація перемикання теми (плавний перехід кольорів через CSS transition)
  • "Скопіювати профіль" — кнопка, що копіює дані профілю як текст у буфер обміну
  • Збереження профілю в localStorage, щоб він зберігався між сесіями

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

КритерійБали
ThemeContext + ThemeProvider + useTheme hook15
Перемикання теми + збереження в localStorage10
Форма з controlled компонентами (всі поля)15
Валідація (обов'язкові поля, email, мін. 1 навичка)15
ProfileCard з real-time прев'ю15
Стан після submit (фінальна картка + "Редагувати")10
Стилізація (темна/світла тема, responsive)10
Чистий код (типи, структура файлів)10
Бонус: Regex валідація / Анімації / Копіювання / localStorage+20