Skip to main content

Bom dia, eu tenho uma api que irá me retornar uma array de locais e estou fazendo um script para interar esses array, porém o meu desejo é criar um menu numerado com essa lista ex.:



  1. Localidade 1

  2. Localidade 2

  3. Localidade 3


Nesse array o minimo de localidade é de 1 e maximo de 20, então fiquei com a dúvida de como fazer essa lista numerada e de como atribuir o valor da opção do usuário escolheu dentro de um array!

Bom dia @Wellington_de_Brito,

O que vou passar pra vocÊ talvez não funcione porque não sei como é o retorno dessa sua API. Mas tenho esse script aqui.


Você vai passar como parâmetro esse seu retorno da API, uma variável de index que deve ter o valor 1 e quantas localidades você quer exibir por vez.


function run(actualIndex, localidade, maxDealersMenu) { //Indice atual, array json com as localidades, qunatidade máxima de css que vc vai exibir (o conteúdo dinâmico suporta 9 + ver mais)
var dealers = JSON.parse(localidade);
actualIndex = Number(actualIndex) - 1;
var view = v];
var content = '';
maxDealersMenu = dealers.length < maxDealersMenu ? dealers.length : maxDealersMenu;
var maxDealers = actualIndex + Number(maxDealersMenu);

for(var i = actualIndex; i < maxDealers; i++){ // for para ir adicionando as localidades para dentro do content
var resource = dealersei];
if(resource){
var index = i+1;
content += `{
"id": "${index}",
"title": "${index} ${resource.substr(0,24)}",
},`;
}
}

if(actualIndex == 0 && dealerslength > maxDealersMenu){ // Vai criar a opção "ver mais" caso tenha + de 9 localidades
content += `{
"id": "0",
"title": "Ver mais",
"description": "Não encontrou a localidade desejada? Clique aqui para ver mais."
},`;
}

return { //Da o return do index + o content
"actualIndex": (maxDealers + 1).toString(),
"content": content
};
}

Depois você vai ter que criar outro script passando como referência o resultado do script acima


function run(dealersView) {
return JSON.parse(dealersView).content;
}

Agora você cria um bloco de conteúdo dinâmico no seguinte formato


{
"recipient_type": "individual",
"type": "interactive",
"interactive": {
"type": "list",
"header": {
"type": "text",
"text": "Localidades"
},
"body": {
"text": "Um texto de menu qualquer"
},
"action": {
"button": "Selecionar",
"sections":
{
"rows":
{{script2Content}} //Vai colocar aqui o output do segundo script
]
}
]
}
}
}


Por fim você vai ter que atualizar a sua variável de index, porque ela muda caso o usuário deseje ver mais localidades


image


Acredito que você pode tentar fazer a sua solução em volta desse código que passei, provavelmente você terá que mudar algumas variáveis


@Giovanni_Soares Bom dia! Então esse é o retorno da minha lista de condominios

image


essa solução acima funcionaria?


E verfiquei que você passa 3 parametros na função, quais seriam essas variáveis? Eu passo somente a variável que vem de retorno da api aqui?

image


@Wellington_de_Brito boa tarde, funciona sim, tem que fazer apenas umas modificações, pra atender ao seu script ele ficaria assim:


function run(actualIndex, localidade, maxDealersMenu) { //Indice atual, array json com as localidades, qunatidade máxima de css que vc vai exibir (o conteúdo dinâmico suporta 9 + ver mais)
var dealers = (localidade);
actualIndex = Number(actualIndex) - 1;
var view = e];
var content = '';
maxDealersMenu = dealers.quant < maxDealersMenu ? dealers.quant : maxDealersMenu;
var maxDealers = actualIndex + Number(maxDealersMenu);

for(var i = actualIndex; i < maxDealers; i++){ // for para ir adicionando as localidades para dentro do content
var resource = dealers.locaisoi].local;
if(resource){
var index = i+1;
content += `{
"id": "${index}",
"title": "${index} ${resource}",
},`;
}
}

if(actualIndex == 0 && dealers.quant > maxDealersMenu){ // Vai criar a opção "ver mais" caso tenha + de 9 localidades
content += `{
"id": "0",
"title": "Ver mais",
"description": "Não encontrou a localidade desejada? Clique aqui para ver mais."
},`;
}

return { //Da o return do index + o content
"actualIndex": (maxDealers + 1).toString(),
"content": content,
};
}

os parâmetros da função são nessa ordem:

- Uma variável de índice que vc vai criar com qualquer nome (no caso do exemplo eu uso dealerIndex) que TEM que ter o valor inicial 1.

- O retorno da sua lista de condominios

- Quantos condominios você quer exibir no seu menu (esse valor pode ser no máximo 9 devido a compatibilidade do conteúdo dinâmico do BLip)


O segundo script que eu passei e o conteúdo dinâmico vai continuar a mesma coisa.


Por fim você vai ter que atualizar a sua variável de index, porque ela muda caso o usuário deseje ver mais localidades (foto que eu mandei no comentário anterior)

OBS: O delaersView que ta ali no valor é o output do primeiro script


uma dúvida, como eu passaria somente o array com a lista de condominios na variável de entrada do script. Por exemplo eu tenho esse JSON


{
"quant": "2",
"locais": :
{
"id_local": "165",
"local": "HELLOO APP"
},
{
"id_local": "181",
"local": "CONDOMÍNIO METRO OFFICE BUTANTÃ"
}
]
}

Só quero passar o locais!!


Pode passar inteiro, que funciona, porque no script eu uso tbm esse valor “quant” aí que eu suponho que seja a quantidade de condomínios localizados (se n for deu ruim kkkkk).


Ok! Estou fazendo aqui o script se surgir alguma dúvida chamo aqui!!


@Giovanni_Soares Ele me retornou um Not a Number kkk

image


eu mandei uma coisa errada, troca “var dealers = (localidade);” por “var dealers = JSON.parse(localidade);” no primeiro script e olha se vai


Troquei aqui!! Vou fazer o teste pq estava testando e o dealers estava dando undefined e o maxDelaresMenu tbm.


Ops!! Esqueci de descomentar uma parte do código kkkk


image

Continua com Not A Number… acredito que seja devido o dealers está como undefined e o maxDelaresMenu também!!


Tenta fazer o teste aí definindo essas variáveis. Estranho pq o script em si funcionou quando fiz os testes aqui no meu computador 🤔


Estou fazendo aqui!! Coloquei com o return dealers.toString(); no final da função no lugar desse { "actualIndex": (maxDealers + 1).toString(), "content": content, } o resultado foi

image


Ele retorna o objeto! Ou seja não está fazendo o for pq quando entra loop ele ainda está como objeto!


@Giovanni_Soares Não estou conseguindo acessar o array da variável já tentei


var dealers = JSON.parse(localidade.locais)

var result= dealers.locais

e todos esses dão undefined!


@GabrielPetrone esse é o script que estou usando:




eu já coloquei daquela forma que você tinha me passado, porém ele me retorna undefined! E assim desse jeito ele está entrando no loop (for) como um objeto e assim ele não consegue fazer a interação do array!


@Giovanni_Soares eu estou encontrando esse erro ao rodar o meu script no bot!



Consegui resolver o problema do array, porém travei aqui e não estou conseguindo dar continuidade no script, pois quando tento fazer ele retornar esse objeto me dar esse erro!!


Hey @Wellington_de_Brito , ontem precisei me ausentar e por isso não te respondi, me desculpe.


Vamos tentar ir por partes (como diria o Jack) com esse script? Eu vi o tópico aqui mas estou um pouco confuso.


A primeira pergunta que eu tenho é:



  • Qual o canal que você irá publicar o seu chatbot?


Agora, vamos pensar num cenário simples onde você apenas vai listar (em texto) quais são os locais disponíveis. Você precisaria apenas desse script:




















Variáveis de entrada: locais
Variável de saída: menu

function run(locais) {
locais = JSON.parse(locais);

var count = 1;
var txt = "";

locais.locais.forEach(element => {
txt += count + ". " + element.local + "\n";
count++;
});

return txt;
}

Esse script retornará:




  1. HELLOO APP

  2. CONDOMÍNIO METRO OFFICE BUTANTÃ



Com isso é só adicionar a var menu no seu conteúdo do bloco.


Neste script, eu usei o seguinte retorno (na var locais) que você passou da sua API:


{
"quant": "2",
"locais": "
{
"id_local": "165",
"local": "HELLOO APP"
},
{
"id_local": "181",
"local": "CONDOMÍNIO METRO OFFICE BUTANTÃ"
}
]
}



Veja se consegue fazer isso primeiro e vamos evoluindo com as próximas partes.

Aguardo.


@GabrielPetrone Tudo bem Gabriel! Então eu irei publicar no whatsapp pois estou fazendo esse bot para empresa que trabalho! A ideia é realizar uma lista de até 20 locais, por cada sindico terá uma lista de condominios. Por exemplo um sindico pode ter 3 condomios um outro pode ter 10 e assim em diante! Então queria mostrar essa lista para eles de forma numerada para que eles possam selecionar qual o condominio eles querem realizar a ação! Então pegando essa resposta irei guardar em uma variável o valor do id dele no caso 'id_local' para que ele possa ser enviado em uma requisição HTTP, fez sentido a explicação?


Boa!

O que o @Giovanni_Soares trouxe é um script muito bom pra utilizar o componente de List Message do WhatsApp, mas você vai precisar fazer algumas tratativas pra não quebrar o fluxo devido a limitações que o WhatsApp coloca para esse componente. Pensando nisso, recomendo que você use um texto puro, como no exemplo que dei acima.


Agora vamos validar outro ponto:

Você gostaria que a lista fosse numerada sequencialmente? Exemplo:




  1. HELLOO APP

  2. CONDOMÍNIO METRO OFFICE BUTANTÃ



Ou de acordo com os seus ids? Exemplo:




  1. HELLOO APP

  2. CONDOMÍNIO METRO OFFICE BUTANTÃ



Não precisa ser numerada sequencialmente, para pegar o id dele eu posso fazer um script depois comparando a resposta do usuário com o array sem problemas, a minha unica dúvida é colocar esses 20 itens na tela!! Eu conseguiria colocar dessa forma que você me passou?


Boa, perfeito.

Da forma que te passei (usando a função forEach) ele vai listar todos os itens em locais, que a sua API retornar. Vai ser sucesso!


Manda bala e qualquer dúvida nos marque aqui.


@GabrielPetrone Perfeito! Agora eu fui colocar no conteudo dinamico para fazer a lista me retornou assim:


É porque você ainda está usando a sugestão do Giovanni, essa parte aqui:



Nesse caso que eu te exemplifiquei, você pode mudar o conceito e usar apenas um conteúdo do tipo texto passando a variável de saída.

Seguindo o exemplo que eu montei em cima onde a variável de saída é menu, você só precisa fazer isso no seu bloco que está o conteúdo dinâmico:

image


Entendeu?


Ah sim! Então Perfeito!! Obrigado!!


Comente