Refatora página de lista de itinerários da busca

This commit is contained in:
Matheus Albino Brunhara
2022-09-09 21:36:05 -03:00
parent f99ea6f24a
commit 46768cb941
5 changed files with 109 additions and 239 deletions

View File

@@ -33,7 +33,7 @@ import MeusItinerarios from "./pages/MeusItinerarios/MeusItinerarios";
import Buscas from "./pages/Buscas"; import Buscas from "./pages/Buscas";
import BuscarItinerario from "./pages/BuscarItinerario"; import BuscarItinerario from "./pages/BuscarItinerario";
import BuscarPassageiro from "./pages/BuscarPassageiro/BuscarPassageiro"; import BuscarPassageiro from "./pages/BuscarPassageiro/BuscarPassageiro";
import Transportes from "./pages/Transportes/Transportes"; import ListaItinerarios from "./pages/ListaItinerarios";
/* Core CSS required for Ionic components to work properly */ /* Core CSS required for Ionic components to work properly */
import "@ionic/react/css/core.css"; import "@ionic/react/css/core.css";
@@ -93,7 +93,7 @@ const routes = (
<Route exact path="/buscas" component={Buscas}></Route> <Route exact path="/buscas" component={Buscas}></Route>
<Route exact path="/buscar/itinerario" component={BuscarItinerario}></Route> <Route exact path="/buscar/itinerario" component={BuscarItinerario}></Route>
<Route exact path="/buscar/passageiro" component={BuscarPassageiro}></Route> <Route exact path="/buscar/passageiro" component={BuscarPassageiro}></Route>
<Route exact path="/transportes" component={Transportes}></Route> <Route exact path="/buscar/itinerario/lista" component={ListaItinerarios}></Route>
<Route exact path="/"> <Route exact path="/">
<Redirect to="/home" /> <Redirect to="/home" />

View File

@@ -6,6 +6,8 @@
.button-search{ .button-search{
display: flex; display: flex;
justify-content: center; justify-content: center;
margin-top: 50%;
} }
.latest-searches{ .latest-searches{

View File

@@ -1,31 +1,19 @@
import { import {
IonBackButton,
IonButton, IonButton,
IonButtons,
IonCard, IonCard,
IonCardContent, IonCardContent,
IonCardHeader,
IonCardSubtitle,
IonCardTitle,
IonContent, IonContent,
IonHeader,
IonIcon, IonIcon,
IonItem,
IonItemDivider, IonItemDivider,
IonPage, IonPage,
IonRow, IonRow,
IonTitle,
IonToast, IonToast,
IonToolbar,
} from "@ionic/react"; } from "@ionic/react";
import { import {
arrowForwardOutline, arrowForwardOutline,
cashOutline,
chevronForwardOutline, chevronForwardOutline,
locateOutline, locateOutline,
locationOutline, locationOutline,
personOutline,
starOutline,
timeOutline, timeOutline,
} from "ionicons/icons"; } from "ionicons/icons";
import "./BuscarItinerario.css"; import "./BuscarItinerario.css";
@@ -39,7 +27,6 @@ import GooglePlacesAutocomplete, {
geocodeByAddress, geocodeByAddress,
getLatLng, getLatLng,
} from "react-google-places-autocomplete"; } from "react-google-places-autocomplete";
import { Itinerary } from "../models/itinerary.model";
import { PageHeader } from "../components/PageHeader"; import { PageHeader } from "../components/PageHeader";
import { closeToast } from "../services/utils"; import { closeToast } from "../services/utils";
@@ -56,47 +43,9 @@ const BuscarItinerario: React.FC = () => {
const [coordinatesFrom, setCoordinatesFrom] = useState<any>(""); const [coordinatesFrom, setCoordinatesFrom] = useState<any>("");
const [addressTo, setAddressTo] = useState<any>(""); const [addressTo, setAddressTo] = useState<any>("");
const [coordinatesTo, setCoordinatesTo] = useState<any>(""); const [coordinatesTo, setCoordinatesTo] = useState<any>("");
const [showModalEnd, setShowModalEnd] = useState(false);
const [addressResults, setAddressResults] = useState<any[]>([]);
const [inputActive, setInputActive] = useState("");
const [recentSearches, setRecentSearches] = useState<any[]>([]); const [recentSearches, setRecentSearches] = useState<any[]>([]);
const [itinerariesList, setItinerariesList] = useState<Itinerary[]>();
// 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(() => { useEffect(() => {
if (addressFrom.label && addressFrom.label.length > 0) { if (addressFrom.label && addressFrom.label.length > 0) {
geocodeByAddress(addressFrom.label) geocodeByAddress(addressFrom.label)
@@ -118,10 +67,12 @@ const BuscarItinerario: React.FC = () => {
return; return;
} }
const maxRecentSearchesLength = 0 const maxRecentSearchesLength = 0;
if (recentSearches.length >= maxRecentSearchesLength) { if (recentSearches.length >= maxRecentSearchesLength) {
setRecentSearches(recentSearches.slice(recentSearches.length - maxRecentSearchesLength)); setRecentSearches(
recentSearches.slice(recentSearches.length - maxRecentSearchesLength)
);
} }
setRecentSearches((arr) => [ setRecentSearches((arr) => [
@@ -134,10 +85,12 @@ const BuscarItinerario: React.FC = () => {
]); ]);
await itinerariesService await itinerariesService
.searchItineraries({ // TODO, desfazer
coordinatesFrom, // .searchItineraries({
coordinatesTo, // coordinatesFrom,
}) // coordinatesTo,
// })
.getAllItineraries()
.then((response) => { .then((response) => {
// if (response.status === "error") { // if (response.status === "error") {
// setToastColor("danger"); // setToastColor("danger");
@@ -147,7 +100,18 @@ const BuscarItinerario: React.FC = () => {
// return; // return;
// } // }
setItinerariesList(response); history.push({
pathname: "/buscar/itinerario/lista",
state: {
coordinatesFrom,
coordinatesTo,
addressFrom,
addressTo,
itineraries: response,
},
});
// setItinerariesList(response);
}) })
.catch((err) => { .catch((err) => {
setToastColor("danger"); setToastColor("danger");
@@ -225,7 +189,8 @@ const BuscarItinerario: React.FC = () => {
return ( return (
<> <>
<div> <div>
<IonRow key={index} <IonRow
key={index}
class="latest-searches" class="latest-searches"
onClick={() => { onClick={() => {
fillSearchBars(search.addressFrom, search.addressTo); fillSearchBars(search.addressFrom, search.addressTo);
@@ -258,102 +223,6 @@ const BuscarItinerario: React.FC = () => {
) : ( ) : (
<></> <></>
)} )}
{/* <IonRow class="latest-searches">
<IonIcon
className="icon-align-vcenter"
size="large"
icon={timeOutline}
/>
<div className="div_from_to">
<span>Taquaral</span>
<IonIcon icon={arrowForwardOutline}></IonIcon>
<span>PUC-Campinas</span>
<br />
<small>Há 2 hora</small>
</div>
<IonIcon
className="icon-forward icon-align-vcenter"
size="large"
icon={chevronForwardOutline}
/>
</IonRow> */}
{/* <IonModal isOpen={showModalEnd}>
<IonContent>
<div className="header-search-modal">
<IonIcon
className="icon-return-modal"
icon={arrowBack}
onClick={() => setShowModalEnd(false)}
/>
<IonInput
onIonChange={(e) => optionsAddress(e.detail.value)}
placeholder="R. José Paulino, 1234 - Centro, Campinas - SP, 13013-001"
className="search-modal"
/>
</div>
{addressResults.length > 0 ? (
addressResults.map((item: any) => {
return (
<div
key={item.value}
className="modal-search-results"
data-value={item.value}
data-label={item.label}
onClick={(e) => setAddress(e)}
>
{item.label}
<IonIcon
className="icon-results-modal"
icon={chevronForwardOutline}
/>
</div>
);
})
) : (
<>
<IonProgressBar type="indeterminate" />
<br />
</>
)}
</IonContent>
</IonModal> */}
{itinerariesList && itinerariesList.length !== 0 ? (
<>
<IonItemDivider color="secondary">Resultados</IonItemDivider>
{itinerariesList.map((itinerary, index) => {
return (
<IonCard
button
key={index}
onClick={() => {
history.push(`/itinerary/${itinerary.id_itinerary}`);
}}
>
<IonCardHeader>
<IonCardTitle>{itinerary.itinerary_nickname}</IonCardTitle>
<IonCardSubtitle>
<p>
<IonIcon icon={personOutline} /> Vagas disponíveis:{" "}
{itinerary.available_seats}
</p>
<p>
<IonIcon icon={starOutline} /> Motorista:{" "}
{itinerary.price}
</p>
<p>
<IonIcon icon={cashOutline} /> Valor:{" "}
{itinerary.vehicle_plate}
</p>
</IonCardSubtitle>
</IonCardHeader>
</IonCard>
);
})}
</>
) : (
<></>
)}
<IonToast <IonToast
color={toastColor} color={toastColor}

View File

@@ -5,100 +5,94 @@ import {
IonFabButton, IonFabButton,
IonIcon, IonIcon,
IonCard, IonCard,
IonInput,
IonRow,
IonCol,
IonCardContent,
IonButton, IonButton,
IonHeader, IonHeader,
IonToolbar, IonToolbar,
IonButtons,
IonBackButton,
IonTabs,
IonTabBar,
IonTabButton,
IonLabel, IonLabel,
IonBadge,
IonRouterOutlet,
IonSlides,
IonSlide,
IonModal, IonModal,
IonList,
IonRadioGroup, IonRadioGroup,
IonListHeader,
IonItem, IonItem,
IonRadio, IonRadio,
IonCheckbox, IonCheckbox,
IonFooter, IonFooter,
IonToast, IonToast,
IonCardHeader,
IonCardSubtitle,
IonCardTitle,
IonItemDivider,
} from "@ionic/react"; } from "@ionic/react";
import { import {
arrowBack,
arrowBackOutline,
arrowForwardOutline, arrowForwardOutline,
chevronBackOutline, cashOutline,
chevronForwardOutline,
closeOutline, closeOutline,
locateOutline, personOutline,
locationOutline, starOutline,
timeOutline,
} from "ionicons/icons"; } from "ionicons/icons";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { useHistory, useLocation } from "react-router"; import { useHistory, useLocation } from "react-router";
import itinerariesService from "../../services/functions/itinerariesService"; import { createUserSearch } from "../services/api/users";
import { createUserSearch } from "../../services/api/users"; import "./ListaItinerarios.css";
import "./Transportes.css"; import { closeToast } from "../services/utils";
import { closeToast } from "../../services/utils"; import { Itinerary } from "../models/itinerary.model";
import { PageHeader } from "../components/PageHeader";
interface InfoBusca { interface InfoBusca {
addressFrom: any; addressFrom: any;
addressTo: any; addressTo: any;
coordinatesFrom: any; coordinatesFrom: any;
coordinatesTo: any; coordinatesTo: any;
itineraries: Itinerary[];
} }
const Transportes: React.FC = () => { const ListaItinerarios: React.FC = () => {
const history = useHistory(); const history = useHistory();
const location = useLocation(); const location = useLocation();
const props = location.state as InfoBusca; const props = location.state as InfoBusca;
const [itinerarios, setItinerarios] = useState([]); const [itinerariesList, setItinerariesList] = useState<Itinerary[]>([]);
const [showModalFilters, setShowModalFilters] = useState(false); const [showModalFilters, setShowModalFilters] = useState(false);
const [showToast, setShowToast] = useState(false); const [showToast, setShowToast] = useState(false);
const [messageToast, setMessageToast ] = useState(''); const [messageToast, setMessageToast] = useState("");
const [toastColor, setToastColor] = useState('success'); const [toastColor, setToastColor] = useState("success");
useEffect(() => { useEffect(() => {
if (props) { if (props.itineraries) {
buscaItinerarios(); setItinerariesList(props.itineraries);
} }
}, [props]); }, [props]);
async function buscaItinerarios() { useEffect(() => {
let data = (await itinerariesService.searchItineraries(props)) as any; if (props.itineraries) {
setItinerarios(data); setItinerariesList(props.itineraries);
} }
}, [props]);
function criaAlerta() { function criaAlerta() {
createUserSearch(props.coordinatesFrom.lat, props.coordinatesFrom.lng, props.addressTo.label).then(() => { createUserSearch(
setMessageToast('Alerta criado com sucesso!'); props.coordinatesFrom.lat,
setShowToast(true); props.coordinatesFrom.lng,
}).catch((err:any) => { props.addressTo.label
setMessageToast('Não foi possível criar o alerta!'); )
setToastColor('danger'); .then(() => {
setMessageToast("Alerta criado com sucesso!");
setShowToast(true); setShowToast(true);
}) })
.catch((err: any) => {
setMessageToast("Não foi possível criar o alerta!");
setToastColor("danger");
setShowToast(true);
});
} }
return ( return (
<IonPage> <IonPage>
{/* TODO, componentizar Header */} <PageHeader pageName="Itinerários" backButtonPageUrl="" />
<IonHeader> <IonHeader>
<div className="header-page"> <div className="header-page">
{/* <IonButtons slot="start"> {/* <IonButtons slot="start">
<IonBackButton text={'aaaa'} icon={arrowBack} defaultHref='buscar-transporte' /> <IonBackButton text={'aaaa'} icon={arrowBack} defaultHref='buscar-transporte' />
</IonButtons> */} </IonButtons> */}
<span className="span-info-back" onClick={history.goBack}> <span className="span-info-back">
<IonIcon className="icon-return" icon={chevronBackOutline} />
<div className="address-from-to"> <div className="address-from-to">
<span>{props.addressFrom.label}</span> <span>{props.addressFrom.label}</span>
<IonIcon icon={arrowForwardOutline} /> <IonIcon icon={arrowForwardOutline} />
@@ -109,39 +103,44 @@ const Transportes: React.FC = () => {
</div> </div>
</IonHeader> </IonHeader>
<IonContent fullscreen> <IonContent fullscreen>
{itinerarios && itinerarios.length > 0? ( {itinerariesList && itinerariesList.length !== 0 ? (
<div className="header-tabs"> <>
<IonSlides> <IonItemDivider color="secondary">Resultados</IonItemDivider>
<IonSlide> {itinerariesList.map((itinerary, index) => {
<h5>Mais barata</h5>
<IonCard className="card-transporte">
<IonCardContent>Seu João</IonCardContent>
</IonCard>
</IonSlide>
<IonSlide>
<h5>Melhor avaliação</h5>
<IonCard className="card-transporte">
<IonCardContent>Seu </IonCardContent>
</IonCard>
</IonSlide>
</IonSlides>
</div>
)
:
(<h1 className="msg-not-found">Não foi encontrado nenhum transporte que atenda essa rota.</h1>)}
{itinerarios &&
itinerarios.map((record: any, index: any) => {
return ( return (
<IonCard className="card-transporte" key={index}> <IonCard
<IonCardContent> button
<h1>Motorista: {record.motorista}</h1> key={index}
<div>Avaliação: {record.avaliacao}</div> onClick={() => {
<div>Valor: {record.valor}</div> history.push(`/itinerary/${itinerary.id_itinerary}`);
<div>Lugares disponíveis: {record.lugares}</div> }}
</IonCardContent> >
<IonCardHeader>
<IonCardTitle>{itinerary.itinerary_nickname}</IonCardTitle>
<IonCardSubtitle>
<p>
<IonIcon icon={personOutline} /> Vagas disponíveis:{" "}
{itinerary.available_seats}
</p>
<p>
<IonIcon icon={starOutline} /> Motorista:{" "}
{itinerary.price}
</p>
<p>
<IonIcon icon={cashOutline} /> Valor:{" "}
{itinerary.vehicle_plate}
</p>
</IonCardSubtitle>
</IonCardHeader>
</IonCard> </IonCard>
); );
})} })}
</>
) : (
<h1 className="msg-not-found">
Não foi encontrado nenhum itinerário que atenda essa rota.
</h1>
)}
<div className="button-criar-alerta"> <div className="button-criar-alerta">
<IonButton onClick={() => criaAlerta()}>Criar Alerta</IonButton> <IonButton onClick={() => criaAlerta()}>Criar Alerta</IonButton>
@@ -221,4 +220,4 @@ const Transportes: React.FC = () => {
); );
}; };
export default Transportes; export default ListaItinerarios;