Загрузка данных


Откуда брать данные, с какого-то api или брать моковые данные?  
Редактирование сделать отдельным эндпоинтом или модальным окном?  
Какие данные есть у пользователя (username, email и пр.)?  
Поиск должен быть мгновенный или по enter?  
По каким данным проводить поиск?  
Нужна ли сортировка по каким-то признакам пользователей?  
После редактирования когда отдавать данные на сервер или оставлять их только локально для разработки?  

Промпт:  
"senior frontend-разработчик на React + TypeScript. Создай компонент страницы пользователей со следующим функционалом:  

Технологии: React (функциональные компоненты), TypeScript, React Hook Form (или Formik), Zod (для валидации), любой CSS-фреймворк (Tailwind / Material UI / Ant Design).  

Требования:  
- Список пользователей — таблица с колонками: ID, Имя, Email, Роль, Действия (кнопка 'Редактировать').  
- Поиск — поле ввода, фильтрация списка по имени или email (без учёта регистра).  
- Форма редактирования — модальное окно, открывается по кнопке в строке. Поля: name (текст, обязательное), email (обязательное, валидация email), role (select: Admin, User, Moderator). Кнопки 'Сохранить' и 'Отмена'.  
- Валидация — на клиенте с помощью Zod. При ошибках показывать сообщения под полями.  
- Состояния — загрузка данных (спиннер), ошибка загрузки (с кнопкой повтора), пустое состояние (нет пользователей).  
- Хранение данных — пока используем моковый массив внутри сервиса (имитация API). Сохранение после редактирования обновляет локальный список.  
- Код должен быть: типизирован, разделён на логические компоненты (UserTable, UserSearch, UserEditModal), готов к подключению реального API (сервисный слой абстрагирован).  

Напиши полный код всех файлов (App, компоненты, хук, типы, валидацию) в одном ответе."  

Критерии приёмки:  
- При загрузке страницы отображается таблица с моковыми пользователями (минимум 3 записи).  
- Поле поиска фильтрует список по имени или email без перезагрузки страницы.  
- Поиск срабатывает через 300 мс после остановки ввода.  
- Кнопка 'Редактировать' открывает модальное окно с предзаполненными данными пользователя.  
- Все поля формы редактирования имеют валидацию (обязательность и формат email).  
- При невалидных данных кнопка 'Сохранить' неактивна или показывает ошибки, сохранение не происходит.  
- После успешного сохранения модальное окно закрывается, таблица обновляется с новыми данными.  
- Кнопка 'Отмена' закрывает модалку без изменений.  
- Во время загрузки/сохранения отображается индикатор.  
- При ошибке сети (имитируем) показывается сообщение и кнопка 'Повторить'.  
- При пустом результате поиска показывается сообщение 'Пользователи не найдены'.  
- Приложение корректно работает в Chrome и Firefox.  

Тест-кейсы:  
- Ввод в поиск 'alice' - остаются только пользователи с 'alice' в имени или email  
- Очистка поиска - таблица показывает всех пользователей  
- Нажать 'Редактировать' - модалка открыта, поля заполнены  
- Изменить имя → сохранить - модалка закрыта, в таблице новое имя  
- Отменить редактирование - модалка закрыта, данные в таблице не изменились