only change password, docs and mail left

This commit is contained in:
Jose
2026-01-30 22:38:15 +01:00
parent f7070fd91a
commit c0bcbfb547
21 changed files with 473 additions and 341 deletions

View File

@@ -31,6 +31,7 @@ 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';
@@ -53,6 +54,7 @@ const getPFP = (tipo) => {
const Perfil = () => {
const { config, configLoading } = useConfig();
const { showError } = useError();
if (configLoading || !config) return <p className="text-center my-5"><LoadingIcon /></p>;
@@ -75,14 +77,14 @@ const Perfil = () => {
};
return (
<DataProvider config={reqConfig}>
<DataProvider config={reqConfig} onError={showError}>
<PerfilContent config={reqConfig} />
</DataProvider>
);
};
const PerfilContent = ({ config }) => {
const { data, dataLoading, dataError, postData } = useDataContext();
const { data, dataLoading, postData } = useDataContext();
const { logout } = useAuth();
const identity = JSON.parse(localStorage.getItem("identity"));
@@ -99,6 +101,7 @@ const PerfilContent = ({ config }) => {
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,
@@ -113,6 +116,7 @@ const PerfilContent = ({ config }) => {
};
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";
@@ -131,21 +135,16 @@ const PerfilContent = ({ config }) => {
onClick: closeFeedback
});
} catch (err) {
setFeedbackModal({
title: 'Error',
message: err.message,
variant: 'danger',
onClick: closeFeedback
});
if (err?.status === 422 && err?.errors) {
setFieldErrors(err.errors);
}
}
};
const [validationErrors, setValidationErrors] = useState({});
const [newPasswordData, setNewPasswordData] = useState({
currentPassword: "",
oldPassword: "",
newPassword: "",
confirmNewPassword: ""
serviceId: identity.account.serviceId
});
const [showOld, setShowOld] = useState(false);
@@ -157,28 +156,21 @@ const PerfilContent = ({ config }) => {
...newPasswordData,
[e.target.name]: e.target.value
});
setFieldErrors(null);
}
const handleChangePassword = async () => {
try {
const validOldPassword = await postData(config.loginValidateUrl, {
userId: identity.user.userId,
password: newPasswordData.currentPassword
});
if (!validOldPassword.valid) throw new Error("La contraseña actual es incorrecta.");
if (newPasswordData.newPassword !== newPasswordData.confirmNewPassword) throw new Error("Las contraseñas no coinciden.");
if (newPasswordData.newPassword.length < 8) throw new Error("La nueva contraseña debe tener al menos 8 caracteres.");
const response = await postData(config.changePasswordUrl, {
userId: identity.user.userId,
newPassword: newPasswordData.newPassword
await postData(config.changePasswordUrl, {
oldPassword: newPasswordData.oldPassword,
newPassword: newPasswordData.newPassword,
serviceId: identity.user.account.serviceId
});
if (!response) throw new Error("Error al cambiar la contraseña.");
setNewPasswordData({
currentPassword: "",
oldPassword: "",
newPassword: "",
confirmNewPassword: ""
serviceId: identity.user.account.serviceId
});
setFeedbackModal({
@@ -191,14 +183,13 @@ const PerfilContent = ({ config }) => {
}
});
} catch (err) {
setFeedbackModal({
title: 'Error',
message: err.message,
variant: 'danger',
onClick: closeFeedback
});
if (err?.status === 422 && err?.errors) {
setFieldErrors(err.errors);
}
}
}
};
const getFieldError = (field) => fieldErrors?.[field] ?? null;
const mappedRequests = myRequests.map(r => ({
...r,
@@ -208,7 +199,6 @@ const PerfilContent = ({ config }) => {
}));
if (dataLoading) return <p className="text-center my-5"><LoadingIcon /></p>;
if (dataError) return <p className="text-danger text-center my-5">{dataError}</p>;
return (
<CustomContainer>
@@ -243,6 +233,7 @@ const PerfilContent = ({ config }) => {
{!hasCollaborator && !hasCollaboratorRequest && (
<div className="dropdown-item d-flex align-items-center" onClick={() => {
setShowAddCollaboratorModal(true);
setFieldErrors(null);
closeDropdown();
}}>
<FontAwesomeIcon icon={faUserPlus} className="me-2" />Añadir un colaborador
@@ -334,7 +325,11 @@ const PerfilContent = ({ config }) => {
placeholder=""
name="currentPassword"
className="rounded-4"
isInvalid={!!fieldErrors?.oldPassword}
/>
<Form.Control.Feedback type="invalid">
{getFieldError("oldPassword")}
</Form.Control.Feedback>
<Button
variant="link"
className="show-button position-absolute end-0 top-50 translate-middle-y me-2"
@@ -356,7 +351,11 @@ const PerfilContent = ({ config }) => {
placeholder=""
name="newPassword"
className="rounded-4"
isInvalid={!!fieldErrors?.newPassword}
/>
<Form.Control.Feedback type="invalid" as="span">
{getFieldError("newPassword")}
</Form.Control.Feedback>
<Button
variant="link"
className="show-button position-absolute end-0 top-50 translate-middle-y me-2"
@@ -396,7 +395,6 @@ const PerfilContent = ({ config }) => {
newPasswordData.newPassword === '' || newPasswordData.confirmNewPassword === '' ||
newPasswordData.currentPassword === ''
}
onClick={(e) => { e.preventDefault(); handleChangePassword(); }}
type='submit'
variant="warning"
style={{ width: 'fit-content' }}
@@ -413,17 +411,16 @@ const PerfilContent = ({ config }) => {
show={showAddCollaboratorModal}
onClose={() => {
setShowAddCollaboratorModal(false);
setValidationErrors({});
setFieldErrors(null);
}}
>
<NewUserForm
userType={3}
plotNumber={identity.metadata.plotNumber}
errors={validationErrors}
fieldErrors={fieldErrors}
onSubmit={async (formData) => {
console.log("🚀 Enviando al backend...", formData); // Debug
try {
setValidationErrors({});
setFieldErrors(null);
await postData(config.requestUrl, {
type: CONSTANTS.REQUEST_TYPE_ADD_COLLABORATOR,
@@ -449,9 +446,10 @@ const PerfilContent = ({ config }) => {
onClick: closeFeedback
});
} catch (error) {
console.error("💥 Error al añadir:", error);
setValidationErrors({ general: error.message || "Ha ocurrido un error al procesar la solicitud." });
} catch (err) {
if (err?.status === 422 && err?.errors) {
setFieldErrors(err.errors);
}
}
}}
/>
@@ -483,13 +481,8 @@ const PerfilContent = ({ config }) => {
onClick: closeFeedback
});
setShowRemoveCollaboratorModal(false);
} catch (err) {
setFeedbackModal({
title: "Error",
message: err.message,
variant: "danger",
onClick: closeFeedback
});
} catch (error) {
console.error(error);
}
}}
>