import { Card, ListGroup, Button } from 'react-bootstrap'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faUser, faIdCard, faEnvelope, faPhone, faHome, faMapMarkerAlt, faHashtag, faSeedling, faUserShield, faCalendar, faTrash, faEllipsisVertical } from '@fortawesome/free-solid-svg-icons'; import PropTypes from 'prop-types'; import { motion as _motion } from 'framer-motion'; import AnimatedDropdown from '../../components/AnimatedDropdown'; import '../../css/SolicitudCard.css'; const MotionCard = _motion.create(Card); 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 getTipoSolicitud = (tipo) => ['Alta', 'Baja', 'Añadir Colaborador', 'Quitar Colaborador', 'Añadir parcela invernadero', 'Dejar parcela invernadero'][tipo] ?? 'Desconocido'; const getEstadoSolicitud = (estado) => ['Pendiente', 'Aceptada', 'Rechazada'][estado] ?? 'Desconocido'; const getPFP = (tipo) => { const base = '/images/icons/'; const map = { 0: 'list.svg', 1: 'farmer.svg', 2: 'green_house.svg', 3: 'join.svg' }; return base + (map[tipo] || 'farmer.svg'); }; const renderDescripcionSolicitud = (data, onProfile) => { const m = data.metadata; switch (data.type) { case 0: return data.status === 1 ? 'Se ha aceptado esta solicitud de alta.' : `${m?.displayName ?? 'Alguien'} quiere darse de alta.`; case 1: return onProfile ? 'Has solicitado darte de baja.' : `${m?.displayName ?? 'Alguien'} quiere darse de baja.`; case 2: if (onProfile) { return [ 'Has solicitado añadir un colaborador.', 'Tu solicitud de colaborador ha sido aceptada.', 'Tu solicitud de colaborador ha sido rechazada.' ][data.status] ?? 'Solicitud de colaborador.'; } return data.status === 0 ? `${m?.displayName ?? 'Alguien'} quiere añadir un colaborador.` : `La solicitud de colaborador ha sido ${ data.status === 1 ? 'aceptada' : 'rechazada' }.`; case 3: return `${m?.displayName ?? 'Alguien'} quiere quitar su colaborador.`; case 4: return `${m?.displayName ?? 'Alguien'} quiere una parcela en el invernadero.`; case 5: return `${m?.displayName ?? 'Alguien'} quiere dejar su parcela del invernadero.`; default: return 'Tipo de solicitud desconocido.'; } }; const SolicitudCard = ({ data, onAccept, onReject, onDelete, editable = true, onProfile = false }) => { const m = data.metadata; const handleDelete = () => typeof onDelete === 'function' && onDelete(data.requestId); return (
PFP
Solicitud #{data.requestId?.slice(0, 8)} – {getTipoSolicitud(data.type)} Estado: {getEstadoSolicitud(data.status)}
{!onProfile && ( } > {({ closeDropdown }) => (
{ handleDelete(); closeDropdown(); }} > Eliminar
)}
)}
Fecha de solicitud: {parseDate(data.createdAt)} {renderDescripcionSolicitud(data, onProfile)} {m && ( <> Datos asociados a la solicitud Nombre: {m.displayName} DNI: {m.dni} Teléfono: {m.phone ?? 'NO'} Email: {m.email} Usuario: {m.username} Dirección: {m.address ?? 'NO'} Ciudad:{' '} {m.city ?? 'NO'} ({m.zipCode ?? 'NO'}) Nº socio: {m.memberNumber ?? 'NO'} | Nº huerto:{' '} {m.plotNumber ?? 'NO'} Tipo: {['Lista de espera', 'Hortelano', 'Hortelano + Invernadero', 'Colaborador'][m.type]} )} {editable && data.status === 0 && (
)}
); }; SolicitudCard.propTypes = { data: PropTypes.object.isRequired, onAccept: PropTypes.func, onReject: PropTypes.func, onDelete: PropTypes.func, editable: PropTypes.bool, onProfile: PropTypes.bool }; export default SolicitudCard;