Sobre este projeto
it-programming / mobile-development
Aberto
Contexto Geral do Projeto
Existem dois principais problemas que estão ocorrendo e eu iniciarei pelo problema mais "misterioso". Em um arquivo chamado DriverHome.js o mototaxista aceita a corrida, vai até o passageiro e leva ele até o destino finalizando a corrida, ao finalizar, todo o processo acontece normalmente na tela do mototaxista, mas, na maioria das vezes, o aviso de que a corrida foi finalizada não está aparecendo para o passageiro, lembrando que algumas vezes dá tudo certo sem problemas, mas, notamos que a função que busca periodicamente essa resposta de finalização da corrida para o passageiro está lá sendo executada, mas por algum motivo, só "destrava" se mudarmos a conexão de rede, por exemplo. Sou um passageiro, pedi uma corrida, foi aceita, o mototaxista me buscou, me levou até o destino, finalizou a corrida, mas não apareceu para mim que ele finalizou, troquei minha rede móvel 4G para o Wi-Fi do local e aí então apareceu a notificação que a corrida foi de fato finalizada. Em todos os projetos até agora, nunca tínhamos visto um problema relacionado ao tipo de rede, ou a troca da rede para fazer uma função "voltar a funcionar". Esperamos que alguém possa nos ajudar a entender e resolver este empecilho, afinal, o usuário precisa ter total liberdade de usar a rede que bem entender e não precisar alterar para que um processo seja concluído, isso obviamente é algo inconcebível em termos de usabilidade. Vou mostrar o passo a passo em termos de código para que vocês possam acompanhar. Em seguimento, também temos mais um problema em relação ao mesmo projeto. Este é o botão que chama a função para o mototaxista finalizar a corrida: <Button onPress={async () => { await this.handleFinishedRide(); this.setState({ navScreen: false }); }} theme={theme} > <FontAwesome name="check" size={18} color="#FFC700" /> Concluir </Button> A função tem como principal chamada esta API: let resp = await api.get('/rider/finish/ride', { params: { ride_id: this.state.ride_id, user_id: this.state.user_id, value: this.state.price } }); Esta chamada é responsável por atualizar todo o necessário no banco de dados em relação a finalização da corrida. Em um arquivo chamado Ride.js o passageiro acompanha o andamento da corrida até o seu final, nele existe uma função que é chamada a cada cinco segundos que atualiza a localização deles no mapa e também checa se existe algum status diferente na corrida, como por exemplo, se ela foi finalizada pelo mototaxista, que só pode fazer isso quando o aplicativo detectar que ele já está a pelo menos 50 - 20 metros do destino. A parte realmente importante é o trecho de código em que ocorre a checagem de finalização: 1- Esta função de checagem é chamada a cada cinco segundos: this.setState({ intervalId: setInterval(() => this.handleRiderLocation(), 5000) }); 2 - Dentro da handleRiderLocation uma condição acontece quando a localização é próxima o suficiente do destino: if (this.state.destiny1 === true) { this.setState({ time: 0 }); this.setState({ status: 'Chegou no destino!', progress: 1 }); //await this.setState({ motoMarker: this.state.localMarker }); this.handleAnimate2((this.state.motoMarker.latitude + this.state.destinationMarker.latitude) / 2, (this.state.motoMarker.longitude + this.state.destinationMarker.longitude) / 2); //checar se o mototaxista concluiu a corrida await this.handleRideStatus(); } Lembrando que esta condição está dentro da função que está em looping a cada cinco segundos. 3 - Esta é a função handleRideStatus que checa o status da corrida inclusive se ela foi finalizada: handleRideStatus = async () => { try { let resp = await api.get('/ride/finished', { params: { ride_id: this.state.ride_id, } }); //alert(resp.data[0].status); if (resp != null) { if (resp.data) { if (JSON.stringify(resp.data).includes('status')) { if (resp.data[0].status === 5) { clearInterval(this.state.intervalId); //parar de checar a localização do mototaxista await this.setState({ finished: true }); await this.setState({ index: 3 }); await this.setState({ message: 'Corrida concluída com sucesso!' }); await this.showAlert(); } } } } } catch (e) { console.log(e); } } Apenas quando o status consultado for igual a 5 (que é o status de corrida finalizada) a função para o looping e retorna a mensagem de finalização para o passageiro. Como foi dito antes, essa mensagem só está sendo retornada para o passageiro se ele trocar de rede ou desconectar e conectar novamente. Se vocês souberem o que pode estar ocasionando esta condição seria de grande ajuda para este projeto. Outro bug "misterioso" seria um pouco mais simples (acredito eu) do que esse. Ao ter uma corrida finalizada o aplicativo logado como passageiro retorna à tela inicial, que é a tela de criar uma nova corrida e ao criar essa nova corrida, a chamada a api que envia esses dados para o banco simplesmente não acontece, o código é executado até uma linha antes da chamada a api, na chamada, não acontece nada, não é retornado nenhum erro, mesmo a função estando dentro de um try e com suas condições de if e else. Só da para criar uma nova corrida se eu fechar e abrir o aplicativo, caso contrário, ele realmente não executa a chamada à API. Aqui está o trecho referente: if (this.state.created === false) { //se a corrida ainda não foi criada //enviar solicitação para os mototaxistas mais próximos da localização do usuário try { let resp = await api.get('/solicitation', { //testar aqui params: { user_id: this.state.user_id, starting_lat: this.state.starting_lat, starting_lng: this.state.starting_lng, destination_lat: this.state.destination_lat, destination_lng: this.state.destination_lng, distance: this.state.distance, duration: this.state.duration, origin_address: this.state.originAddress, destination_address: this.state.destinationAddress, price: this.state.price, payment_id: this.state.paymentId, } }); if (resp != null) { if (resp.data) { if (JSON.stringify(resp.data).includes('registred')) { //alert('enviou a solicitação'); ride_id = resp.data.ride_id; //await this.setState({ ride_id: resp.data.ride_id }); //alert('ride_id: ' + this.state.ride_id); this.setState({ intervalId: setInterval(() => { this.handleSearchRide(); }, 3000) }); } else { let msg = JSON.stringify(resp.data); const finalmsg = msg.toString().split('"').join(''); this.setState({ message: finalmsg }); this.showAlert(); } } } } catch (err) { this.setState({ message: 'Não foi possível buscar os dados do usuário. ' + Err }); this.showAlert(); } } else { //se a corrida já foi criada this.setState({ intervalId: setInterval(() => { this.handleSearchRide(); }, 3000) }); } A API /solicitation simplesmente não acontece se for chamada na criação de uma corrida após a finalização de uma última corrida. Já testei de várias formas, inclusive checando se todos os parâmetros estavam chegando certinhos, está tudo ok, então realmente não sabemos o motivo da chamada à API não estar sendo executada.
Categoria TI e Programação
Subcategoria Programação de Apps para Android, iOS e outros
Qual é o alcance do projeto? Bug ou alteração pequena
Isso é um projeto ou uma posição de trabalho? Um projeto
Tenho, atualmente Eu tenho especificações
Disponibilidade requerida Conforme necessário
Plataformas exigidas Android, iPhone
Eu preciso Eu preciso modificar um app existente
Tipo de aplicativo Utilidade - Aplicativo para utilidade (flash,calculadora,etc)
Precisa de back-end Sim
Gateway de pagamento Sim
Prazo de Entrega: Não estabelecido
Habilidades necessárias