Tutorial: implementando botões de opção customizada no bate-papo da web
Este tutorial mostra como substituir a renderização padrão de uma resposta de opções por seus próprios botões clicáveis customizados.
Para obter uma versão de trabalho completa do exemplo descrito neste tutorial, consulte Botões customizados para watsonx Assistant bate-papo da web.
Por padrão, o bate-papo da web sempre exibe uma resposta de opções como um conjunto de botões clicáveis (para 4 ou menos opções) ou uma lista suspensa (para 5 ou mais opções). Este exemplo mostra a renderização padrão de uma resposta de opções com 3 opções:

Para este tutorial, substituiremos essa renderização padrão por botões maiores no estilo de cartão:

Como a renderização de uma resposta de opções não pode ser modificada, isso será feito interceptando quaisquer respostas de opções recebidas do assistente e convertendo-as em respostas customizadas (user_defined) Podemos então implementar
uma renderização customizada para essas respostas.
-
Crie um manipulador para o evento
pre:receive. Neste manipulador, procure quaisquer respostasoptionna carga útil da mensagem e converta-as em respostasuser_defined.function preReceiveHandler(event) { const message = event.data; if (message.output.generic) { message.output.generic.forEach(messageItem => { if (messageItem.response_type === 'option') { messageItem.response_type = 'user_defined'; } }) } } -
Crie um manipulador para o evento
customResponse. Esse manipulador renderiza os botões customizados, usando um estiloCardButtoncustomizado que podemos definir no CSS.. (É possível ver a definição desse estilo no exemplo completo.).function customResponseHandler(event) { const { message, element, fullMessage } = event.data; message.options.forEach((messageItem, index) => { const button = document.createElement('button'); button.innerHTML = messageItem.label; button.classList.add('CardButton'); button.addEventListener('click', () => onClick(messageItem, button, fullMessage, index)); element.appendChild(button); }); } -
Em seu manipulador de eventos do
onLoad, use o método da instânciaon()para assinar os eventospre:receiveecustomResponse, registrando os manipuladores como retornos de chamadainstance.on({ type: 'customResponse', handler: customResponseHandler }); instance.on({ type: 'pre:receive', handler: preReceiveHandler }); -
Crie um manipulador de clique para responder quando o cliente clicar em um dos botões customizados. No manipulador, use o método da instância do
send()para enviar uma mensagem para o assistente, usando o rótulo do botão como o texto da mensagemAlém disso, estamos incluindo a classe CSS customizada
CardButton--selectedno botão clicado, mudando sua aparência para mostrar que ela foi selecionada. (Essa classe também é definida no exemplo completo.)function onClick(messageItem, button, fullMessage, itemIndex) { webChatInstance.send({ input: { text: messageItem.label }}); button.classList.add('CardButton--selected'); } -
Se o usuário recarrega a página ou navega para uma página diferente, o bate-papo da Web é recarregado do histórico de sessão. Se isso acontecer, queremos preservar o estado "selecionado" de quaisquer botões clicados.
Para fazer isso, no manipulador
onClick, use o método de instânciaupdateHistoryUserDefinedpara armazenar uma variável no histórico de sessão que indica qual botão foi clicadowebChatInstance.updateHistoryUserDefined(fullMessage.id, { selectedIndex: itemIndex });Em seguida, no manipulador
customResponse, leia esse valor e use-o para configurar os estados iniciais dos botões em quaisquer respostas customizadas já no histórico de sessão.if (fullMessage.history?.user_defined?.selectedIndex === index) { button.classList.add('CardButton--selected'); }
Para obter o código de trabalho completo, consulte o exemplo de Botões customizados para watsonx Assistant chat da web. O exemplo também mostra como desativar os botões em uma resposta customizada após o cliente ter enviado uma mensagem, o que evita o uso dos botões para enviar uma mensagem fora de ordem