Нанять меня
Промсвязьбанк

Паттерн выбора телефона

Проектируя сценарий «Перевод физлицу через СБП» выяснилось, что в приложении встречаются сценарии с идентичной функциональностью. В силу некоторых обстоятельств эти сценарии могут быть реализованы радикально по-разному.

Чтобы не делать еще один сценарий, который будет реализован энным способом, было решено задизайнить и описать паттерн, который позволит унифицировать все имеющиеся и будущие сценарии по выбору телефона.

Начинается все с точек вызова справочника. Вызвать справочник можно было по кнопке и по инпуту. Если с кнопкой не так интересно, то вот в инпуте была проблема.

Для инпута существовал компонент Input Phone с иконкой ui / People. В одних кейсах, у компонента была одна кликабельная зона, которая вызывала справочник. В других — было две кликабельные зоны: часть поля до иконки и сама иконка. Левая часть вызывала числовую клавиатуру, а иконка открывала окно со справочником контактов:

Две тап-зоны Две тап-зоны

Мы избавились от двоякого толкования и теперь все поле имеет одну кликабельную зону:

1 тап-зона

Permissions

При первом открытии справочника надо запросить пермишены. Делаем это ненавязчиво. А для тех, у кого уже были какие-то переводы, показываем список популярных, построенных на PAM-фразе:

Запрос пермишенов Отображение блока «Популярные переводы»

Отображение справочника

Когда пермишены получены, мы даем дизайнерам два варианта на построение списка: по алфавиту и по популярности.

В варианте «по алфавиту» осуществляется группировка контактов по первому символу слова и имеет символьную сортировку:

  • цифры
  • русские буквы
  • англ буквы
  • спецсимволы

Группировка нечувствительна к регистру, т. е., значения Михаил и михаил попадут в одну группу.

Для группировки цифровых значений предусмотрен знак решетки #, а для спецсимвольных — амперсанд &.

Отображение контактов в алфавитном порядке Отображение контактов по популярности

Популярность телефонов предложили ранжировать на основании истории переводов за последние 90 дней.

На ранжирование влияет несколько параметров:

  • давность перевода
  • количество переводов

Чем раньше, относительно текущей даты, был сделан перевод, тем выше значение в справочнике. После сравнения давности перевода, выполнять проверку количества переводов, чем их больше, тем выше значение в справочнике.

Группировка контакта

Если у контакта несколько подходящих телефонных номеров, то рядом с телефоном выводить счетчик номеров. Склонять слово «номер» в соответствии со счетчиком:

Когда у одного контакта несколько номеров телефонов

Тап по такому элементу вызывает Action Sheet со списком номеров:

Выбор телефона на платформе iOS Выбор телефона на платформе Android

Если у пользователя 2 контакта с одинаковыми именами заведены отдельно, то в справочнике они тоже отображаются отдельно:

Похожие контакты без группировки

Контакты без имени

Иногда встречаются контакты без имени, в этом случае первый пришедший телефон становится крупнее, а сами контакты попадают в группу «цифры»:

Контакты без имени

Выбор значения

Значения в телефонной книге кликабельны.

Если экран был вызван из поля Input Phone, то по тапу, окно телефонной книги закрывается, а выбранное значение заполняется в поле «Телефон получателя».

Если значение было в телефонной книге, то поле получает новое название. Теперь оно соответствует названию выбранного значения, а если не было в списке, то название поля не меняется:

Поле получает новое название Название поля не меняется

Поиск

Алгоритм поиска типовой и подходит ко всем справочникам сразу, поэтому он был вынесен в отдельный паттерн.

Если у пользователя есть доступ к телефонной книге, то при переходе в справочник мы по умолчанию ставим фокус в поле.

Снятие фокус можно несколькими способами:

  • если тапнуть по неактивному месту
  • если проскроллить листинг значений
  • нажать на кнопку «Отменить»
Процесс поиска

Если в процессе поиска не нашлось совпадения и значение в поле поиска не похоже на телефон, то выводить сообщение «Получатель не найден»:

Если контакт не найден

Если в процессе поиска не нашлось совпадения, но значение в поле поиска похоже на телефон, то форматировать такое значение по маске и предлагать его к выбору.

Какие значения считать похожими на российский номер телефона?

  • Любая комбинация из 10 цифр, если она начинается не на 7.
  • Любая комбинация из 11 цифр начинающаяся с 7 или 8.

Если пользователь использует при наборе символы и знаки препинания, то позволять их вводить, но игнорировать при определении номера. Так мы сможем распознать все многообразие значений, которое может к нам прийти через копипасту:

Если контакт не найден

Если значение в поле поиска похоже на телефон, но полностью не удовлетворяет принципам похожести и похожее значение не было найдено в справочнике, то оставлять зону результатов поиска пустой:

Если контакт не найден

Команда

  • Михаил Шамин, дизайнер
  • Дмитрий Ганявин, аналитик
  • Иван Соколовский, андроид-разработчик

Релиз

Октябрь 2023

Что ещё