Skip to content

First commit#3

Merged
AlliumPro merged 1 commit intomainfrom
review
Feb 23, 2026
Merged

First commit#3
AlliumPro merged 1 commit intomainfrom
review

Conversation

@AlliumPro
Copy link
Owner

No description provided.

Copy link

@yana-yanchenko yana-yanchenko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Необходимо развернуть общий комментарий ⬇️

Добрый день! Проект выполнен на отличном уровне!

Отлично:

  • Все комментарии с отметкой "Отлично" в коде
  • Хорошо реализовали форму из предоставленных компонентов
  • Хорошая логика передачи данных от App в форму и обратно
  • Отлично, что обработчик сабмита вешаете на форму, а не клик на кнопку.
  • Отлично, что нет типов any
  • Отлично типизировали проект

Надо исправить:

  • боковая панель не открывается при клике на кнопку
  • По заданию требуется реализовать закрытие сайдбара по клику вне его области

Можно лучше:

  • Обратите внимание на все комментарии с отметкой "Можно лучше" в коде
  • Лучше выделить компонент App в отдельный файл, чтобы не смешивать все в index.js
  • clsx можно не использовать, если только один селектор передается

Обязательно внесите все исправления по пунктам "надо исправить". Улучшения по разделу "можно лучше" - на ваше усмотрение, но они помогут повысить качество кода.

Успешного рефакторинга!

<form className={styles.form}>
<ArrowButton isOpen={isOpen} onClick={onToggle} />
<aside
className={clsx(styles.container, {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отлично

То что вы используете библиотеку clsx — это отличное решение для управления условными CSS-классами в React. Это позволяет легко комбинировать классы на основе условий, делает код более читаемым и поддерживаемым, а также обеспечивает удобный способ работы с динамическими стилями компонентов.

ref={containerRef}>
<form
className={styles.form}
onSubmit={handleSubmit}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Отлично

ИспользованиеonSubmit для формы — это правильный подход к обработке отправки формы в React. Это решение перехватывает все способы отправки (клик по кнопке, нажатие Enter в полях ввода), работает с встроенной HTML5-валидацией браузера, позволяет использовать event.preventDefault() для предотвращения перезагрузки страницы, является семантически корректным и следует лучшим практикам веб-разработки, а также обеспечивает лучшую доступность для пользователей вспомогательных технологий.


return (
<main
className={clsx(styles.main)}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше

Когда применяется только один CSS-класс без условий, можно не использование clsx , так как библиотека предназначена для управления условными классами. Если класс статичен и не зависит от условий, достаточно использовать обычную строку: className="my-class". Использование clsx в таких случаях добавляет ненужную зависимость и усложняет код без практической пользы.

@@ -13,19 +16,49 @@ const domNode = document.getElementById('root') as HTMLDivElement;
const root = createRoot(domNode);

const App = () => {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше

Будет лучше вынести компонент App в отдельный файл. Когда каждый компонент находится в отдельном файле, легче ориентироваться в структуре проекта, находить нужный код и вносить изменения. Файл index.js должен служить точкой входа в приложение и отвечать только за рендеринг корневого компонента в DOM.

setFormState(initialState);
onReset?.(initialState);
};

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше

Можно создать хук 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]);
};

Copy link

@yana-yanchenko yana-yanchenko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добрый день! Ваша работа показывает, насколько вы целеустремленны и трудолюбивы. Эти качества помогут вам достичь поставленной цели.

Работа принята!

@AlliumPro AlliumPro merged commit cef2f2e into main Feb 23, 2026
0 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants