Використовуй цей шаблон React-проекту як стартову точку своєї програми.
- Створені репозиторії
goit-react-hw-02-feedback
иgoit-react-hw-02-phonebook
. - При здачі домашньої роботи є два посилання: на вихідні файли та робочі
сторінки кожного завдання на
GitHub Pages
. - Під час запуску коду завдання в консолі відсутні помилки та попередження.
- Для кожного компонента є окремий файл у папці
src/components
. - Для компонентів описані
propTypes
. - Все, що компонент очікує у вигляді пропсів, передається йому під час виклику.
- JS-код чистий і зрозумілий, використовується
Prettier
. - Стилізація виконана
CSS-модулями
абоStyled Components
.
Напиши застосунок зберігання контактів телефонної книги.
Застосунок повинен складатися з форми і списку контактів. На поточному кроці реалізуй додавання імені контакту та відображення списку контактів. Застосунок не повинен зберігати контакти між різними сесіями (оновлення сторінки).
Використовуйте цю розмітку інпуту з вбудованою валідацією для імені контакту.
<input
type="text"
name="name"
pattern="^[a-zA-Zа-яА-Я]+(([' -][a-zA-Zа-яА-Я ])?[a-zA-Zа-яА-Я]*)*$"
title="Name may contain only letters, apostrophe, dash and spaces. For example Adrian, Jacob Mercer, Charles de Batz de Castelmore d'Artagnan"
required
/>
Стан, що зберігається в батьківському компоненті <App>
, обов'язково повинен
бути наступного вигляду, додавати нові властивості не можна.
state = {
contacts: [],
name: ''
}
Кожен контакт повинен бути об'єктом з властивостями name
та id
. Для
генерації ідентифікаторів використовуй будь-який відповідний пакет, наприклад
nanoid. Після завершення цього кроку,
застосунок повинен виглядати приблизно так.
Розшир функціонал застосунку, дозволивши користувачам додавати номери телефонів.
Для цього додай <input type="tel">
у форму і властивість для зберігання його
значення в стані.
state = {
contacts: [],
name: '',
number: ''
}
Використовуй цю розмітку інпуту з вбудованою валідацією для номеру контакту.
<input
type="tel"
name="number"
pattern="\+?\d{1,4}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}"
title="Phone number must be digits and can contain spaces, dashes, parentheses and can start with +"
required
/>
Після завершення цього кроку, застосунок повинен виглядати приблизно так.
Додай поле пошуку, яке можна використовувати для фільтрації списку контактів за ім'ям.
- Поле пошуку – це інпут без форми, значення якого записується у стан (контрольований елемент).
- Логіка фільтрації повинна бути нечутливою до регістру.
state = {
contacts: [],
filter: '',
name: '',
number: ''
}
Коли ми працюємо над новим функціоналом, буває зручно жорстко закодувати деякі дані у стан. Це позбавить необхідності вручну вводити дані в інтерфейсі для тестування роботи нового функціоналу. Наприклад, можна використовувати такий початковий стан.
state = {
contacts: [
{id: 'id-1', name: 'Rosie Simpson', number: '459-12-56'},
{id: 'id-2', name: 'Hermione Kline', number: '443-89-12'},
{id: 'id-3', name: 'Eden Clements', number: '645-17-79'},
{id: 'id-4', name: 'Annie Copeland', number: '227-91-26'},
],
filter: '',
name: '',
number: ''
}
Якщо твій застосунок реалізований в одному компоненті <App>
, виконай
рефакторинг, виділивши відповідні частини в окремі компоненти. У стані
кореневого компонента <App>
залишаться тільки властивості contacts
і
filter
.
state = {
contacts: [],
filter: ''
}
Достатньо виділити чотири компоненти: форма додавання контактів, список контактів, елемент списку контактів та фільтр пошуку.
Після рефакторингу кореневий компонент програми виглядатиме так.
<div>
<h1>Phonebook</h1>
<ContactForm ... />
<h2>Contacts</h2>
<Filter ... />
<ContactList ... />
</div>
Заборони користувачеві можливість додавати контакти, імена яких вже присутні у
телефонній книзі. При спробі виконати таку дію виведи alert
із попередженням.
Розшир функціонал застосунку, дозволивши користувачеві видаляти раніше збережені контакти.
Этот проект был создан при помощи Create React App. Для знакомства и настройки дополнительных возможностей обратись к документации.
Используй этот репозиторий организации GoIT как шаблон для создания репозитория
своего проекта. Для этого нажми на кнопку «Use this template»
и выбери опцию
«Create a new repository»
, как показано на изображении.
На следующем шаге откроется страница создания нового репозитория. Заполни поле
его имени, убедись что репозиторий публичный, после чего нажми кнопку
«Create repository from template»
.
После того как репозиторий будет создан, необходимо перейти в настройки
созданного репозитория на вкладку Settings
> Actions
> General
как
показано на изображении.
Проскролив страницу до самого конца, в секции «Workflow permissions»
выбери
опцию «Read and write permissions»
и поставь галочку в чекбоксе. Это
необходимо для автоматизации процесса деплоя проекта.
Теперь у тебя есть личный репозиторий проекта, со структурой файлов и папок репозитория-шаблона. Далее работай с ним как с любым другим личным репозиторием, клонируй его себе на компьютер, пиши код, делай коммиты и отправляй их на GitHub.
- Убедись что на компьютере установлена LTS-версия Node.js. Скачай и установи её если необходимо.
- Установи базовые зависимости проекта командой
npm install
. - Запусти режим разработки, выполнив команду
npm start
. - Перейди в браузере по адресу http://localhost:3000. Эта страница будет автоматически перезагружаться после сохранения изменений в файлах проекта.
Продакшн версия проекта будет автоматически проходить линтинг, собираться и
деплоиться на GitHub Pages, в ветку gh-pages
, каждый раз когда обновляется
ветка main
. Например, после прямого пуша или принятого пул-реквеста. Для этого
необходимо в файле package.json
отредактировать поле homepage
, заменив
your_username
и your_repo_name
на свои, и отправить изменения на GitHub.
"homepage": "https://your_username.github.io/your_repo_name/"
Далее необходимо зайти в настройки GitHub-репозитория (Settings
> Pages
) и
выставить раздачу продакшн версии файлов из папки /root
ветки gh-pages
, если
это небыло сделано автоматически.
Статус деплоя крайнего коммита отображается иконкой возле его идентификатора.
- Желтый цвет - выполняется сборка и деплой проекта.
- Зеленый цвет - деплой завершился успешно.
- Красный цвет - во время линтинга, сборки или деплоя произошла ошибка.
Более детальную информацию о статусе можно посмотреть кликнув по иконке, и в
выпадающем окне перейти по ссылке Details
.
Через какое-то время, обычно пару минут, живую страницу можно будет посмотреть
по адресу указанному в отредактированном свойстве homepage
. Например, вот
ссылка на живую версию для этого репозитория
https://goitacademy.github.io/react-homework-template.
Если открывается пустая страница, убедись что во вкладке Console
нет ошибок
связанных с неправильными путями к CSS и JS файлам проекта (404). Скорее
всего у тебя неправильное значение свойства homepage
в файле package.json
.
Если приложение использует библиотеку react-router-dom
для маршрутизации,
необходимо дополнительно настроить компонент <BrowserRouter>
, передав в пропе
basename
точное название твоего репозитория. Слеш в начале строки обязателен.
<BrowserRouter basename="/your_repo_name">
<App />
</BrowserRouter>
- После каждого пуша в ветку
main
GitHub-репозитория, запускается специальный скрипт (GitHub Action) из файла.github/workflows/deploy.yml
. - Все файлы репозитория копируются на сервер, где проект инициализируется и проходит линтинг и сборку перед деплоем.
- Если все шаги прошли успешно, собранная продакшн версия файлов проекта
отправляется в ветку
gh-pages
. В противном случае, в логе выполнения скрипта будет указано в чем проблема.