import { useConfig } from '../hooks/useConfig'; import { useDataContext } from '../hooks/useDataContext'; import { DataProvider } from '../context/DataContext'; import CustomContainer from '../components/CustomContainer'; import ContentWrapper from '../components/ContentWrapper'; import LoadingIcon from '../components/LoadingIcon'; import { Card, ListGroup, Form, FloatingLabel } from 'react-bootstrap'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faUser, faIdCard, faEnvelope, faPhone, faHashtag, faSeedling, faUserShield, faCalendar, faUserSlash, faUserPlus, faArrowRightFromBracket, faCog, faEyeSlash, faEye, faKey } from '@fortawesome/free-solid-svg-icons'; import '../css/Perfil.css'; import { useState } from 'react'; import IngresoCard from '../components/Ingresos/IngresoCard'; import SolicitudCard from '../components/Solicitudes/SolicitudCard'; import CustomModal from '../components/CustomModal'; import NewUserForm from '../components/Solicitudes/NewUserForm'; import NotificationModal from '../components/NotificationModal'; import { Button, Col, Row } from 'react-bootstrap'; import AnimatedDropdown from '../components/AnimatedDropdown'; import { useAuth } from '../hooks/useAuth'; import { CONSTANTS } from '../util/constants'; import { useError } from '../context/ErrorContext'; const parseDate = (date) => { if (!date) return 'NO'; const d = new Date(date); return `${d.getDate().toString().padStart(2, '0')}/${(d.getMonth() + 1).toString().padStart(2, '0')}/${d.getFullYear()}`; }; const getPFP = (tipo) => { const base = '/images/icons/'; const map = { 1: 'farmer.svg', 2: 'green_house.svg', 0: 'list.svg', 3: 'join.svg', 4: 'subvencion4.svg', 5: 'programmer.svg' }; return base + (map[tipo] || 'farmer.svg'); }; const Perfil = () => { const { config, configLoading } = useConfig(); const { showError } = useError(); if (configLoading || !config) return

; const buildUrl = (base, endpoint, params = {}) => { if (!endpoint) return null; let url = base + endpoint; for (const [key, value] of Object.entries(params)) { url = url.replace(`:${key}`, value); } return url; }; const reqConfig = { baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.me}`, requestUrl: buildUrl(config.apiConfig.baseUrl, config.apiConfig.endpoints.requests.all), changePasswordUrl: buildUrl(config.apiConfig.coreUrl, config.apiConfig.endpoints.auth.changePassword), }; return ( ); }; const PerfilContent = ({ config }) => { const { data, dataLoading, postData } = useDataContext(); const { logout } = useAuth(); const identity = JSON.parse(localStorage.getItem("identity")); const myRequests = data?.requests ?? []; const incomes = data?.payments ?? []; const hasCollaborator = data?.hasCollaborator ?? false; const hasCollaboratorRequest = data?.hasCollaboratorRequest ?? false; const hasGreenHouse = data?.hasGreenhouse ?? false; const hasGreenHouseRequest = data?.hasGreenhouseRequest ?? false; const [showAddCollaboratorModal, setShowAddCollaboratorModal] = useState(false); const [showRemoveCollaboratorModal, setShowRemoveCollaboratorModal] = useState(false); const [feedbackModal, setFeedbackModal] = useState(null); const closeFeedback = () => setFeedbackModal(null); const [fieldErrors, setFieldErrors] = useState(null); const baseMetadata = { displayName: identity.user.displayName, username: identity.account.username, dni: identity.metadata.dni, phone: identity.metadata.phone, email: identity.account.email, memberNumber: identity.metadata.memberNumber, plotNumber: identity.metadata.plotNumber, type: identity.metadata.type, role: identity.metadata.role }; const sendSimpleRequest = async (type) => { setFieldErrors(null); const requestOf = type == 1 ? "baja" : type == 2 ? "adición de colaborador" : type == 3 ? "eliminación de colaborador" : type == 4 ? "adición de invernadero" : type == 5 ? "eliminación de invernadero" : "desconocido"; try { await postData(config.requestUrl, { type, status: CONSTANTS.REQUEST_PENDING, userId: identity.user.userId, name: identity.user.displayName, metadata: baseMetadata }); setFeedbackModal({ title: 'Solicitud enviada', message: `Se ha enviado la solicitud de ${requestOf} correctamente.`, variant: 'success', onClick: closeFeedback }); } catch (err) { if (err?.status === 422 && err?.errors) { setFieldErrors(err.errors); } } }; const [newPasswordData, setNewPasswordData] = useState({ oldPassword: "", newPassword: "", confirmNewPassword: "", serviceId: identity.account.serviceId }); const [showOld, setShowOld] = useState(false); const [showNew, setShowNew] = useState(false); const [showConfirm, setShowConfirm] = useState(false); const handleChange = (e) => { setNewPasswordData({ ...newPasswordData, [e.target.name]: e.target.value }); setFieldErrors(null); } const handleChangePassword = async () => { try { await postData(config.changePasswordUrl, { oldPassword: newPasswordData.oldPassword, newPassword: newPasswordData.newPassword, serviceId: identity.account.serviceId }); setNewPasswordData({ oldPassword: "", newPassword: "", confirmNewPassword: "", serviceId: identity.account.serviceId }); setFeedbackModal({ title: 'Contraseña cambiada', message: 'Tu contraseña ha sido cambiada correctamente.', variant: 'success', onClick: () => { closeFeedback(); logout(); } }); } catch (err) { if (err?.status === 422 && err?.errors) { setFieldErrors(err.errors); } } }; const getFieldError = (field) => fieldErrors?.[field] ?? null; const mappedRequests = myRequests.map(r => ({ ...r, type: r.type ?? r.type, status: r.status ?? r.status, request_createdAt: r.request_createdAt ?? r.createdAt })); if (dataLoading) return

; return (
PFP
{`@${identity.account.username}`} Te uniste el {parseDate(identity.metadata.createdAt)}
} > {({ closeDropdown }) => ( <> {!hasGreenHouse && !hasGreenHouseRequest && (
{ sendSimpleRequest(CONSTANTS.REQUEST_TYPE_ADD_GREENHOUSE); closeDropdown(); }}> Solicitar invernadero
)} {!hasCollaborator && !hasCollaboratorRequest && (
{ setShowAddCollaboratorModal(true); setFieldErrors(null); closeDropdown(); }}> Añadir un colaborador
)}
{hasGreenHouse && !hasGreenHouseRequest && (
{ sendSimpleRequest(CONSTANTS.REQUEST_TYPE_REMOVE_GREENHOUSE); closeDropdown(); }}> Dejar invernadero
)} {hasCollaborator && !hasCollaboratorRequest && (
{ setShowRemoveCollaboratorModal(true); closeDropdown(); }}> Quitar colaborador
)}
{ sendSimpleRequest(CONSTANTS.REQUEST_TYPE_UNREGISTER); closeDropdown(); }}> Darse de baja
)}
Nombre: {identity.user.displayName} DNI: {identity.metadata.dni} Email: {identity.account.email} Teléfono: {identity.metadata.phone} Socio Nº: {identity.metadata.memberNumber} | Huerto Nº: {identity.metadata.plotNumber} Tipo de socio: {['LISTA DE ESPERA', 'HORTELANO', 'HORTELANO + INVERNADERO', 'COLABORADOR', 'SUBVENCION', 'DESARROLLADOR'][identity.metadata.type]} Rol en huertos: {['USUARIO', 'ADMIN', 'DESARROLLADOR'][identity.metadata.role]} Estado: {identity.account.status === 1 ? 'ACTIVO' : 'INACTIVO'}

Mis pagos


{incomes.length === 0 &&

No hay pagos registrados.

}
{incomes.map(income => ( ))}

Mis solicitudes


{myRequests.length === 0 &&

No tienes solicitudes registradas.

}
{mappedRequests.map(request => ( ))}

Cambio de contraseña


{ e.preventDefault(); handleChangePassword(); }} className="d-flex flex-column gap-3">
{/* Contraseña actual */} Contraseña actual}> {getFieldError("oldPassword")} {/* Nueva contraseña */} Nueva contraseña}> {getFieldError("newPassword")} {/* Confirmar nueva contraseña */} Confirmar nueva contraseña}>
{ setShowAddCollaboratorModal(false); setFieldErrors(null); }} > { try { setFieldErrors(null); await postData(config.requestUrl, { type: CONSTANTS.REQUEST_TYPE_ADD_COLLABORATOR, status: CONSTANTS.REQUEST_PENDING, userId: identity.user.userId, name: identity.user.displayName, metadata: { displayName: formData.displayName, username: formData.username, dni: formData.dni, phone: formData.phone, email: formData.email, memberNumber: formData.memberNumber, plotNumber: formData.plotNumber, type: formData.type } }); setShowAddCollaboratorModal(false); setFeedbackModal({ title: 'Solicitud enviada', message: 'El colaborador ha sido solicitado correctamente.', variant: 'success', onClick: closeFeedback }); } catch (err) { if (err?.status === 422 && err?.errors) { setFieldErrors(err.errors); } } }} /> setShowRemoveCollaboratorModal(false)} >

¿Estás seguro de que quieres eliminar tu colaborador actual?

{feedbackModal && ( )}
); }; export default Perfil;