Diversas alterações
This commit is contained in:
@@ -1,4 +1,10 @@
|
|||||||
import { IonBackButton, IonButtons, IonHeader, IonTitle, IonToolbar } from "@ionic/react";
|
import {
|
||||||
|
IonBackButton,
|
||||||
|
IonButtons,
|
||||||
|
IonHeader,
|
||||||
|
IonTitle,
|
||||||
|
IonToolbar,
|
||||||
|
} from "@ionic/react";
|
||||||
|
|
||||||
interface ComponentProps {
|
interface ComponentProps {
|
||||||
pageName: string;
|
pageName: string;
|
||||||
@@ -6,11 +12,16 @@ interface ComponentProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const PageHeader = (props: ComponentProps) => (
|
export const PageHeader = (props: ComponentProps) => (
|
||||||
<IonHeader translucent>
|
<IonHeader translucent>
|
||||||
<IonToolbar>
|
<IonToolbar>
|
||||||
<IonTitle>{props.pageName}</IonTitle>
|
<IonTitle>{props.pageName}</IonTitle>
|
||||||
<IonButtons slot="start">
|
<IonButtons slot="start">
|
||||||
<IonBackButton text="" defaultHref={ props.backButtonPageUrl ? props.backButtonPageUrl : undefined } />
|
<IonBackButton
|
||||||
|
text=""
|
||||||
|
defaultHref={
|
||||||
|
props.backButtonPageUrl ? props.backButtonPageUrl : undefined
|
||||||
|
}
|
||||||
|
/>
|
||||||
</IonButtons>
|
</IonButtons>
|
||||||
</IonToolbar>
|
</IonToolbar>
|
||||||
</IonHeader>
|
</IonHeader>
|
||||||
|
|||||||
@@ -70,9 +70,14 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin: 1rem 0 5.5rem 0;
|
/* margin: 1rem 0 5.5rem 0; */
|
||||||
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.msg-not-found{
|
.msg-not-found{
|
||||||
margin: 1.5rem;
|
margin: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.msg-not-found span {
|
||||||
|
font-size: 120%;
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,16 @@ import {
|
|||||||
IonCardSubtitle,
|
IonCardSubtitle,
|
||||||
IonCardTitle,
|
IonCardTitle,
|
||||||
IonItemDivider,
|
IonItemDivider,
|
||||||
|
IonCardContent,
|
||||||
|
IonChip,
|
||||||
|
IonGrid,
|
||||||
|
IonRow,
|
||||||
|
IonCol,
|
||||||
|
IonList,
|
||||||
|
IonListHeader,
|
||||||
|
IonTitle,
|
||||||
|
IonBackButton,
|
||||||
|
IonButtons,
|
||||||
} from "@ionic/react";
|
} from "@ionic/react";
|
||||||
import {
|
import {
|
||||||
arrowForwardOutline,
|
arrowForwardOutline,
|
||||||
@@ -32,7 +42,7 @@ import { useEffect, useState } from "react";
|
|||||||
import { useHistory, useLocation } from "react-router";
|
import { useHistory, useLocation } from "react-router";
|
||||||
import { createUserSearch } from "../services/api/users";
|
import { createUserSearch } from "../services/api/users";
|
||||||
import "./ListaItinerarios.css";
|
import "./ListaItinerarios.css";
|
||||||
import { closeToast } from "../services/utils";
|
import { closeToast, convertNumberToPrice } from "../services/utils";
|
||||||
import { Itinerary } from "../models/itinerary.model";
|
import { Itinerary } from "../models/itinerary.model";
|
||||||
import { PageHeader } from "../components/PageHeader";
|
import { PageHeader } from "../components/PageHeader";
|
||||||
|
|
||||||
@@ -50,7 +60,7 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const props = location.state as InfoBusca;
|
const props = location.state as InfoBusca;
|
||||||
const [itinerariesList, setItinerariesList] = useState<Itinerary[]>([]);
|
const [itinerariesList, setItinerariesList] = useState<Itinerary[]>([]);
|
||||||
const [showModalFilters, setShowModalFilters] = useState(false);
|
const [showModalFilters, setShowModalFilters] = useState(true);
|
||||||
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");
|
||||||
@@ -61,12 +71,6 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
}
|
}
|
||||||
}, [props]);
|
}, [props]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (props.itineraries) {
|
|
||||||
setItinerariesList(props.itineraries);
|
|
||||||
}
|
|
||||||
}, [props]);
|
|
||||||
|
|
||||||
function criaAlerta() {
|
function criaAlerta() {
|
||||||
createUserSearch(
|
createUserSearch(
|
||||||
props.coordinatesFrom.lat,
|
props.coordinatesFrom.lat,
|
||||||
@@ -86,23 +90,22 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<IonPage>
|
<IonPage>
|
||||||
<PageHeader pageName="Itinerários" backButtonPageUrl="" />
|
<PageHeader
|
||||||
<IonHeader>
|
pageName="Resultados da busca"
|
||||||
<div className="header-page">
|
backButtonPageUrl="/buscar/itinerario"
|
||||||
{/* <IonButtons slot="start">
|
/>
|
||||||
<IonBackButton text={'aaaa'} icon={arrowBack} defaultHref='buscar-transporte' />
|
|
||||||
</IonButtons> */}
|
|
||||||
<span className="span-info-back">
|
|
||||||
<div className="address-from-to">
|
|
||||||
<span>{props.addressFrom.label}</span>
|
|
||||||
<IonIcon icon={arrowForwardOutline} />
|
|
||||||
<span>{props.addressTo.label}</span>
|
|
||||||
<small>Hoje</small>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</IonHeader>
|
|
||||||
<IonContent fullscreen>
|
<IonContent fullscreen>
|
||||||
|
<IonCard color="light">
|
||||||
|
<IonCardHeader>
|
||||||
|
<IonCardSubtitle>Origem: {props.addressFrom.label}</IonCardSubtitle>
|
||||||
|
</IonCardHeader>
|
||||||
|
</IonCard>
|
||||||
|
<IonCard color="light">
|
||||||
|
<IonCardHeader>
|
||||||
|
<IonCardSubtitle>Destino: {props.addressTo.label}</IonCardSubtitle>
|
||||||
|
</IonCardHeader>
|
||||||
|
</IonCard>
|
||||||
|
|
||||||
{itinerariesList && itinerariesList.length !== 0 ? (
|
{itinerariesList && itinerariesList.length !== 0 ? (
|
||||||
<>
|
<>
|
||||||
<IonItemDivider color="secondary">Resultados</IonItemDivider>
|
<IonItemDivider color="secondary">Resultados</IonItemDivider>
|
||||||
@@ -117,7 +120,7 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
>
|
>
|
||||||
<IonCardHeader>
|
<IonCardHeader>
|
||||||
<IonCardTitle>{itinerary.itinerary_nickname}</IonCardTitle>
|
<IonCardTitle>{itinerary.itinerary_nickname}</IonCardTitle>
|
||||||
<IonCardSubtitle>
|
<IonCardContent>
|
||||||
<p>
|
<p>
|
||||||
<IonIcon icon={personOutline} /> Vagas disponíveis:{" "}
|
<IonIcon icon={personOutline} /> Vagas disponíveis:{" "}
|
||||||
{itinerary.available_seats}
|
{itinerary.available_seats}
|
||||||
@@ -128,24 +131,41 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<IonIcon icon={cashOutline} /> Valor:{" "}
|
<IonIcon icon={cashOutline} /> Valor:{" "}
|
||||||
{itinerary.vehicle_plate}
|
{convertNumberToPrice(itinerary.price)}
|
||||||
</p>
|
</p>
|
||||||
</IonCardSubtitle>
|
</IonCardContent>
|
||||||
</IonCardHeader>
|
</IonCardHeader>
|
||||||
</IonCard>
|
</IonCard>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<h1 className="msg-not-found">
|
<>
|
||||||
Não foi encontrado nenhum itinerário que atenda essa rota.
|
<div className="msg-not-found">
|
||||||
</h1>
|
<IonCard>
|
||||||
|
<IonCardContent>
|
||||||
|
<span>
|
||||||
|
Não foi encontrado nenhum itinerário que atenda essa rota.
|
||||||
|
</span>
|
||||||
|
</IonCardContent>
|
||||||
|
</IonCard>
|
||||||
|
<IonCard>
|
||||||
|
<IonCardContent>
|
||||||
|
<span>
|
||||||
|
Deseja criar um alerta para ser notificado caso haja
|
||||||
|
itinerário para essa origem e destino?
|
||||||
|
</span>
|
||||||
|
<div className="button-criar-alerta">
|
||||||
|
<IonButton onClick={() => criaAlerta()}>
|
||||||
|
Criar Alerta
|
||||||
|
</IonButton>
|
||||||
|
</div>
|
||||||
|
</IonCardContent>
|
||||||
|
</IonCard>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="button-criar-alerta">
|
|
||||||
<IonButton onClick={() => criaAlerta()}>Criar Alerta</IonButton>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<IonFab
|
<IonFab
|
||||||
onClick={() => setShowModalFilters(true)}
|
onClick={() => setShowModalFilters(true)}
|
||||||
vertical="bottom"
|
vertical="bottom"
|
||||||
@@ -155,23 +175,28 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
<IonFabButton>Filtros</IonFabButton>
|
<IonFabButton>Filtros</IonFabButton>
|
||||||
</IonFab>
|
</IonFab>
|
||||||
<IonModal isOpen={showModalFilters}>
|
<IonModal isOpen={showModalFilters}>
|
||||||
<IonToolbar>
|
<IonHeader translucent>
|
||||||
<div className="header-filter-modal">
|
<IonToolbar>
|
||||||
<IonIcon
|
<IonTitle>Filtros</IonTitle>
|
||||||
size="large"
|
<IonButtons slot="start">
|
||||||
icon={closeOutline}
|
<IonIcon
|
||||||
onClick={() => setShowModalFilters(false)}
|
size="large"
|
||||||
/>
|
icon={closeOutline}
|
||||||
<h4>
|
onClick={() => setShowModalFilters(false)}
|
||||||
<b>Limpar</b>
|
/>
|
||||||
</h4>
|
</IonButtons>
|
||||||
</div>
|
</IonToolbar>
|
||||||
</IonToolbar>
|
</IonHeader>
|
||||||
|
|
||||||
<IonContent>
|
<IonContent>
|
||||||
<div className="content-filter-modal">
|
<IonList>
|
||||||
<h1>Filtrar</h1>
|
<IonListHeader>Ordenar por</IonListHeader>
|
||||||
<h3>Ordernar por</h3>
|
|
||||||
<IonRadioGroup>
|
<IonRadioGroup>
|
||||||
|
<IonItem>
|
||||||
|
<IonLabel>Sem filtro</IonLabel>
|
||||||
|
<IonRadio value="sem_filtro" />
|
||||||
|
</IonItem>
|
||||||
|
|
||||||
<IonItem>
|
<IonItem>
|
||||||
<IonLabel>Menor preço</IonLabel>
|
<IonLabel>Menor preço</IonLabel>
|
||||||
<IonRadio value="menor_preco" />
|
<IonRadio value="menor_preco" />
|
||||||
@@ -187,7 +212,12 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
<IonRadio value="lugares_disponiveis" />
|
<IonRadio value="lugares_disponiveis" />
|
||||||
</IonItem>
|
</IonItem>
|
||||||
</IonRadioGroup>
|
</IonRadioGroup>
|
||||||
<h3>Preferências</h3>
|
</IonList>
|
||||||
|
|
||||||
|
<IonItemDivider />
|
||||||
|
|
||||||
|
<IonList>
|
||||||
|
<IonListHeader>Preferências</IonListHeader>
|
||||||
<IonItem>
|
<IonItem>
|
||||||
<IonLabel>Vaga avulsa</IonLabel>
|
<IonLabel>Vaga avulsa</IonLabel>
|
||||||
<IonCheckbox value="vaga_avulsa" />
|
<IonCheckbox value="vaga_avulsa" />
|
||||||
@@ -196,8 +226,13 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
<IonLabel>Ar condicionado</IonLabel>
|
<IonLabel>Ar condicionado</IonLabel>
|
||||||
<IonCheckbox value="ar_condicionado" />
|
<IonCheckbox value="ar_condicionado" />
|
||||||
</IonItem>
|
</IonItem>
|
||||||
</div>
|
<IonItem>
|
||||||
|
<IonLabel>Assento preferencial</IonLabel>
|
||||||
|
<IonCheckbox value="assento_preferencial" />
|
||||||
|
</IonItem>
|
||||||
|
</IonList>
|
||||||
</IonContent>
|
</IonContent>
|
||||||
|
|
||||||
<IonFooter>
|
<IonFooter>
|
||||||
<IonButton
|
<IonButton
|
||||||
expand="block"
|
expand="block"
|
||||||
@@ -207,6 +242,7 @@ const ListaItinerarios: React.FC = () => {
|
|||||||
</IonButton>
|
</IonButton>
|
||||||
</IonFooter>
|
</IonFooter>
|
||||||
</IonModal>
|
</IonModal>
|
||||||
|
|
||||||
<IonToast
|
<IonToast
|
||||||
// cssClass={"toast-notification"}
|
// cssClass={"toast-notification"}
|
||||||
color={toastColor}
|
color={toastColor}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import instance from '../services/api/api';
|
import instance from '../services/api/api';
|
||||||
|
|
||||||
export async function autoCompleteAddress(address:string) {
|
export async function autoCompleteAddress(address: string) {
|
||||||
|
|
||||||
const response = await instance.get(`https://api.geoapify.com/v1/geocode/autocomplete?text=${address}&apiKey=ee574aacff6f440a84378bbbf7e2f20d`);
|
const response = await instance.get(`https://api.geoapify.com/v1/geocode/autocomplete?text=${address}&apiKey=ee574aacff6f440a84378bbbf7e2f20d`);
|
||||||
return response.data.features;
|
return response.data.features;
|
||||||
@@ -9,4 +9,14 @@ export async function autoCompleteAddress(address:string) {
|
|||||||
export async function closeToast(setShowToast: React.Dispatch<React.SetStateAction<boolean>>) {
|
export async function closeToast(setShowToast: React.Dispatch<React.SetStateAction<boolean>>) {
|
||||||
setShowToast(false)
|
setShowToast(false)
|
||||||
window.history.replaceState({}, document.title)
|
window.history.replaceState({}, document.title)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function convertNumberToPrice(price: number) {
|
||||||
|
// Create our number formatter.
|
||||||
|
var formatter = new Intl.NumberFormat('pt-BR', {
|
||||||
|
style: 'currency',
|
||||||
|
currency: 'BRL',
|
||||||
|
});
|
||||||
|
|
||||||
|
return formatter.format(price);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user