Diversas alterações

This commit is contained in:
Matheus Albino Brunhara
2022-09-13 21:59:02 -03:00
parent 46768cb941
commit fd96166d56
5 changed files with 9134 additions and 9540 deletions

View File

@@ -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>

View File

@@ -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%;
} }

View File

@@ -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}

View File

@@ -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);
} }

18500
yarn.lock

File diff suppressed because it is too large Load Diff