import * as Yup from "yup";
import colors from '../config/colors';
import moment from "moment";
import Screen from '../components/Screen';
import SearchablePicker from '../components/SearchablePicker';
import FormDatePicker from '../components/forms/FormDatePicker';
import defaultStyles from "../config/styles";
import constants from "../config/constants";
import ConfirmationModal from '../components/ConfirmationModal';
import React, { useContext, useEffect, useState } from 'react';
import { Modal, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { Form, FormField, SubmitButton } from '../components/forms';
import { UpdateUserInfo, login, userPersonalData } from '../api/auth';
import { dimensions } from '../config/dimensions';
import { MaterialCommunityIcons } from "@expo/vector-icons";
import { useFormikContext } from 'formik';
import { states, statesToCities } from "../assets/cities_states";
import PasswordFormField from "../components/forms/PasswordFormField";
import storage from "../auth/storage";
import { AuthContext } from "../auth/context";
import { getInstitutions } from "../api/fetchInstutions";
//#region PICKERS
function InstitutionNamePicker({ name }) {
const { values } = useFormikContext();
const state = values["state"];
const city = values["city"];
const instType = values["institution"];
const [items, setItems] = useState([]);
const [institutions, setInstitutions] = useState([]);
useEffect(() => {
getInstitutions().then((data) => {
setInstitutions(data);
})
.catch((error) => {
console.error(error);
});
}, []);
useEffect(() => {
try {
if (state && city && instType) {
const insts = institutions[state] && institutions[state][city] && institutions[state][city][instType];
insts ? setItems(insts) : setItems([]);
}
} catch (e) {
console.log(e);
}
}, [state,city, instType, institutions]);
return (
);
}
function RolePicker({ name }) {
const [items, setItems] = useState([
{ value: "ROLE_INSTITUTION", label: "Responsável" },
{ value: "ROLE_CLIENT", label: "Não responsável" },
]);
return (
);
}
function MaterialCommunityIconsCustom({
name,
color = colors.primary,
size = 25,
}) {
return (
);
}
function CityPicker({ name }) {
const [items, setItems] = useState([]);
const [isInitialRender, setIsInitialRender] = useState(true);
const { values, setValues } = useFormikContext();
const state = values["state"];
useEffect(() => {
if (isInitialRender) {
state && setItems(statesToCities[state].cities);
setIsInitialRender(false);
} else {
state && setItems(statesToCities[state].cities);
setValues({ ...values, city: "" });
}
}, [state]);
return (
);
}
function InstitutionPicker({ name }) {
const [items, setItems] = useState([
{ value: "SCHOOL", label: "Escola" },
{ value: "CIVIL_DEFENSE", label: "Defesa civil" },
{ value: "NGO", label: "Não governamental" },
{ value: "OTHER", label: "Outra" },
{ value: "X", label: "Nenhuma" }
]);
return (
);
}
function GenderPicker({ name }) {
const [items, setItems] = useState([
{ value: "F", label: "Feminino" },
{ value: "M", label: "Masculino" },
{ value: "N", label: "Prefiro não dizer" },
]);
return (
);
}
function StatePicker({ name }) {
const [items, setItems] = useState(states);
return (
);
}
function LocalDatePicker({ date, setDate, _moment }) {
const formatDate = () => date.format("DD/MM/YYYY");
return (
setDate(value)}
minimumDate={new Date(moment().subtract(110, "year"))}
date={date}
>
{date != _moment
? formatDate()
: "Selecione a data de nascimento"}
);
}
//#endregion
export default function UpdateUserInfoScreen({ route, navigation }) {
//#region STATES
const _moment = moment();
const [date, setDate] = useState(_moment);
const [scroll, setScroll] = useState();
const [showModal, setShowModal] = useState(false);
const [showpasswordModal, setShowPasswordModal] = useState(false);
const [formValue, setFormValue] = useState(null);
const [modalMessage, setModalMessage] = useState("");
const user = route.params.user;
const title = route.params.title;
const authContext = useContext(AuthContext);
//#endregion
useEffect(() => {
setDate(moment(user.dateofborn));
}, []);
const defaultValue = {
active: user.active,
city: user.city,
dateofborn: user.dateofborn,
gender: user.gender,
id: user.id,
institution: user.institution,
institutiontype: user.institutiontype,
nickname: user.nickname,
securityanswer: user.securityanswer,
securityquestion: user.securityquestion,
state: user.state,
termsofusage: user.termsofusage,
};
const validationSchema = Yup.object().shape({
name: Yup.string()
.required("O nome é obrigatório")
.matches(/[a-zA-Z]/, "O nome só pode conter letras"),
state: Yup.string().required("O estado é obrigatório"),
city: Yup.string().required("A cidade é obrigatória")
});
const passwordSchema = Yup.object().shape({
password: Yup.string()
.required("A senha é obrigatória")
.min(8, "Senha muito curta, minimo 8 caracteres")
.matches(/[a-zA-Z]/, "A senha só pode conter letras"),
});
const ItensList = ({ icon, IconProvider, title, onPress }) => {
return (
{title}
)
};
const ListComponent = ({ navigation }) => {
const profileItems = [
{
icon: "lock",
IconProvider: MaterialCommunityIcons,
title: "alterar senha",
onPress: () => {
navigation.navigate("PasswordRecovery", { user: user });
},
}
];
return (
{profileItems.map(
({ icon, IconProvider, title, onPress }) =>
)}
)
}
const PasswordModal = ({ children, show, onClose }) => {
return (
setShowModal(false)}
>
{children}
)
}
const handleUpdatUserInfo = async (password) => {
const username = user.username;
const parsedForm = {
securityquestion: defaultValue.securityquestion,
securityanswer: defaultValue.securityanswer,
id: defaultValue.id,
termsofusage: defaultValue.termsofusage,
city: formValue.city,
gender: formValue.gender,
institution: formValue.institutionName,
institutiontype: formValue.institution,
nickname: formValue.name,
active: defaultValue.active,
dateofborn: date.format("YYYY-MM-DD"),
state: formValue.state,
};
try {
const apiResponse = await login(username, password);
const authToken = apiResponse.data;
const result = await UpdateUserInfo(authToken, defaultValue, parsedForm);
if (result.status == 200) {
storage.setToken(authToken)
const getPersonalData = await userPersonalData()
authContext.clearPluviometerStation()
authContext.setUser(getPersonalData.data);
setShowModal(true);
setModalMessage("Informações atualizadas com sucesso");
} else {
setShowModal(true);
setModalMessage("Algum erro inesperado ocorreu");
}
} catch (error) {
console.error('Erro ao obter token de autenticação:', error);
setShowModal(true);
setModalMessage("Algum erro inesperado ocorreu");
}
};
return (
{
setShowModal(false),
navigation.goBack();
}}
/>
setShowPasswordModal(false)}>
);
}
const styles = StyleSheet.create({
container: {
justifyContent: "center",
textAlign: "center",
},
iconField: {
alignItems: "center",
width: "100%",
flex: 1,
flexDirection: "row",
marginTop: 12,
marginBottom: 24,
},
title: {
fontSize: 22,
fontWeight: "bold",
textAlign: "center",
color: colors.black,
marginVertical: 24
},
textSubtitle: {
textAlign: "center",
fontSize: dimensions.text.tertiary,
},
labelStyle: {
fontSize: dimensions.text.secondary,
fontWeight: "bold",
textAlign: "left",
color: colors.secondary,
},
warningText: {
color: colors.primary,
fontSize: dimensions.text.primary,
textAlign: "left",
marginBottom: 24,
},
});