diff --git a/src/App.tsx b/src/App.tsx index fc62329..1a09d48 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -24,7 +24,7 @@ import CompletarDocumento from './pages/CadastroCompletar/CompletarDocumento'; import CompletarTelefone from './pages/CadastroCompletar/CompletarTelefone'; import Transportes from './pages/Transportes/Transportes'; import BuscarPassageiro from './pages/BuscarPassageiro/BuscarPassageiro'; -import BuscarTransporte from './pages/BuscarTransporte/BuscarTransporte'; +import BuscarItinerarioList from './pages/BuscarItinerarioList'; import Debug from './pages/Debug'; /* Core CSS required for Ionic components to work properly */ @@ -73,8 +73,6 @@ const routes = ( - - diff --git a/src/constants/routes/transportsRoutes.ts b/src/constants/routes/itinerariesRoutes.ts similarity index 67% rename from src/constants/routes/transportsRoutes.ts rename to src/constants/routes/itinerariesRoutes.ts index 5bedf3b..6161bcb 100644 --- a/src/constants/routes/transportsRoutes.ts +++ b/src/constants/routes/itinerariesRoutes.ts @@ -1,4 +1,4 @@ -const transportsRoutesDefault = '/transports'; +const transportsRoutesDefault = '/itineraries'; const transportsRoutes = { create: { url: `${transportsRoutesDefault}` @@ -6,6 +6,9 @@ const transportsRoutes = { get: { url: `${transportsRoutesDefault}` }, + search: { + url: `${transportsRoutesDefault}/search` + }, update: { url: `${transportsRoutesDefault}` }, diff --git a/src/models/itinerary.model.ts b/src/models/itinerary.model.ts new file mode 100644 index 0000000..35a0e7a --- /dev/null +++ b/src/models/itinerary.model.ts @@ -0,0 +1,13 @@ +export interface Itinerary { + id_itinerary: number; + van_plate: string; + price: number; + days_of_week: number; + specific_day: Date; + estimated_departure_time: Date; + estimated_arrival_time: Date; + available_seats: number; + itinerary_nickname: string; + created_at: Date; + updated_at: Date; +} \ No newline at end of file diff --git a/src/pages/BuscarTransporte/BuscarTransporte.css b/src/pages/BuscarItinerario.css similarity index 100% rename from src/pages/BuscarTransporte/BuscarTransporte.css rename to src/pages/BuscarItinerario.css diff --git a/src/pages/BuscarItinerario.tsx b/src/pages/BuscarItinerario.tsx index dac430c..603fdad 100644 --- a/src/pages/BuscarItinerario.tsx +++ b/src/pages/BuscarItinerario.tsx @@ -1,190 +1,271 @@ import { - IonBackButton, - IonButtons, + IonButton, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonContent, - IonGrid, - IonHeader, IonIcon, IonItem, - IonLabel, - IonList, - IonListHeader, + IonItemDivider, IonPage, IonRow, - IonSelect, - IonSelectOption, - IonTitle, - IonToolbar, } from "@ionic/react"; -import { cashOutline, personOutline, starOutline } from "ionicons/icons"; +import { + arrowForwardOutline, + cashOutline, + chevronForwardOutline, + locateOutline, + locationOutline, + personOutline, + starOutline, + timeOutline, +} from "ionicons/icons"; +import "./BuscarItinerario.css"; + +import itinerariesService from "../services/functions/itinerariesService"; import { useEffect, useState } from "react"; import { useHistory } from "react-router"; -interface coordinates { - lat: number; - lgn: number; -} - -interface Itinerario { - motorista: string; - valor: string; - lugares: string; - avaliacao: string; - bairros_atendidos: coordinates[]; - destinos: coordinates[]; -} +import GooglePlacesAutocomplete, { + geocodeByAddress, + getLatLng, +} from "react-google-places-autocomplete"; +import { Itinerary } from "../models/itinerary.model"; const BuscarItinerario: React.FC = () => { - const [selectedBairro, setSelectedBairro] = useState(""); - const [selectedFaculdade, setSelectedFaculdade] = useState(""); + const history = useHistory(); + const [addressFrom, setAddressFrom] = useState(""); + const [coordinatesFrom, setCoordinatesFrom] = useState(""); + const [addressTo, setAddressTo] = useState(""); + const [coordinatesTo, setCoordinatesTo] = useState(""); + const [showModalEnd, setShowModalEnd] = useState(false); + const [addressResults, setAddressResults] = useState([]); + const [inputActive, setInputActive] = useState(""); - const [itinerarios, setItinerarios] = useState(); + const [itinerariesList, setItinerariesList] = useState(); + + // const optionsAddress = async (inputValue: any) => { + // let results = await autoCompleteAddress(inputValue) + // .then((res) => { + // return res.map((item: any) => { + // return { + // value: + // item.geometry.coordinates[0] + "," + item.geometry.coordinates[1], + // label: item.properties.formatted, + // }; + // }); + // }) + // .catch((err) => { + // console.log("Erro ao buscar endereço:", err); + // }); + // setAddressResults(results); + // }; + + // function setInputActiveOpenModal(input: string) { + // setInputActive(input); + // setShowModalEnd(true); + // } + + // function setAddress(div: any) { + // if (inputActive === "from") { + // setAddressFrom(div.target.attributes[2].value); + // setCoordinatesFrom(div.target.attributes[1].value); + // } else { + // setAddressTo(div.target.attributes[2].value); + // setCoordinatesTo(div.target.attributes[1].value); + // } + // setShowModalEnd(false); + // } useEffect(() => { - setItinerarios([ - { - motorista: "João", - valor: "R$ 150,00", - lugares: "2", - avaliacao: "4.5", - bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - { - motorista: "Ricardo", - valor: "R$ 180,00", - lugares: "5", - avaliacao: "4.0", - bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - { - motorista: "Luiz", - valor: "R$ 200,00", - lugares: "1", - avaliacao: "4.3", - bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - { - motorista: "Marcos", - valor: "R$ 199,00", - lugares: "6", - avaliacao: "4.9", - bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - { - motorista: "Orandi", - valor: "R$ 210,00", - lugares: "8", - avaliacao: "5.0", - bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - { - motorista: "Pedro", - valor: "R$ 189,00", - lugares: "4", - avaliacao: "4.1", - bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - { - motorista: "Pericles", - valor: "R$ 220,00", - lugares: "19", - avaliacao: "4.5", - bairros_atendidos: [{ lat: -23.873432, lgn: -47.142274 }], - destinos: [{ lat: -22.833645, lgn: -47.048905 }], - }, - ]); - }, []); + if (addressFrom.label && addressFrom.label.length > 0) { + geocodeByAddress(addressFrom.label) + .then((results) => getLatLng(results[0])) + .then(({ lat, lng }) => setCoordinatesFrom({ lat, lng })); + } + }, [addressFrom]); + + useEffect(() => { + if (addressTo.label && addressTo.label.length > 0) { + geocodeByAddress(addressTo.label) + .then((results) => getLatLng(results[0])) + .then(({ lat, lng }) => setCoordinatesTo({ lat, lng })); + } + }, [addressTo]); + + async function buscarItinerarios() { + if (!coordinatesFrom || !coordinatesTo || !addressFrom || !addressTo) { + return; + } + + const itinerariesList = await itinerariesService.getAllItineraries(); + + setItinerariesList(itinerariesList); + } return ( - - - Buscar itinerários - - - - - - - {/* - */} - - Filtros de busca - - Bairro de origem - { - setSelectedBairro(e.detail.value!); - }} - > - Vila Marieta - Botafogo - Cambuí - - - - - Instituição de ensino de destino - { - setSelectedFaculdade(e.detail.value!); - }} - > - - PUC Campinas (campus 1) - - Unicamp - UNIP - - - - {/* */} - - {/* */} - {selectedBairro && selectedFaculdade ? ( - <> - {itinerarios ? ( - itinerarios.map((itinerario, index) => { - return ( - - - - {/*

Bairros atendidos: {itinerario.bairros_atendidos[0].lat},{itinerario.bairros_atendidos[0].lgn}

*/} - {/*

Instituições de ensino atendidas: {itinerario.destinos[0].lat},{itinerario.destinos[0].lgn}

*/} -
- -

Vagas disponíveis: {itinerario.lugares}

-

Motorista: {itinerario.motorista}

-

Valor: {itinerario.valor}

-
-
-
- ); - }) - ) : ( - <> - )} - + + +
+ + {/* setInputActiveOpenModal("from")} + value={addressFrom} + placeholder="R. José Paulino, 1234 - Centro, Campinas - SP, 13013-001" + /> */} + +
+
+ + {/* setInputActiveOpenModal("to")} + value={addressTo} + placeholder="PUC Campinas" + /> */} + +
+
+ buscarItinerarios()}> + Buscar + +
+
+
+ Pesquisas recentes + + +
+ Rua Tal Tal, 154, São Paulo - SP + + USP +
+ Há 1 hora +
+ +
+ + +
+ Taquaral + + PUC-Campinas +
+ Há 2 hora +
+ +
+ {/* + +
+ setShowModalEnd(false)} + /> + optionsAddress(e.detail.value)} + placeholder="R. José Paulino, 1234 - Centro, Campinas - SP, 13013-001" + className="search-modal" + /> +
+ {addressResults.length > 0 ? ( + addressResults.map((item: any) => { + return ( +
setAddress(e)} + > + {item.label} + +
+ ); + }) ) : ( - <> + <> + +
+ )} - {/*
-
*/} +
+ */} + + {itinerariesList ? ( + <> + Resultados + {itinerariesList.map((itinerary, index) => { + return ( + { history.push(`/itinerary/${itinerary.id_itinerary}`) }}> + + {itinerary.itinerary_nickname} + +

+ Vagas disponíveis:{" "} + {itinerary.available_seats} +

+

+ Motorista:{" "} + {itinerary.price} +

+

+ Valor:{" "} + {itinerary.van_plate} +

+
+
+
+ ); + })} + + ) : ( + <> + )}
); diff --git a/src/pages/BuscarItinerarioList.tsx b/src/pages/BuscarItinerarioList.tsx new file mode 100644 index 0000000..dac430c --- /dev/null +++ b/src/pages/BuscarItinerarioList.tsx @@ -0,0 +1,193 @@ +import { + IonBackButton, + IonButtons, + IonCard, + IonCardContent, + IonCardHeader, + IonCardSubtitle, + IonCardTitle, + IonContent, + IonGrid, + IonHeader, + IonIcon, + IonItem, + IonLabel, + IonList, + IonListHeader, + IonPage, + IonRow, + IonSelect, + IonSelectOption, + IonTitle, + IonToolbar, +} from "@ionic/react"; +import { cashOutline, personOutline, starOutline } from "ionicons/icons"; + +import { useEffect, useState } from "react"; +import { useHistory } from "react-router"; + +interface coordinates { + lat: number; + lgn: number; +} + +interface Itinerario { + motorista: string; + valor: string; + lugares: string; + avaliacao: string; + bairros_atendidos: coordinates[]; + destinos: coordinates[]; +} + +const BuscarItinerario: React.FC = () => { + const [selectedBairro, setSelectedBairro] = useState(""); + const [selectedFaculdade, setSelectedFaculdade] = useState(""); + + const [itinerarios, setItinerarios] = useState(); + + useEffect(() => { + setItinerarios([ + { + motorista: "João", + valor: "R$ 150,00", + lugares: "2", + avaliacao: "4.5", + bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + { + motorista: "Ricardo", + valor: "R$ 180,00", + lugares: "5", + avaliacao: "4.0", + bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + { + motorista: "Luiz", + valor: "R$ 200,00", + lugares: "1", + avaliacao: "4.3", + bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + { + motorista: "Marcos", + valor: "R$ 199,00", + lugares: "6", + avaliacao: "4.9", + bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + { + motorista: "Orandi", + valor: "R$ 210,00", + lugares: "8", + avaliacao: "5.0", + bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + { + motorista: "Pedro", + valor: "R$ 189,00", + lugares: "4", + avaliacao: "4.1", + bairros_atendidos: [{ lat: -22.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + { + motorista: "Pericles", + valor: "R$ 220,00", + lugares: "19", + avaliacao: "4.5", + bairros_atendidos: [{ lat: -23.873432, lgn: -47.142274 }], + destinos: [{ lat: -22.833645, lgn: -47.048905 }], + }, + ]); + }, []); + + return ( + + + + Buscar itinerários + + + + + + + + {/* + */} + + Filtros de busca + + Bairro de origem + { + setSelectedBairro(e.detail.value!); + }} + > + Vila Marieta + Botafogo + Cambuí + + + + + Instituição de ensino de destino + { + setSelectedFaculdade(e.detail.value!); + }} + > + + PUC Campinas (campus 1) + + Unicamp + UNIP + + + + {/* */} + + {/* */} + {selectedBairro && selectedFaculdade ? ( + <> + {itinerarios ? ( + itinerarios.map((itinerario, index) => { + return ( + + + + {/*

Bairros atendidos: {itinerario.bairros_atendidos[0].lat},{itinerario.bairros_atendidos[0].lgn}

*/} + {/*

Instituições de ensino atendidas: {itinerario.destinos[0].lat},{itinerario.destinos[0].lgn}

*/} +
+ +

Vagas disponíveis: {itinerario.lugares}

+

Motorista: {itinerario.motorista}

+

Valor: {itinerario.valor}

+
+
+
+ ); + }) + ) : ( + <> + )} + + ) : ( + <> + )} + {/*
+
*/} +
+
+ ); +}; + +export default BuscarItinerario; diff --git a/src/pages/BuscarTransporte/BuscarTransporte.tsx b/src/pages/BuscarTransporte/BuscarTransporte.tsx deleted file mode 100644 index 933869e..0000000 --- a/src/pages/BuscarTransporte/BuscarTransporte.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { - IonButton, - IonCard, - IonCardContent, - IonContent, - IonIcon, - IonPage, - IonRow, -} from "@ionic/react"; -import { - arrowForwardOutline, - chevronForwardOutline, - locateOutline, - locationOutline, - timeOutline, -} from "ionicons/icons"; -import "./BuscarTransporte.css"; - -import { useEffect, useState } from "react"; -import { useHistory } from "react-router"; - -import GooglePlacesAutocomplete, { - geocodeByAddress, - getLatLng, -} from "react-google-places-autocomplete"; - -const BuscarTransporte: React.FC = () => { - const history = useHistory(); - const [addressFrom, setAddressFrom] = useState(""); - const [coordinatesFrom, setCoordinatesFrom] = useState(""); - const [addressTo, setAddressTo] = useState(""); - const [coordinatesTo, setCoordinatesTo] = useState(""); - const [showModalEnd, setShowModalEnd] = useState(false); - const [addressResults, setAddressResults] = useState([]); - const [inputActive, setInputActive] = useState(""); - - // const optionsAddress = async (inputValue: any) => { - // let results = await autoCompleteAddress(inputValue) - // .then((res) => { - // return res.map((item: any) => { - // return { - // value: - // item.geometry.coordinates[0] + "," + item.geometry.coordinates[1], - // label: item.properties.formatted, - // }; - // }); - // }) - // .catch((err) => { - // console.log("Erro ao buscar endereço:", err); - // }); - // setAddressResults(results); - // }; - - // function setInputActiveOpenModal(input: string) { - // setInputActive(input); - // setShowModalEnd(true); - // } - - // function setAddress(div: any) { - // if (inputActive === "from") { - // setAddressFrom(div.target.attributes[2].value); - // setCoordinatesFrom(div.target.attributes[1].value); - // } else { - // setAddressTo(div.target.attributes[2].value); - // setCoordinatesTo(div.target.attributes[1].value); - // } - // setShowModalEnd(false); - // } - - useEffect(() => { - if (addressFrom.label && addressFrom.label.length > 0) { - geocodeByAddress(addressFrom.label) - .then((results) => getLatLng(results[0])) - .then(({ lat, lng }) => setCoordinatesFrom({ lat, lng })); - } - }, [addressFrom]); - - useEffect(() => { - if (addressTo.label && addressTo.label.length > 0) { - geocodeByAddress(addressTo.label) - .then((results) => getLatLng(results[0])) - .then(({ lat, lng }) => setCoordinatesTo({ lat, lng })); - } - }, [addressTo]); - - function buscaTransporte() { - if (coordinatesFrom && coordinatesTo && addressFrom && addressTo) { - history.push({ - pathname: "/transportes", - state: { - coordinatesFrom, - coordinatesTo, - addressFrom, - addressTo, - }, - }); - } - } - - return ( - - - - -
- - {/* setInputActiveOpenModal("from")} - value={addressFrom} - placeholder="R. José Paulino, 1234 - Centro, Campinas - SP, 13013-001" - /> */} - -
-
- - {/* setInputActiveOpenModal("to")} - value={addressTo} - placeholder="PUC Campinas" - /> */} - -
-
- buscaTransporte()}> - Buscar - -
-
-
- - -
- Rua Tal Tal, 154, São Paulo - SP - - USP -
- Há 1 hora -
- -
- - -
- Taquaral - - PUC-Campinas -
- Há 2 hora -
- -
- {/* - -
- setShowModalEnd(false)} - /> - optionsAddress(e.detail.value)} - placeholder="R. José Paulino, 1234 - Centro, Campinas - SP, 13013-001" - className="search-modal" - /> -
- {addressResults.length > 0 ? ( - addressResults.map((item: any) => { - return ( -
setAddress(e)} - > - {item.label} - -
- ); - }) - ) : ( - <> - -
- - )} -
-
*/} -
-
- ); -}; - -export default BuscarTransporte; diff --git a/src/pages/Transportes/Transportes.tsx b/src/pages/Transportes/Transportes.tsx index 9853750..82694f7 100644 --- a/src/pages/Transportes/Transportes.tsx +++ b/src/pages/Transportes/Transportes.tsx @@ -45,7 +45,7 @@ import { } from "ionicons/icons"; import { useEffect, useState } from "react"; import { useHistory, useLocation } from "react-router"; -import { getTransportes } from "../../services/functions/transportsService"; +import itinerariesService from "../../services/functions/itinerariesService"; import { createUserSearch } from "../../services/api/users"; import "./Transportes.css"; @@ -60,7 +60,7 @@ const Transportes: React.FC = () => { const history = useHistory(); const location = useLocation(); const props = location.state as InfoBusca; - const [transportes, setTransportes] = useState([]); + const [itinerarios, setItinerarios] = useState([]); const [showModalFilters, setShowModalFilters] = useState(false); const [showToast, setShowToast] = useState(false); const [messageToast, setMessageToast ] = useState(''); @@ -68,13 +68,13 @@ const Transportes: React.FC = () => { useEffect(() => { if (props) { - buscaTransportes(); + buscaItinerarios(); } }, [props]); - async function buscaTransportes() { - let data = (await getTransportes(props)) as any; - setTransportes(data); + async function buscaItinerarios() { + let data = (await itinerariesService.searchItineraries(props)) as any; + setItinerarios(data); } function criaAlerta(){ @@ -107,7 +107,7 @@ const Transportes: React.FC = () => { - {transportes && transportes.length > 0? ( + {itinerarios && itinerarios.length > 0? (
@@ -127,8 +127,8 @@ const Transportes: React.FC = () => { ) : (

Não foi encontrado nenhum transporte que atenda essa rota.

)} - {transportes && - transportes.map((record: any, index: any) => { + {itinerarios && + itinerarios.map((record: any, index: any) => { return ( diff --git a/src/services/api/transports.ts b/src/services/api/itineraries.ts similarity index 68% rename from src/services/api/transports.ts rename to src/services/api/itineraries.ts index c9d2677..b9149c6 100644 --- a/src/services/api/transports.ts +++ b/src/services/api/itineraries.ts @@ -1,7 +1,7 @@ import instance from './api'; // import LocalStorage from '../LocalStorage'; -import transportsRoutes from '../../constants/routes/transportsRoutes'; +import transportsRoutes from '../../constants/routes/itinerariesRoutes'; import { AxiosRequestHeaders } from 'axios'; import LocalStorage from '../../LocalStorage'; import { setStore } from '../../store/RecordsStore'; @@ -19,7 +19,7 @@ function updateHeader() { } } -export interface getTransportsRequest { +export interface GetItinerariesRequest { coordinatesFrom: { lat: number, lng: number @@ -30,7 +30,14 @@ export interface getTransportsRequest { } } -export async function get(coordinates: getTransportsRequest) { +export async function get() { + updateHeader(); + + const response = await instance.get(transportsRoutes.get.url, { headers: header }); + return response.data; +} + +export async function search(coordinates: GetItinerariesRequest) { updateHeader(); const response = await instance.get(transportsRoutes.get.url + `/${coordinates}`, { headers: header }); diff --git a/src/services/functions/itinerariesService.ts b/src/services/functions/itinerariesService.ts new file mode 100644 index 0000000..4f265ae --- /dev/null +++ b/src/services/functions/itinerariesService.ts @@ -0,0 +1,36 @@ +import * as itinerariesRoutes from '../api/itineraries'; + +interface CoordinatesRequest { + coordinatesFrom:{ + lat: number, + lng: number + }, + coordinatesTo:{ + lat: number, + lng: number + } +} + +export async function getAllItineraries() : Promise { + let res: any; + + try { + res = await itinerariesRoutes.get(); + } catch (error) { + // TODO + } + + return res.data +} + + +export async function searchItineraries(request: CoordinatesRequest) : Promise { + let res + try { + let res : any = await itinerariesRoutes.search(request); + } catch (error) { + // TODO + } +} + +export default { getAllItineraries, searchItineraries } diff --git a/src/services/functions/transportsService.ts b/src/services/functions/transportsService.ts deleted file mode 100644 index 611196a..0000000 --- a/src/services/functions/transportsService.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as transportsRoutes from '../api/transports'; - -interface CoordinatesRequest { - coordinatesFrom:{ - lat: number, - lng: number - }, - coordinatesTo:{ - lat: number, - lng: number - } -} - -export async function getTransportes(request: CoordinatesRequest) : Promise { - try { - let res : any = await transportsRoutes.get(request); - } catch (error) { - - } -}