LOCATION - Capturar Localização
O que é este Node?
O LOCATION é o node responsável por capturar localização GPS (latitude/longitude) do usuário através de compartilhamento de localização em tempo real.
Por que este Node existe?
Capturar localização GPS permite funcionalidades baseadas em posição. O LOCATION existe para:
- Localização precisa: Captura latitude/longitude exatas do usuário
- Integração com mapas: Permite exibir localização no Google Maps, Waze, etc.
- Cálculo de distância: Possibilita calcular distância entre usuário e pontos de interesse
- Delivery/Serviços: Essencial para apps de entrega, táxi, serviços locais
- Geofencing: Validar se usuário está em área específica
Como funciona internamente?
Quando o LOCATION é executado, o sistema:
- Pausa o flow e exibe a mensagem
- Solicita permissão ao app (WhatsApp/Telegram) para acessar GPS
- Aguarda compartilhamento da localização pelo usuário
- Captura lat/lng: Recebe coordenadas GPS
- Salva na variável: Armazena objeto com latitude, longitude, endereço (se disponível)
- Continua o flow
Código interno (basic-flow-executor.service.ts:261-278):
private async executeLocation(parameters: any, context: any): Promise<any> {
const { message, variable } = parameters;
return {
success: true,
action: 'location_requested',
inputType: 'location',
message: message || 'Please share your location:',
variable: variable || 'user_location',
validation: {
required: true,
type: 'location'
},
awaitingUserInput: true
};
}
Quando você DEVE usar este Node?
Use LOCATION sempre que precisar da posição GPS do usuário:
Casos de uso:
- Delivery: "Compartilhe sua localização para entrega"
- Táxi/Transporte: "De onde você está partindo?"
- Serviços locais: "Envie sua localização para encontrarmos técnicos próximos"
- Check-in: "Compartilhe sua localização no evento"
- Emergência: "Envie sua localização para resgate"
- Lojas próximas: "Veja lojas perto de você"
Quando NÃO usar LOCATION:
- Endereço texto: Se precisa apenas do endereço escrito, use INPUT
- CEP: Use INPUT com pattern de validação
- Cidade/Estado: Use INPUT ou botões de seleção
Parâmetros Detalhados
message (string, obrigatório)
O que é: A mensagem solicitando que o usuário compartilhe a localização.
Flow completo para testar:
{
"name": "Teste LOCATION - Message",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "location_1",
"type": "location",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Pedir Localização",
"parameters": {
"message": "Por favor, compartilhe sua localização atual para prosseguir"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "📍 Localização recebida: {{user_location}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "location_1" },
{ "source": "location_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
variable (string, opcional)
O que é: Nome da variável onde a localização será salva.
Padrão: "user_location"
Flow completo para testar:
{
"name": "Teste LOCATION - Variable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Solicitar Origem",
"parameters": {
"message": "Vamos calcular a rota 🚗"
}
}
},
{
"id": "location_1",
"type": "location",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Localização Origem",
"parameters": {
"message": "Compartilhe o local de partida:",
"variable": "origem"
}
}
},
{
"id": "location_2",
"type": "location",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Localização Destino",
"parameters": {
"message": "Agora compartilhe o destino:",
"variable": "destino"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Mostrar Rota",
"parameters": {
"message": "🗺️ Rota calculada!\n\n📍 Origem: {{origem}}\n📍 Destino: {{destino}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "location_1" },
{ "source": "location_1", "target": "location_2" },
{ "source": "location_2", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| message | string | Sim | Mensagem solicitando localização |
| variable | string | Não | Nome da variável (padrão: "user_location") |
Exemplo 1: Delivery Simples
Objetivo: Capturar localização para entrega
JSON para Importar
{
"name": "Delivery - Capturar Localização",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "🍕 Pedido confirmado! Vamos preparar a entrega."
}
}
},
{
"id": "location_1",
"type": "location",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedir Localização",
"parameters": {
"message": "Compartilhe sua localização para calcularmos o frete:",
"variable": "endereco_entrega"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Localização recebida!\n\n📍 Endereço: {{endereco_entrega}}\n\n⏱️ Tempo estimado: 30-40 minutos"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "location_1" },
{ "source": "location_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Exemplo 2: Cadastro com Localização
Objetivo: Coletar dados e localização do cliente
JSON para Importar
{
"name": "Cadastro Completo com Localização",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Nome",
"parameters": {
"message": "Qual é o seu nome?",
"variable": "nome"
}
}
},
{
"id": "phone_1",
"type": "phone",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Telefone",
"parameters": {
"message": "Qual é o seu telefone?",
"variable": "telefone"
}
}
},
{
"id": "location_1",
"type": "location",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Localização",
"parameters": {
"message": "Compartilhe sua localização:",
"variable": "localizacao"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Resumo",
"parameters": {
"message": "✅ CADASTRO COMPLETO\n\n👤 Nome: {{nome}}\n📱 Telefone: {{telefone}}\n📍 Local: {{localizacao}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "phone_1" },
{ "source": "phone_1", "target": "location_1" },
{ "source": "location_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Exemplo 3: Encontrar Loja Mais Próxima
Objetivo: Usar localização para indicar loja próxima
JSON para Importar
{
"name": "Loja Mais Próxima",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Apresentação",
"parameters": {
"message": "🏪 Vamos encontrar a loja mais próxima de você!"
}
}
},
{
"id": "location_1",
"type": "location",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedir Localização",
"parameters": {
"message": "Compartilhe sua localização:",
"variable": "minha_localizacao"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Loja",
"parameters": {
"message": "🎯 Loja mais próxima encontrada!\n\n📍 Shopping Center - 2.3km\nRua das Flores, 456\n\n🚗 Abrir no Google Maps: [Link]"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "location_1" },
{ "source": "location_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Resposta do Node
{
"success": true,
"action": "location_requested",
"inputType": "location",
"message": "Compartilhe sua localização:",
"variable": "user_location",
"validation": {
"required": true,
"type": "location"
},
"awaitingUserInput": true
}
Formato da Localização Capturada
Quando o usuário compartilha a localização, a variável contém:
{
"latitude": -23.5505199,
"longitude": -46.6333094,
"address": "Av. Paulista, 1578 - Bela Vista, São Paulo - SP"
}
Campos:
- latitude: Coordenada de latitude (número)
- longitude: Coordenada de longitude (número)
- address: Endereço aproximado (se disponível)
Como Usar a Localização
Exibir no Google Maps
https://www.google.com/maps?q={{user_location.latitude}},{{user_location.longitude}}
Calcular Distância
Use a fórmula de Haversine ou serviços como Google Distance Matrix API.
Validar Área
Verifique se latitude/longitude está dentro de range específico.
Validação Automática
O node LOCATION valida automaticamente:
✅ Formato: Verifica se são coordenadas GPS válidas ✅ Required: Localização obrigatória por padrão ✅ Tipo: Valida que é objeto com lat/lng
Se usuário enviar algo inválido, sistema pede novamente.
Dicas
💡 Explique o motivo: "Compartilhe sua localização para calcular frete" 💡 Privacidade: Deixe claro como a localização será usada 💡 Alternativa: Ofereça opção de digitar endereço se preferir 💡 Google Maps: Use coordenadas para gerar links de mapa
Próximo Node
→ MEDIA - Capturar imagem/vídeo/áudio → DATE - Capturar data