Files
tcc-vamos-frontend/src/pages/Perfil.tsx
Matheus Albino Brunhara c0b26741bb Componentizando header
2022-09-03 16:38:13 -03:00

395 lines
11 KiB
TypeScript

import {
IonBackButton,
IonBadge,
IonButtons,
IonCard,
IonCardContent,
IonCardHeader,
IonCardTitle,
IonChip,
IonContent,
IonHeader,
IonIcon,
IonItem,
IonLabel,
IonList,
IonListHeader,
IonPage,
IonTitle,
IonToast,
IonToolbar,
} from "@ionic/react";
import { useHistory, useLocation } from "react-router-dom";
import React, { useState, useEffect, useReducer, useContext } from "react";
import {
callOutline,
cardOutline,
carOutline,
createOutline,
exitOutline,
mapOutline,
personOutline,
shieldCheckmarkOutline,
starOutline,
} from "ionicons/icons";
import "./Perfil.css";
import LocalStorage from "../LocalStorage";
import sessionsService from "../services/functions/sessionsService";
import usersService from "../services/functions/usersService";
import { UserContext } from "../App";
import { Color } from "@ionic/core";
import { closeToast } from "../services/utils";
import { PageHeader } from "../components/PageHeader";
interface ScanNewProps {
match: {
params: {
id: string;
};
};
}
interface LocationState {
redirectData?: {
showToastMessage: boolean;
toastColor: Color;
toastMessage: string;
};
}
const Perfil: React.FC<ScanNewProps> = (props) => {
const user = useContext(UserContext);
const history = useHistory();
const location = useLocation<LocationState>();
const [isVisitor, setIsVisitor] = useState(true);
const [isDriver, setIsDriver] = useState(false);
const [incompleteProfile, setIncompleteProfile] = useState(false);
const [incompleteProfileCounter, setIncompleteProfileCounter] = useState(0);
const [showToast, setShowToast] = useState(false);
const [toastMessage, setToastMessage] = useState("");
const [toastColor, setToastColor] = useState<Color>("primary");
const [inputValues, setInputValues] = useReducer(
(state: any, newState: any) => ({ ...state, ...newState }),
{
id: "",
name: "",
lastname: "",
email: "",
phone_number: "",
birth_date: "",
bio: "",
document_type: "",
document: "",
}
);
const redirectUserToLogin = () => {
history.push({ pathname: "/login" });
setToastMessage("Por favor, autentique-se!");
setShowToast(true);
};
const logoff = () => {
LocalStorage.clearToken();
user.setIsLoggedIn(false);
history.push({ pathname: "/login" });
};
useEffect(() => {
if (location.state && location.state.redirectData) {
const redirectData = location.state.redirectData;
if (redirectData.showToastMessage) {
setToastColor(redirectData.toastColor);
setToastMessage(redirectData.toastMessage);
setShowToast(true);
}
}
const loadUserData = async () => {
let userId = "";
// verify if user is authenticated
if (props.match.params.id) {
userId = props.match.params.id;
} else {
const refreshSessionRes = await sessionsService.refreshSession();
if (refreshSessionRes.error) {
redirectUserToLogin();
return;
}
if (refreshSessionRes.userId) {
userId = refreshSessionRes.userId;
}
}
// get user info by ID
const getByIdRes = await usersService.getById(userId);
if (getByIdRes.error) {
if (isVisitor && props.match.params.id) {
setToastMessage("Usuário não existe!");
setShowToast(true);
history.push({ pathname: "/home" });
} else {
setToastMessage(getByIdRes.error.errorMessage);
setShowToast(true);
}
return;
}
// check if user is driver (if they have vans)
const userIsDriverRes = await usersService.checkIfUserIsDriver(userId);
// if (userIsDriverRes.error) {
// setToastColor('warning')
// setToastMessage(userIsDriverRes.error.errorMessage)
// setShowToast(true)
// return
// }
if (!userIsDriverRes.error && userIsDriverRes.result !== undefined) {
setIsDriver(userIsDriverRes.result);
}
if (getByIdRes.userData) {
const userData = getByIdRes.userData;
if (isMounted) {
setInputValues({
id: userId,
name: userData.name,
lastname: userData.lastname,
email: userData.email,
phone_number: userData.phone_number,
birth_date: userData.birth_date,
bio: userData.bio,
document_type: userData.document_type,
document: userData.document,
});
if (!props.match.params.id) {
setIsVisitor(false);
}
if (!userData.document || !userData.phone_number) {
setIncompleteProfile(true);
let counter = 0;
if (!userData.document) counter++;
if (!userData.phone_number) counter++;
setIncompleteProfileCounter(counter);
}
}
}
};
let isMounted = true;
const userToken = LocalStorage.getToken();
if (!userToken) {
redirectUserToLogin();
}
loadUserData();
return () => {
isMounted = false;
};
}, []);
return (
<IonPage>
<PageHeader pageName="Meu perfil"></PageHeader>
<IonContent fullscreen>
<IonCard>
<IonCardContent>
<img
src="https://static.generated.photos/vue-static/home/feed/adult.png"
alt="avatar"
className="avatar"
id="avatar"
/>
{/* <img src="https://lastfm.freetls.fastly.net/i/u/avatar170s/faa68f71f3b2a48ca89228c2c2aa72d3" alt="avatar" className='avatar' id='avatar'/> */}
<IonCardHeader>
<IonCardTitle class="ion-text-center">
{inputValues.name} {inputValues.lastname}
</IonCardTitle>
</IonCardHeader>
<div id="profile-status">
{isDriver ? (
<>
<IonChip>
<IonIcon icon={carOutline}></IonIcon>
<IonLabel color="primary">Motorista</IonLabel>
</IonChip>
</>
) : (
<></>
)}
<IonChip>
<IonIcon icon={personOutline}></IonIcon>
<IonLabel color="primary">Passageiro</IonLabel>
</IonChip>
</div>
</IonCardContent>
</IonCard>
<IonCard>
<IonCardHeader>
<IonCardTitle>Biografia</IonCardTitle>
</IonCardHeader>
<IonCardContent>
{inputValues.bio ? inputValues.bio : "Sem biografia."}
</IonCardContent>
</IonCard>
<IonCard>
<IonCardHeader>
<IonCardTitle>Informações de contato</IonCardTitle>
</IonCardHeader>
<IonCardContent>
{!inputValues.phone_number ? (
<>Sem informações de contato.</>
) : (
<>
{inputValues.phone_number ? (
<>
<IonChip>
<IonIcon icon={callOutline} />
<IonLabel>{inputValues.phone_number}</IonLabel>
</IonChip>
</>
) : (
<></>
)}
</>
)}
</IonCardContent>
</IonCard>
{!isVisitor ? (
<IonList>
<IonListHeader>Configurações</IonListHeader>
<IonItem
button
onClick={() =>
history.push({
pathname: "/perfil/editar",
state: { userData: inputValues },
})
}
>
<IonIcon icon={createOutline} slot="start" />
<IonLabel>Editar perfil</IonLabel>
</IonItem>
{incompleteProfile ? (
<>
<IonItem
button
onClick={() =>
history.push({
pathname: "/perfil/completar",
state: { userData: inputValues },
})
}
>
<IonIcon icon={shieldCheckmarkOutline} slot="start" />
<IonLabel>Completar cadastro</IonLabel>
<IonBadge color="primary">
{incompleteProfileCounter}
</IonBadge>
</IonItem>
</>
) : (
<></>
)}
<IonItem
button
onClick={() => history.push({ pathname: "/cadastro-van" })}
>
<IonIcon icon={carOutline} slot="start" />
<IonLabel>Cadastrar van</IonLabel>
</IonItem>
{isDriver ? (
<>
<IonItem
button
onClick={() => history.push({ pathname: "/minhas-vans" })}
>
<IonIcon icon={carOutline} slot="start" />
<IonLabel>Minhas vans</IonLabel>
</IonItem>
<IonItem
button
onClick={() =>
history.push({ pathname: "/buscar-passageiro" })
}
>
<IonIcon icon={personOutline} slot="start" />
<IonLabel>Buscar passageiros</IonLabel>
</IonItem>
<IonItem
button
onClick={() =>
history.push({ pathname: "/meus-itinerarios" })
}
>
<IonIcon icon={mapOutline} slot="start" />
<IonLabel>Meus itinerários</IonLabel>
</IonItem>
</>
) : (
<></>
)}
<IonItem>
<IonIcon icon={cardOutline} slot="start" />
<IonLabel>Pagamentos</IonLabel>
</IonItem>
<IonItem>
<IonIcon icon={starOutline} slot="start" />
<IonLabel>Avaliações</IonLabel>
</IonItem>
<IonItem button onClick={logoff}>
<IonIcon icon={exitOutline} slot="start" />
<IonLabel>Sair da conta</IonLabel>
</IonItem>
</IonList>
) : (
<></>
)}
<IonToast
position="top"
color={toastColor}
isOpen={showToast}
onDidDismiss={() => closeToast(setShowToast)}
message={toastMessage}
duration={2500}
/>
</IonContent>
</IonPage>
);
};
export default Perfil;