only change password, docs and mail left
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}}
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user