- Ввести разработчика в архитектуру разрабатываемых приложений
- Продемонстрировать способы решения стандартных задач с использованием применяемого в разработке набора инструментов
- Предоставить кандидатам, не имеющим опыта разработки на языке Dart, учебно-практические задания для быстрого входа в разработку
- Проверка знаний, умений и навыков кандидата по следующим направлениям:
- самостоятельно добывать необходимые знания
- самостоятельно находить решение
- разбираться в коде
- писать понятный код
- ООП
- паттерны проектирования
- автоматизированное тестирование
Для работы предоставляется приложение, реализующее простой чат, находящееся в начальной стадии разработки. В ходе работы необходимо:
- Запустить предоставленное приложение
- Изучить необходимые для выполнения работы материалы
- Разобраться в коде и выполнить предложенное ТЗ на разработку функционала.
- Самостоятельно сформулировать задачу по улучшению функционала и реализовать ее в коде
- Предоставить отчет о проделанной работе вместе с кодом
Для запуска приложения необходимо:
- Установить на рабочем компьютере Dart SDK версии не ниже 2.7.0
- Для сборки мобильного приложения необходимо установить Flutter
- Получить копию данного репозитория на своем рабочем компьютере
- Для запуска серверной части необходимо предварительно запустить сервер MongoDb так, чтобы к нему можно было подключиться на
localhost:27017
. Это можно сделать, либо установив локально сервер MongoDb, либо запустив сервер в docker-контейнере
Приложение состоит из двух частей: клиентской, которая запускается в браузере или на мобильном устройстве, и серверной (API-сервер).
cd /path/to/chat_api
pub get
pub run build_runner build
dart bin/main.dart
cd /path/to/chat_web
pub get
pub run webdev serve
После этого приложение будет доступно на localhost:8080
cd /path/to/chat_mobile
flutter pub get
- Запустить эмулятор IOS или Android
flutter run
Приложение состоит из пяти пакетов:
chat_api
- API-серверchat_web
- web-клиентchat_mobile
- мобильный клиентchat_api_client
- пакет предоставляет средства взаимодействия с API-сервером; используется в web- и мобильном клиентахchat_models
- модели данных; используется во всех перечисленных выше пакетах
Требований в задании много от очень простых до сложных. Вероятно за отведённое время не получится реализовать все. Ваша задача реализовать максимум из того, что получится.
- Проведите рефакторинг проекта
chat_mobile
: сгруппируйте файлы по подходящим директориям, удалите неиспользуемые виджеты, компоненты, файлы. - Расширьте модель пользователя (в
chat_models
), чтобы она также содержала email и телефон. - На главном экране после логина должно быть 2 таба: «
Пользователи
» и «Чаты
». При первой загрузке появляется индикатор загрузки. При переходе между табами сохраняется состояние прокрутки. В карточках пользователя выводится емейл и имя, в круглой аватаре пользователя должны содержаться первые буквы из имени и фамилии. По клику на карточку пользователя выделяем её цветом и появляется Кнопка «+
» по нажатию на которую создается чат с выбранными пользователями. При переходе на вкладку с чатами выбранные пользователи во всех чатах должны подсвечиваться. На табе с чатами кнопки «+
» быть не должно. - На обоих вкладках сделайте обновление списка через свайп сверху вниз, чтобы подгрузить новые данные, которые могли быть созданы за это время.
- На любой странице приложения, которая доступна после авторизации, должно приходить уведомление о новом сообщение, клик на которое должен открывать нужный чат.
- Необходимо сохранять авторизационные данные (токен), чтобы при перезагрузке приложения не требовался повторный ввод логина/пароля.
- Если действие авторизационного токена истекло, но при этом пользователь не выходил из своей учетной записи - автоматически выполнять повторную попытку логина с введенными ранее данными (логин/пароль). Такую ситуацию можно проверить, перезапустив серверную часть приложения.
- Добавьте в апп бар кнопку с иконкой, по нажатию на которую необходимо перенаправлять пользователя на экран с профилем, где он сможет добавить/изменить информацию о себе. В частности, email и телефон. Для почты и телефона должны валидироваться значения перед отправкой на сервер.
- Не используйте
InheritedWidget
, отдав предпочтение более современным способам State Management'а (например: RxDart, BLoC) и Dependency Injection (например: Provider, Get It). - Сформулируйте самостоятельно какое-либо важное на ваш взгляд функциональное требование и реализуйте его.
- Весь функционал написанный в ходе работы необходимо покрыть тестами
- Весь код должен соответствовать рекомендациям, описанным в руководствах
- Если в ходе работы будут выявлены ошибки, то их нужно исправить.
- Если в ходе работы будет найдено более красивое решение, чем уже реализованное, то его нужно применить.
- Последовательность реализации функциональных требований не важна.
По результатам работы нужно составить краткий отчет. В отчет должно быть включено следующее:
- Что из предложенного задания удалось реализовать
- В чем возникли затруднения
- Если были сделаны доработки не указанные в ТЗ, то отметить какие.
Код с результатами работы необходимо выложить в любой публичный git-репозиторий и прислать ссылку на него.
- Выполнено
- Выполнено
- Выполнено, 2 таба на главном экране, каждый управляется коллекцией со своими моделями
- Выполнено с использованием pull_to_refresh
- Выполнено с использованием flutter_local_notifications
- Выполнено с использованием flutter_secure_storage
- Не выполнено, не удалось воспроизвести с указанными рекомендациями, на эмуляцию проблемы локально не хватило времени
- Выполнено
- Учтено
- Добавить поддержку разных локалей, реализовано при помощи gen_lang
- Первичная настройка приложения. При указании localhost в адресах api не соединялось с базой, так же и приложение с api.
- Добаление gen_lang для использования разных локализация
- Стилизация
- Добавлен RouteAwareWidget для управления контекстами, что позволяет не привязываться к виджету. Так же есть возможность для расширения сбора дополнительной информации о экранном времени и информации о посещенных экранах
- Жирное замечание не написано ни одного теста что является минусом -
- Не доделана логика пропущенных сообщений в списке чатов
- Не доделана обработка ошибок и контроля подключенных сетей
- Не доделана логика прокрутки в чате. При появлении нового сообщения список не скролиться автоматом, при открытии клавиатуры может произойти аналогичная ситуация
- Не пересмотренна работа chat_component, из-за чего была проблема спама локальных сообщений при переходе на разные экраны
Всего потрачено на приложение не более 18 часов