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)}>
{ handleUpdatUserInfo(password); setShowPasswordModal(false); }}> Senha*
{ setFormValue(form); setShowPasswordModal(true) }} > { setScroll(ref); }} style={{ paddingHorizontal: 20 }} > {title} {/*--------------------------------------- NAME ---------------------------------------*/} Apelido de usuário* {/*--------------------------------------- DATEOFBORN ---------------------------------------*/} Data de nascimento: {/*--------------------------------------- GENDER ---------------------------------------*/} Gênero: {/*--------------------------------------- STATE ---------------------------------------*/} Estado*: {/*--------------------------------------- CITY ---------------------------------------*/} Cidade*: {/*--------------------------------------- INSTITUTION ---------------------------------------*/} Tipo de instituição: {/* --------------------------------------- INSTITUTIONNAME ---------------------------------------*/} Nome da instituição O nome da instituição é fornecido pelo Cemaden Educação {/* --------------------------------------- ROLE ---------------------------------------*/} Vínculo institucional:
); } 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, }, });