Conversation
yana-yanchenko
left a comment
There was a problem hiding this comment.
Необходимо развернуть общий комментарий ⬇️
Добрый день! Проект выполнен на отличном уровне!
Отлично:
- Все комментарии с отметкой "Отлично" в коде
- Хорошо реализовали форму из предоставленных компонентов
- Хорошая логика передачи данных от
Appв форму и обратно - Отлично, что обработчик сабмита вешаете на форму, а не клик на кнопку.
- Отлично, что нет типов
any - Отлично типизировали проект
Надо исправить:
- боковая панель не открывается при клике на кнопку
- По заданию требуется реализовать закрытие сайдбара по клику вне его области
Можно лучше:
- Обратите внимание на все комментарии с отметкой "Можно лучше" в коде
- Лучше выделить компонент
Appв отдельный файл, чтобы не смешивать все вindex.js clsxможно не использовать, если только один селектор передается
Обязательно внесите все исправления по пунктам "надо исправить". Улучшения по разделу "можно лучше" - на ваше усмотрение, но они помогут повысить качество кода.
Успешного рефакторинга!
| <form className={styles.form}> | ||
| <ArrowButton isOpen={isOpen} onClick={onToggle} /> | ||
| <aside | ||
| className={clsx(styles.container, { |
There was a problem hiding this comment.
Отлично
То что вы используете библиотеку clsx — это отличное решение для управления условными CSS-классами в React. Это позволяет легко комбинировать классы на основе условий, делает код более читаемым и поддерживаемым, а также обеспечивает удобный способ работы с динамическими стилями компонентов.
| ref={containerRef}> | ||
| <form | ||
| className={styles.form} | ||
| onSubmit={handleSubmit} |
There was a problem hiding this comment.
Отлично
ИспользованиеonSubmit для формы — это правильный подход к обработке отправки формы в React. Это решение перехватывает все способы отправки (клик по кнопке, нажатие Enter в полях ввода), работает с встроенной HTML5-валидацией браузера, позволяет использовать event.preventDefault() для предотвращения перезагрузки страницы, является семантически корректным и следует лучшим практикам веб-разработки, а также обеспечивает лучшую доступность для пользователей вспомогательных технологий.
|
|
||
| return ( | ||
| <main | ||
| className={clsx(styles.main)} |
There was a problem hiding this comment.
Можно лучше
Когда применяется только один CSS-класс без условий, можно не использование clsx , так как библиотека предназначена для управления условными классами. Если класс статичен и не зависит от условий, достаточно использовать обычную строку: className="my-class". Использование clsx в таких случаях добавляет ненужную зависимость и усложняет код без практической пользы.
| @@ -13,19 +16,49 @@ const domNode = document.getElementById('root') as HTMLDivElement; | |||
| const root = createRoot(domNode); | |||
|
|
|||
| const App = () => { | |||
There was a problem hiding this comment.
Можно лучше
Будет лучше вынести компонент App в отдельный файл. Когда каждый компонент находится в отдельном файле, легче ориентироваться в структуре проекта, находить нужный код и вносить изменения. Файл index.js должен служить точкой входа в приложение и отвечать только за рендеринг корневого компонента в DOM.
| setFormState(initialState); | ||
| onReset?.(initialState); | ||
| }; | ||
|
|
There was a problem hiding this comment.
Можно лучше
Можно создать хук useCloseOnOutsideClickOrEsc, который будет закрывать форму при клике вне её и по нажатию клавиши Escape.
Например:
import { useEffect } from 'react';
type UseCloseOnOutsideClickOrEsc = {
isOpenElement: boolean; // Флаг, открыт ли элемент (например, модальное окно или форма)
onClose?: () => void; // Колбэк, вызываемый при закрытии
elementRef: React.RefObject<HTMLElement>; // Ссылка на DOM-элемент, вне которого отслеживаем клик
};
export const useCloseOnOutsideClickOrEsc = ({
isOpenElement,
elementRef,
onClose,
}: UseCloseOnOutsideClickOrEsc) => {
useEffect(() => {
if (!isOpenElement) {
// Если элемент закрыт, обработчики не нужны
return;
}
const handleClick = ({target}: MouseEvent) => {
// Если клик был вне элемента — вызываем onClose
if (
target instanceof Node &&
!elementRef.current?.contains(event.target)
) {
onClose?.();
}
};
const handleKeyDown = (event: KeyboardEvent) => {
// Закрытие по нажатию Escape
if (event.key === 'Escape') {
onClose?.();
}
};
// Добавляем обработчики
window.addEventListener('mousedown', handleClick);
window.addEventListener('keydown', handleKeyDown);
// Убираем обработчики при размонтировании или изменении зависимостей
return () => {
window.removeEventListener('mousedown', handleClick);
window.removeEventListener('keydown', handleKeyDown);
};
}, [isOpenElement, elementRef, onClose]);
};
yana-yanchenko
left a comment
There was a problem hiding this comment.
Добрый день! Ваша работа показывает, насколько вы целеустремленны и трудолюбивы. Эти качества помогут вам достичь поставленной цели.
Работа принята!
No description provided.