Done: requests

This commit is contained in:
Jose
2026-01-30 16:50:56 +01:00
parent 665ac85701
commit f7070fd91a
12 changed files with 75 additions and 95 deletions

View File

@@ -3,8 +3,6 @@ import { Form, Row, Col, Button } from 'react-bootstrap';
import { useDataContext } from '../../hooks/useDataContext'; import { useDataContext } from '../../hooks/useDataContext';
import { Alert } from 'react-bootstrap'; import { Alert } from 'react-bootstrap';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { generateSecurePassword } from '../../util/passwordGenerator';
const NewUserForm = ({ onSubmit, userType, plotNumber, errors = {} }) => { const NewUserForm = ({ onSubmit, userType, plotNumber, errors = {} }) => {
const { getData } = useDataContext(); const { getData } = useDataContext();
@@ -12,7 +10,6 @@ const NewUserForm = ({ onSubmit, userType, plotNumber, errors = {} }) => {
const [form, setForm] = useState({ const [form, setForm] = useState({
username: '', username: '',
password: generateSecurePassword(8),
displayName: '', displayName: '',
dni: '', dni: '',
phone: '', phone: '',
@@ -22,9 +19,7 @@ const NewUserForm = ({ onSubmit, userType, plotNumber, errors = {} }) => {
city: '', city: '',
memberNumber: '', memberNumber: '',
plotNumber: plotNumber, plotNumber: plotNumber,
type: userType, type: userType
status: 1,
role: 0
}); });
useEffect(() => { useEffect(() => {

View File

@@ -49,7 +49,7 @@ const renderDescripcionSolicitud = (data, onProfile) => {
case 1: case 1:
return onProfile return onProfile
? 'Has solicitado darte de baja.' ? 'Has solicitado darte de baja.'
: `${m?.displayName ?? 'Alguien'} quiere darse de baja.`; : `${data.name ?? 'Alguien'} quiere darse de baja.`;
case 2: case 2:
if (onProfile) { if (onProfile) {
@@ -60,19 +60,19 @@ const renderDescripcionSolicitud = (data, onProfile) => {
][data.status] ?? 'Solicitud de colaborador.'; ][data.status] ?? 'Solicitud de colaborador.';
} }
return data.status === 0 return data.status === 0
? `${m?.displayName ?? 'Alguien'} quiere añadir un colaborador.` ? `${data.name ?? 'Alguien'} quiere añadir un colaborador.`
: `La solicitud de colaborador ha sido ${ : `La solicitud de colaborador ha sido ${
data.status === 1 ? 'aceptada' : 'rechazada' data.status === 1 ? 'aceptada' : 'rechazada'
}.`; }.`;
case 3: case 3:
return `${m?.displayName ?? 'Alguien'} quiere quitar su colaborador.`; return `${data.name ?? 'Alguien'} quiere quitar su colaborador.`;
case 4: case 4:
return `${m?.displayName ?? 'Alguien'} quiere una parcela en el invernadero.`; return `${data.name ?? 'Alguien'} quiere una parcela en el invernadero.`;
case 5: case 5:
return `${m?.displayName ?? 'Alguien'} quiere dejar su parcela del invernadero.`; return `${data.name ?? 'Alguien'} quiere dejar su parcela del invernadero.`;
default: default:
return 'Tipo de solicitud desconocido.'; return 'Tipo de solicitud desconocido.';
@@ -201,7 +201,7 @@ const SolicitudCard = ({
<ListGroup.Item> <ListGroup.Item>
<FontAwesomeIcon icon={faSeedling} className="me-2" /> <FontAwesomeIcon icon={faSeedling} className="me-2" />
Tipo: <strong>{['Lista de espera', 'Hortelano', 'Hortelano + Invernadero', 'Colaborador'][m.type]}</strong> Tipo: <strong>{['Lista de espera', 'Hortelano', 'Hortelano + Invernadero', 'Colaborador', 'Subvenciones', 'Desarrollador'][m.type]}</strong>
</ListGroup.Item> </ListGroup.Item>
</ListGroup> </ListGroup>
</> </>

View File

@@ -62,24 +62,6 @@ export const useData = (config) => {
return response.data; return response.data;
}; };
const postDataValidated = async (endpoint, payload) => {
try {
const response = await axios.post(endpoint, payload, {
headers: {
Authorization: `Bearer ${localStorage.getItem("token")}`,
"Content-Type": "application/json",
},
});
return { ok: true };
} catch (err) {
return {
ok: false,
errors: err.response?.data?.errors || {}
};
}
};
const putData = async (endpoint, payload) => { const putData = async (endpoint, payload) => {
const response = await axios.put(endpoint, payload, { const response = await axios.put(endpoint, payload, {
headers: getAuthHeaders(), headers: getAuthHeaders(),
@@ -111,7 +93,6 @@ export const useData = (config) => {
dataError, dataError,
getData, getData,
postData, postData,
postDataValidated,
putData, putData,
deleteData, deleteData,
deleteDataWithBody, deleteDataWithBody,

View File

@@ -26,10 +26,7 @@ const Anuncios = () => {
const reqConfig = { const reqConfig = {
baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.announcements.all}`, baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.announcements.all}`,
params: { params: {},
_sort: 'createdAt',
_order: 'desc',
},
}; };
return ( return (

View File

@@ -19,10 +19,7 @@ const Documentacion = () => {
const reqConfig = { const reqConfig = {
baseUrl: config.apiConfig.coreUrl + config.apiConfig.endpoints.files.all, baseUrl: config.apiConfig.coreUrl + config.apiConfig.endpoints.files.all,
params: { params: {}
_sort: 'uploadedAt',
_order: 'desc'
}
}; };
return ( return (

View File

@@ -29,10 +29,7 @@ const Gastos = () => {
const reqConfig = { const reqConfig = {
baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.expenses.all}`, baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.expenses.all}`,
params: { params: {},
_sort: 'createdAt',
_order: 'desc',
},
}; };
return ( return (

View File

@@ -32,10 +32,7 @@ const Ingresos = () => {
baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.withInfo, baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.withInfo,
rawUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.all, rawUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.all,
usersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.users.all, usersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.users.all,
params: { params: {}
_sort: 'createdAt',
_order: 'desc'
}
}; };
return ( return (

View File

@@ -37,7 +37,7 @@ const ListaEspera = () => {
const ListaEsperaContent = ({ reqConfig }) => { const ListaEsperaContent = ({ reqConfig }) => {
const { authStatus } = useAuth(); const { authStatus } = useAuth();
const { data, dataLoading, dataError, postData, postDataValidated } = useDataContext(); const { data, dataLoading, dataError, postData } = useDataContext();
const [showWelcomeModal, setShowWelcomeModal] = useState(false); const [showWelcomeModal, setShowWelcomeModal] = useState(false);
const [showNewUserFormModal, setShowNewUserFormModal] = useState(false); const [showNewUserFormModal, setShowNewUserFormModal] = useState(false);
@@ -62,29 +62,34 @@ const ListaEsperaContent = ({ reqConfig }) => {
const handleRegisterSubmit = async (formData) => { const handleRegisterSubmit = async (formData) => {
setValidationErrors({}); setValidationErrors({});
const validation = await postDataValidated(
reqConfig.preUserValidationUrl,
formData
);
if (!validation.ok) {
setValidationErrors(validation.errors);
return;
}
try { try {
const request = await postData(reqConfig.requestUrl, { type: 0, status: 0 }); const request = await postData(
reqConfig.requestUrl,
{
type: 0,
status: 0,
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,
address: formData.address,
zipCode: formData.zipCode,
city: formData.city
}
}
);
const requestId = request?.requestId; const requestId = request?.requestId;
if (!requestId) throw new Error("No se pudo registrar la solicitud."); if (!requestId) throw new Error("No se pudo registrar la solicitud.");
await postData(reqConfig.preUsersUrl, {
...formData,
requestId
});
setShowNewUserFormModal(false); setShowNewUserFormModal(false);
setShowConfirmationModal(true); setShowConfirmationModal(true);
} catch (err) { // eslint-disable-next-line no-unused-vars
} catch (_err) {
setValidationErrors({ general: "Error inesperado al enviar la solicitud" }); setValidationErrors({ general: "Error inesperado al enviar la solicitud" });
} }
}; };

View File

@@ -82,7 +82,7 @@ const Perfil = () => {
}; };
const PerfilContent = ({ config }) => { const PerfilContent = ({ config }) => {
const { data, dataLoading, dataError, postData, postDataValidated } = useDataContext(); const { data, dataLoading, dataError, postData } = useDataContext();
const { logout } = useAuth(); const { logout } = useAuth();
const identity = JSON.parse(localStorage.getItem("identity")); const identity = JSON.parse(localStorage.getItem("identity"));
@@ -102,6 +102,7 @@ const PerfilContent = ({ config }) => {
const baseMetadata = { const baseMetadata = {
displayName: identity.user.displayName, displayName: identity.user.displayName,
username: identity.account.username,
dni: identity.metadata.dni, dni: identity.metadata.dni,
phone: identity.metadata.phone, phone: identity.metadata.phone,
email: identity.account.email, email: identity.account.email,
@@ -120,6 +121,7 @@ const PerfilContent = ({ config }) => {
type, type,
status: CONSTANTS.REQUEST_PENDING, status: CONSTANTS.REQUEST_PENDING,
userId: identity.user.userId, userId: identity.user.userId,
name: identity.user.displayName,
metadata: baseMetadata metadata: baseMetadata
}); });
setFeedbackModal({ setFeedbackModal({
@@ -419,19 +421,23 @@ const PerfilContent = ({ config }) => {
plotNumber={identity.metadata.plotNumber} plotNumber={identity.metadata.plotNumber}
errors={validationErrors} errors={validationErrors}
onSubmit={async (formData) => { onSubmit={async (formData) => {
console.log("🚀 Enviando al backend...", formData); // Debug
try {
setValidationErrors({});
await postData(config.requestUrl, { await postData(config.requestUrl, {
type: CONSTANTS.REQUEST_TYPE_ADD_COLLABORATOR, type: CONSTANTS.REQUEST_TYPE_ADD_COLLABORATOR,
status: CONSTANTS.REQUEST_PENDING, status: CONSTANTS.REQUEST_PENDING,
userId: identity.user.userId, userId: identity.user.userId,
metadata: { metadata: {
displayName: formData.displayName, displayName: formData.displayName,
username: formData.username,
dni: formData.dni, dni: formData.dni,
phone: formData.phone, phone: formData.phone,
email: formData.email, email: formData.email,
memberNumber: formData.memberNumber, memberNumber: formData.memberNumber,
plotNumber: formData.plotNumber, plotNumber: formData.plotNumber,
type: formData.type, type: formData.type
role: formData.role
} }
}); });
@@ -442,6 +448,11 @@ const PerfilContent = ({ config }) => {
variant: 'success', variant: 'success',
onClick: closeFeedback onClick: closeFeedback
}); });
} catch (error) {
console.error("💥 Error al añadir:", error);
setValidationErrors({ general: error.message || "Ha ocurrido un error al procesar la solicitud." });
}
}} }}
/> />
</CustomModal> </CustomModal>

View File

@@ -31,10 +31,7 @@ const Socios = () => {
baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.all}`, baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.all}`,
incomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.incomesPreview}`, incomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.users.incomesPreview}`,
rawIncomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.incomes.all}`, rawIncomesUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.incomes.all}`,
params: { params: {}
_sort: "memberNumber",
_order: "asc"
}
}; };
return ( return (

View File

@@ -62,6 +62,7 @@ const SolicitudesContent = ({ reqConfig }) => {
const url = reqConfig.acceptUrl.replace(":requestId", entry.requestId); const url = reqConfig.acceptUrl.replace(":requestId", entry.requestId);
try { try {
await putData(url, {}); await putData(url, {});
setSearchTerm("");
} catch (err) { } catch (err) {
console.error("❌ Error al aceptar solicitud:", err.message); console.error("❌ Error al aceptar solicitud:", err.message);
} }
@@ -71,11 +72,13 @@ const SolicitudesContent = ({ reqConfig }) => {
const url = reqConfig.rejectUrl.replace(":requestId", entry.requestId); const url = reqConfig.rejectUrl.replace(":requestId", entry.requestId);
try { try {
await putData(url, {}); await putData(url, {});
setSearchTerm("");
} catch (err) { } catch (err) {
console.error("❌ Error al rechazar solicitud:", err.message); console.error("❌ Error al rechazar solicitud:", err.message);
} }
}; };
const handleDelete = async (id) => { const handleDelete = async (id) => {
setDeleteTargetId(id); setDeleteTargetId(id);
} }
@@ -106,7 +109,7 @@ const SolicitudesContent = ({ reqConfig }) => {
renderCard={(entry, idx) => ( renderCard={(entry, idx) => (
<SolicitudCard <SolicitudCard
key={entry.requestId} key={entry.requestId}
data={{...entry, idx}} data={{ ...entry, idx }}
onAccept={() => handleAccept(entry)} onAccept={() => handleAccept(entry)}
onReject={() => handleReject(entry)} onReject={() => handleReject(entry)}
onDelete={handleDelete} onDelete={handleDelete}

View File

@@ -6,7 +6,7 @@ import cleanPlugin from 'vite-plugin-clean';
export default defineConfig({ export default defineConfig({
plugins: [react(), cleanPlugin()], plugins: [react(), cleanPlugin()],
server: { server: {
host: "localhost", host: "0.0.0.0",
port: 3000, port: 3000,
}, },
build: { build: {