Используем JavaScript в сценарии

Вы можете заменить часть сложной логики смартапа кодом на JavaScript.

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

SmartApp Graph поддерживает JavaScript версии ES5. Также доступны вспомогательные функции и библиотека underscore.js.

Выражения на JavaScript можно также использовать в блоках Условия.

Если в вашем смартапе большинство функций реализовано с помощью кода на JavaScript, рассмотрите продолжение развития проекта в SmartApp Code или других инструментах разработки смартапов.

Предложение блюда на основе персонажа ассистента

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

Для этого используйте JavaScript сравнение в блоке Условия:

  1. Откройте проект «Кулинарная книга».
  2. В блок Интенты на первом экране, добавьте интент «Посоветуй что-нибудь».

    Кроме интента вы можете использовать блок Подсказка.

  3. Соедините интент с блоком Условия на новом экране.
  4. Добавьте следующие условия:

    $rawRequest.payload.character.name === "Сбер"
    $rawRequest.payload.character.name === "Джой"
    $rawRequest.payload.character.name === "Афина"

    Для сравнения используется значение поля name запроса ассистента. Доступ к запросу ассистента осуществляется с помощью системной переменной $rawRequest.

  5. Соедините каждое из условий с рецептом.

Персонажи различаются не только характерами, но и обращением к пользователю: Джой обращается к пользователю на «ты». Учитывайте это при проектировании ответов, зависящих от персонажа.

Рецепт от персонажа

При попытке протестировать определение персонажа в тестовом виджете возникнет ошибка. Такое поведение вызвано тем, что в тестовом виджете нет доступа к запросу ассистента из переменной $rawRequest.

Конвертер величин

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

Добавьте в смартап возможность конвертировать унции в граммы, кварты в миллилитры и градусы Фаренгейта в градусы Цельсия.

Также покажите пользователю небольшую памятку с помощью нового типа карточек:

  1. Откройте проект «Кулинарная книга».
  2. На первый экран добавьте подсказку «Конвертер».
  3. Соедините подсказку с блоком JS Код на новом экране.

    Вставьте в блок код карточки grid_card. Такой тип карточек можно создавать только с помощью кода на JavaScript. Структуры карточек описаны в разделе SmartApp API.

    $response.replies = $response.replies || [];
    $response.replies.push({
           "type": "raw",
           "body": {
               "items": [{
                   "card": {
                       "type": "grid_card",
                       "items": [
                           {
                               "type": "greeting_grid_item",
                               "top_text": {
                                   "type": "text_cell_view",
                                   "text": "1 унция",
                                   "typeface": "caption",
                                   "text_color": "default",
                                   "max_lines": 3
                               },
                               "bottom_text": {
                                   "type": "text_cell_view",
                                   "text": "28 грамм",
                                   "typeface": "body3",
                                   "text_color": "default",
                                   "max_lines": 3,
                                   "margins": {
                                       "top": "4x"
                                   }
                               },
                               "paddings": {
                                   "top": "6x",
                                   "left": "6x",
                                   "right": "6x",
                                   "bottom": "6x"
                               }
                           },
                           {
                               "type": "greeting_grid_item",
                               "top_text": {
                                   "type": "text_cell_view",
                                   "text": "1 фунт",
                                   "typeface": "caption",
                                   "text_color": "default",
                                   "max_lines": 3
                               },
                               "bottom_text": {
                                   "type": "text_cell_view",
                                   "text": "16 унций\n 454 грамма",
                                   "typeface": "body3",
                                   "text_color": "default",
                                   "max_lines": 3,
                                   "margins": {
                                       "top": "4x"
                                   }
                               },
                               "paddings": {
                                   "top": "6x",
                                   "left": "6x",
                                   "right": "6x",
                                   "bottom": "6x"
                               }
                           },
                           {
                               "type": "greeting_grid_item",
                               "top_text": {
                                   "type": "text_cell_view",
                                   "text": "1 ст. ложка",
                                   "typeface": "caption",
                                   "text_color": "default",
                                   "max_lines": 3
                               },
                               "bottom_text": {
                                   "type": "text_cell_view",
                                   "text": "3 чайные ложки",
                                   "typeface": "body3",
                                   "text_color": "default",
                                   "max_lines": 3,
                                   "margins": {
                                       "top": "4x"
                                   }
                               },
                               "paddings": {
                                   "top": "6x",
                                   "left": "6x",
                                   "right": "6x",
                                   "bottom": "6x"
                               }
                           },
                           {
                               "type": "greeting_grid_item",
                               "top_text": {
                                   "type": "text_cell_view",
                                   "text": "1 кварта",
                                   "typeface": "caption",
                                   "text_color": "default",
                                   "max_lines": 3
                               },
                               "bottom_text": {
                                   "type": "text_cell_view",
                                   "text": "4 чашки\n16 ст. ложек\n950 мл",
                                   "typeface": "body3",
                                   "text_color": "default",
                                   "max_lines": 3,
                                   "margins": {
                                       "top": "4x"
                                   }
                               },
                               "paddings": {
                                   "top": "6x",
                                   "left": "6x",
                                   "right": "6x",
                                   "bottom": "6x"
                               }
                           }
                       ],
                       "columns": 2,
                       "item_width": "small"
                   }
               }]
           }
    });
  4. На этот же экран добавьте блок Текст и спросите у пользователя «Что вы хотите конвертировать?»
  5. Добавьте подсказки «Унции», «Кварта» и «Фаренгейты».
  6. Соедините подсказки с соответствующими блоками Ввод числа.

    В блоках Ввод числа попросите пользователя указать вес, объем или температуру и сохраните их в переменные $ounces, $quart и $fahrenheit соответственно.

  7. Соедините блоки Ввод числа с соответствующими блоками JS Код, в которых будут выполняться расчеты.

    В блок для преобразования веса добавьте код:

    function convertWeight(weight) {
      return weight/0.035274;
    };
    $session.grams = convertWeight($session.ounces);

    В блок для преобразования объема добавьте код:

    function convertVolume(volume) {
      return volume*946.35;
    };
    $session.ml = convertVolume($session.quart);

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

    function convertTemp(temperature) {
      return (temperature-32)/1.8;
    };
    $session.celsius = convertTemp($session.fahrenheit);

    В блоке JS Код обращение к глобальным переменным выполняется с помощью системной переменной $session. Если вы хотите, чтобы переменные, созданные внутри блока JS Код, были доступны в других блоках, также сохраняйте их с помощью системной переменной $session.

    В блоке JS Код не должно быть пропущенных строк.
  8. На экраны с вычислениями добавьте блоки Переход и соедините их с соответствующими экранами результатов.

Пример конвертера.

Конвертер единиц