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 (
{`@${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
{
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;