- Дано сломанное приложение: https://codesandbox.io/p/sandbox/testovoe-zadanie-forked-jwmrk
- Мое исправленное приложение: https://codesandbox.io/p/sandbox/testovoe-zadanie-forked-rrr73v?workspaceId=ws_H9rA1zRPyv95ese4YS7gsr
В первую очередь нужно исправить два бага в Root.tsx
, чтобы модалка начала открываться:
- Метод
toggle
мутирует состояние напрямую, React не отслеживает такие изменения, поэтому ничего не происходит. Правильно было бы так:this.setState({ opened })
- Метод
invite
мутирует массивinvites
напрямую:invites.push(name)
. Для того, чтобы не нарушать приницип иммутабельности нужно использовать спред-оператор:
this.setState((prevState) => ({
invites: [...prevState.invites, name],
}));
- Переписываем классовый компонент на функциональный.
- Вместо привязки контекста c помощью
bind
используем более привычный для функциональных компонентов -- замыкание (оборачиваем в стрелочную функцию), чтобы сделать тоже самое. Методinvite
не меняется, поэтому это безопасно
- event: any меняем на
event: React.ChangeEvent<HTMLInputElement>
. - по мелочи
- Переделываем классовый компонент в функциональный
- Изббавляемся от ненужного стейта
getDerivedStateFromProps
, у нас есть пропс, который показывает открыта модалка или нет - Добавляем свойство
unmountOnExit
вCSSTransition
. - Немного стилей
- Типизируем чилдрены
- Меняем курсор мыши при наведении на крестик, чтобы показать, что кликабельная
- Клик вне формы может закрывать модалку
- Представим, что приложение будет развиваться, и нужно будет придется редактировать/удалаять приглашения, в этом случае понадобится генерировать айдишники для приглашений, хранить в стейте и использовать при рендере в списке