habrahabr

Как Smartcalls стал Voximplant Kit’ом – ребрендинг и киллер-фичи

  • вторник, 17 марта 2020 г. в 00:27:07
https://habr.com/ru/company/Voximplant/blog/492232/
  • Блог компании Voximplant
  • Разработка веб-сайтов
  • JavaScript
  • Программирование



Мы долго готовили обновление Smartcalls – визуального редактора для исходящих звонков – и вот оно случилось. Сегодня под катом расскажем про UI/UX-изменения и залезем под капот демо-режима, чтобы показать, как мы приручали JointJS.

А что собственно поменялось?


Из самого очевидного – новое имя и урл, а это значит, что Voximplant Kit доступен по соответствующей ссылке voximplant.com/kit. Модифицировали и страницу регистрации, теперь она такая:

image

Хотя концепция осталась прежней, существенно преобразился интерфейс продукта, став более user-friendly. Верхнее меню перекочевало налево, что сделало навигацию по блокам более логичной и удобной.

image

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

image

Что касается интеграций: user-friendly интерфейс добрался и до настроек почты, а на вкладках Dialogflow, SIP, Global Variables появился поиск и сортировка файлов по ID и host'ам.

image

В общем, много всего нового и крутого! Подробнее об изменениях можно почитать в нашем блоге.

Но самое главное – редактор


Демо-режим (спойлер: это и есть главная киллер-фича).


Реал-тайм выполнение сценария с подсветкой задействованных блоков, а после выполнения – результат звонка (Flow и Log), благодаря чему отладка сценариев стала еще проще и быстрее.

image

Посмотреть видео работы демо-режима можно здесь или протестировать самостоятельно после регистрации на Voximplant Kit.

А о том, как это все реализовано, расскажем в следующем разделе. Новые фичи редактора:

  • undo/redo (1 на рисунке ниже);
  • горячие клавиши (2);
  • всплывающее меню, где можно выровнять блоки и линки между ними одним нажатием, изменить масштаб, работать с miniMap, развернуть сценарий на весь экран, а также расшарить его (скопировать или сохранить как png) (3);
  • контекстное меню по правому клику мыши;
  • копирование блоков – не только внутри одного сценария, но и между разными сценариями и даже(!) разными аккаунтами;
  • lock/unlock блока — залоченный блок двигать можно, но НЕЛЬЗЯ редактировать во избежание нежелательных изменений;
  • смена цветов – визуально можно выделить несколько «родственных» блоков
  • поиск по именам и содержанию используемых блоков;
  • блок «Интерактивное меню» – возможность менять порты (варианты ответов) местами простым перетаскиванием.

image

Раскрываем карты


Пришло время разобраться, как в коде реализована анимация блоков.


Редактор вызывает метод нашего HTTP API – StartScenarios – чтобы запустить облачный сценарий. Облако Voximplant начинает выполнение сценария и отдает редактору media_access_url. С этого момента редактор дергает media_access_url каждую секунду, получая в ответ информацию о том, как сценарий «путешествует» по блокам – опираясь на эти данные, редактор подсвечивает нужные блоки и анимирует связи между ними.

История путешествий (History) представляет собой объект JSON со следующими переменными:

  • timestamp;
  • idSource – начальный блок;
  • idTarget – конечный блок;
  • port – порт (может быть несколько выходов из 1 блока).

image

С помощью этих кастомных и служебных переменных фронтенд понимает, из какого блока в какой сценарий переходит во время тестирования. Как он это понимает? Когда происходит визуальное конструирование (добавляется новый блок), ему сразу присваивается id, который потом используется в истории как idSource / idTarget.

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

Начнем с главного метода selectBlock(), он работает следующим образом: мы идем по массиву истории перемещений (idSource, idTarget) и как только находим начальную и конечную точки, ищем ссылку между ними:

const link = this.editor.getTestLink(sourceCell, portId);

Если ссылка между ними есть, то анимируем бегающий по линии связи шарик:
if (link) this.setLinkAnimation(link);

Метод selectBlock() вызывается после каждого обновления this.testHistory. Так как в this.testHistory могут прилететь сразу несколько пройденных блоков, мы рекурсивно вызываем selectBlock раз в 700 мс (это примерное время, затрачиваемое на анимацию перемещения от блока к блоку):

setTimeout(this.selectBlock, 700);

Весь код данного метода выглядит следующим образом. Обратите внимание на методы selectTestBlock и getTestLink, строки 7 и 10 – сейчас мы расскажем про них отдельно: