entregas_app/docs/ROTA_MOTORISTA_ENTREGA.md

5.8 KiB

Implementação de Rota Motorista → Entrega

Funcionalidade Implementada

Agora o sistema traça a rota corretamente da posição atual do motorista até o endereço de entrega, em vez de apenas mostrar o destino.

Principais Melhorias

1. Obtenção da Localização Atual do Motorista

  • Função getDriverCurrentLocation(): Obtém a localização atual com alta precisão
  • Verificação de Permissões: Solicita permissão de localização se necessário
  • Verificação de GPS: Confirma se o serviço de localização está ativo
  • Tratamento de Erros: Alertas informativos para problemas de localização
const getDriverCurrentLocation = async (): Promise<{ latitude: number; longitude: number } | null> => {
  // Verificar permissões
  const { status } = await Location.requestForegroundPermissionsAsync()
  
  // Verificar se GPS está ativo
  const isLocationEnabled = await Location.hasServicesEnabledAsync()
  
  // Obter localização com alta precisão
  const location = await Location.getCurrentPositionAsync({
    accuracy: Location.Accuracy.High,
  })
  
  return {
    latitude: location.coords.latitude,
    longitude: location.coords.longitude,
  }
}

2. URLs de Navegação com Origem e Destino

  • Google Maps: URLs com formato dir/origem/destino
  • Waze: URLs com coordenadas de origem e destino
  • Fallback: URLs apenas com destino se origem não estiver disponível
// Google Maps com rota completa
`https://www.google.com/maps/dir/${originLat},${originLng}/${encodedAddress}`
`https://www.google.com/maps/dir/${originLat},${originLng}/${destinationLat},${destinationLng}`

// Waze com coordenadas
`waze://?ll=${destinationLat},${destinationLng}&navigate=yes`

3. Interface Visual Melhorada

  • Indicador GPS: Mostra quando a localização do motorista está disponível
  • Botão Inteligente: Muda de "Localizar" para "Navegar" conforme o estado
  • Loading State: Indica quando está obtendo a localização
<Text style={styles.actionButtonText}>
  {locationLoading ? "..." : driverLocation ? "Navegar" : "Localizar"}
</Text>

{driverLocation && (
  <View style={styles.locationIndicator}>
    <Ionicons name="location" size={12} color={STATUS_COLORS.completed.primary} />
    <Text style={styles.locationText}>GPS Ativo</Text>
  </View>
)}

4. Integração com DeliveryMap

  • Propriedade driverLocation: Passa a localização do motorista para o mapa
  • Rota Visual: O mapa pode mostrar a rota da posição atual até a entrega
  • Marcador do Motorista: Indica a posição atual no mapa
<DeliveryMap 
  deliveries={[delivery]} 
  showRoute={true} 
  centerOnUser={true} 
  showDeliveryPin={true}
  driverLocation={driverLocation}
/>

Fluxo de Funcionamento

1. Primeiro Acesso

  1. Usuário clica em "Localizar"
  2. Sistema solicita permissão de localização
  3. Obtém coordenadas atuais do motorista
  4. Botão muda para "Navegar"

2. Navegação

  1. Usuário clica em "Navegar"
  2. Sistema usa localização atual como origem
  3. Gera URLs com rota completa (origem → destino)
  4. Abre app de navegação com rota traçada

3. Fallback

  1. Se não conseguir localização atual
  2. Usa coordenadas padrão como origem
  3. Ainda funciona, mas sem precisão da posição real

Logs de Debug

O sistema gera logs detalhados para debug:

=== DEBUG: OBTENDO LOCALIZAÇÃO DO MOTORISTA ===
✅ Localização obtida: { latitude: -1.4624, longitude: -48.4787 }

=== DEBUG: ABRINDO NAVEGAÇÃO ===
App: google
Endereço: Rua das Flores, 123, Centro, Belém, PA
Origem (motorista): { latitude: -1.4624, longitude: -48.4787 }
Destino (entrega): { latitude: -1.4625, longitude: -48.4788 }
URLs para tentar: [
  "https://www.google.com/maps/dir/-1.4624,-48.4787/Rua%20das%20Flores%2C%20123%2C%20Centro%2C%20Belém%2C%20PA",
  "https://www.google.com/maps/dir/-1.4624,-48.4787/-1.4625,-48.4788"
]

Compatibilidade

Plataformas Suportadas

  • Android: Google Maps, Waze
  • iOS: Google Maps, Waze, Apple Maps
  • Expo SDK 53: Compatível

Apps de Navegação

  • Google Maps: Rota completa com origem e destino
  • Waze: Navegação com coordenadas precisas
  • Apple Maps: Suporte nativo no iOS

Estados de Localização

  • GPS Ativo: Rota precisa da posição atual
  • GPS Inativo: Fallback para coordenadas padrão
  • Sem Permissão: Solicita permissão automaticamente

Benefícios

🎯 Precisão

  • Rota traçada da posição real do motorista
  • Não depende de coordenadas fixas ou estimadas

🚀 Experiência do Usuário

  • Interface intuitiva com indicadores visuais
  • Feedback imediato sobre status do GPS
  • Botões contextuais (Localizar/Navegar)

🔧 Robustez

  • Múltiplas URLs de fallback
  • Tratamento de erros de localização
  • Funciona mesmo sem GPS ativo

📱 Integração

  • Compatível com todos os apps de navegação
  • Suporte para Android e iOS
  • Logs detalhados para debug

Como Testar

1. Teste de Localização

# Build de produção
npx expo run:android --variant release

2. Cenários de Teste

  • GPS Ativo: Deve mostrar "GPS Ativo" e traçar rota precisa
  • GPS Inativo: Deve solicitar ativação do GPS
  • Sem Permissão: Deve solicitar permissão de localização
  • Apps de Navegação: Deve abrir com rota origem → destino

3. Verificação de Logs

  • Verificar logs no console para confirmar localização obtida
  • Confirmar URLs geradas com origem e destino
  • Validar funcionamento dos apps de navegação

Próximos Passos

🔮 Melhorias Futuras

  • Rota em Tempo Real: Atualizar rota conforme motorista se move
  • Estimativa de Tempo: Calcular tempo estimado de chegada
  • Histórico de Rotas: Salvar rotas percorridas
  • Otimização: Sugerir rotas alternativas