Обмен данными при взаимодействии с интерфейсом Canvas App
Обновлено 29 декабря 2023
Когда пользователь нажимает на элементы на экране, фронтенд может передавать необходимую информацию в сценарий с помощью запросов SERVER_ACTION
.
Такой же тип запросов используется и для обмена данными в фоне.
Описание обработки взаимодействия с экраном приложения:
-
Пользователь отмечает запись как сделанную.
-
Ассистент запрашивает данные об экране приложения (состояние фронтенда) с помощью метода
getState()
. -
Фронтенд создает сообщение с типом
done
, которое ассистент должен передать в сценарий./src/components/PageNote.tsxconst mutation = useAssistantMutation<DoneNoteCommandInput, DoneNoteCommandOutput, string>(
(noteTitle) => ({ type: 'done', payload: { note: noteTitle } }),
{
onSuccess: (data) => {
markNoteDone(data.id);
},
},
); -
Ассистент формирует запрос
SERVER_ACTION
и передает его в сценарий.Тип
done
передается в полеpayload.server_action.action_id
.Сценарий определяет запрос по идентификатору:
/src/scenario/scenario.tsDoneNoteAction: {
match: action('done'),
handle: doneNote,
},Для обработки запроса используется функция
doneNote
:/src/scenario/handlers.tsexport const doneNote: SaluteHandler<SaluteRequest<NoteVariable>> = ({ req, res }) => {
const { note } = req.variables;
const item = selectItem({ title: note })(req);
if (note && item?.id) {
//Создание сообщения ANSWER_TO_USER с командой smartapp_data и идентификатором заметки, которую нужно отметить
res.appendCommand<DoneNoteCommand>({
type: 'done_note',
payload: { id: item.id },
});
//Голосовая реплика ассистента
res.setPronounceText('Умничка');
//Реплика ассистента для отображения в чате
res.appendBubble('Умничка');
}
};