Refatora página de lista de itinerários da busca
This commit is contained in:
@@ -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" />
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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 Zé</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;
|
||||||
Reference in New Issue
Block a user