diff --git a/src/context/AuthContext.jsx b/src/context/AuthContext.jsx
index 18b369b..c01156b 100644
--- a/src/context/AuthContext.jsx
+++ b/src/context/AuthContext.jsx
@@ -8,8 +8,12 @@ export const AuthProvider = ({ children }) => {
const axios = createAxiosInstance();
const { config } = useConfig();
- const [user, setUser] = useState(() => JSON.parse(localStorage.getItem("user")) || null);
const [token, setToken] = useState(() => localStorage.getItem("token"));
+ const [identity, setIdentity] = useState(() => {
+ const stored = localStorage.getItem("identity");
+ return stored ? JSON.parse(stored) : null;
+ });
+
const [authStatus, setAuthStatus] = useState("checking");
const [error, setError] = useState(null);
@@ -21,7 +25,7 @@ export const AuthProvider = ({ children }) => {
return;
}
- const BASE_URL = config.apiConfig.baseUrl;
+ const BASE_URL = config.apiConfig.coreUrl;
const VALIDATE_URL = `${BASE_URL}${config.apiConfig.endpoints.auth.validateToken}`;
const checkAuth = async () => {
@@ -29,6 +33,7 @@ export const AuthProvider = ({ children }) => {
const res = await axios.get(VALIDATE_URL, {
headers: { Authorization: `Bearer ${token}` },
});
+
if (res.status === 200) {
setAuthStatus("authenticated");
} else {
@@ -45,53 +50,70 @@ export const AuthProvider = ({ children }) => {
const login = async (formData) => {
setError(null);
+
const BASE_URL = config.apiConfig.baseUrl;
const LOGIN_URL = `${BASE_URL}${config.apiConfig.endpoints.auth.login}`;
-
+
try {
const res = await axios.post(LOGIN_URL, formData);
- const { token, member, tokenTime } = res.data.data;
-
+
+ const { token, user, account, metadata } = res.data;
+
+ const identity = {
+ user,
+ account,
+ metadata,
+ };
+
localStorage.setItem("token", token);
- localStorage.setItem("user", JSON.stringify(member));
- localStorage.setItem("tokenTime", tokenTime);
-
+ localStorage.setItem("identity", JSON.stringify(identity));
+
setToken(token);
- setUser(member);
+ setIdentity(identity);
setAuthStatus("authenticated");
} catch (err) {
console.error("Error al iniciar sesión:", err);
-
+
let message = "Ha ocurrido un error inesperado.";
-
+
if (err.response) {
const { status, data } = err.response;
-
+
if (status === 400) {
message = "Usuario o contraseña incorrectos.";
} else if (status === 403) {
- message = "Tu cuenta está inactiva o ha sido suspendida.";
+ message = "Tu cuenta está inactiva o suspendida.";
} else if (status === 404) {
message = "Usuario no encontrado.";
} else if (data?.message) {
message = data.message;
}
}
-
+
setError(message);
throw new Error(message);
}
};
const logout = () => {
- localStorage.clear();
- setUser(null);
+ localStorage.removeItem("token");
+ localStorage.removeItem("identity");
+ setIdentity(null);
setToken(null);
setAuthStatus("unauthenticated");
};
return (
-
+
{children}
);
diff --git a/src/hooks/useData.js b/src/hooks/useData.js
index a1c5dd5..3ed4b36 100644
--- a/src/hooks/useData.js
+++ b/src/hooks/useData.js
@@ -30,9 +30,9 @@ export const useData = (config) => {
headers: getAuthHeaders(),
params: current.params,
});
- setData(response.data.data);
+ setData(response.data);
} catch (err) {
- setError(err.response?.data?.message || err.message);
+ setError(err.response?.data);
} finally {
setLoading(false);
}
@@ -45,18 +45,11 @@ export const useData = (config) => {
}, [config, fetchData]);
const getData = async (url, params = {}) => {
- try {
- const response = await axios.get(url, {
- headers: getAuthHeaders(),
- params,
- });
- return { data: response.data.data, error: null };
- } catch (err) {
- return {
- data: null,
- error: err.response?.data?.message || err.message,
- };
- }
+ const response = await axios.get(url, {
+ headers: getAuthHeaders(),
+ params,
+ });
+ return response.data;
};
const postData = async (endpoint, payload) => {
@@ -66,37 +59,33 @@ export const useData = (config) => {
};
const response = await axios.post(endpoint, payload, { headers });
await fetchData();
- return response.data.data;
+ return response.data;
};
const postDataValidated = async (endpoint, payload) => {
try {
- const headers = {
- Authorization: `Bearer ${localStorage.getItem("token")}`,
- ...(payload instanceof FormData ? {} : { "Content-Type": "application/json" }),
- };
- const response = await axios.post(endpoint, payload, { headers });
- return { data: response.data.data, errors: null };
+ const response = await axios.post(endpoint, payload, {
+ headers: {
+ Authorization: `Bearer ${localStorage.getItem("token")}`,
+ "Content-Type": "application/json",
+ },
+ });
+
+ return { ok: true };
} catch (err) {
- const raw = err.response?.data?.message;
- let parsed = {};
-
- try {
- parsed = JSON.parse(raw);
- } catch {
- return { data: null, errors: { general: raw || err.message } };
- }
-
- return { data: null, errors: parsed };
+ return {
+ ok: false,
+ errors: err.response?.data?.errors || {}
+ };
}
- };
+ };
const putData = async (endpoint, payload) => {
const response = await axios.put(endpoint, payload, {
headers: getAuthHeaders(),
});
await fetchData();
- return response.data.data;
+ return response.data;
};
const deleteData = async (endpoint) => {
@@ -104,7 +93,7 @@ export const useData = (config) => {
headers: getAuthHeaders(),
});
await fetchData();
- return response.data.data;
+ return response.data;
};
const deleteDataWithBody = async (endpoint, payload) => {
@@ -113,7 +102,7 @@ export const useData = (config) => {
data: payload,
});
await fetchData();
- return response.data.data;
+ return response.data;
};
return {
diff --git a/src/hooks/useRequestCount.js b/src/hooks/useRequestCount.js
index 887f0ad..6f302ca 100644
--- a/src/hooks/useRequestCount.js
+++ b/src/hooks/useRequestCount.js
@@ -12,7 +12,7 @@ const useRequestCount = () => {
const fetchCount = async () => {
try {
const res = await axios.get(
- config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.countPending,
+ config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.count,
{
headers: {
Authorization: `Bearer ${localStorage.getItem('token')}`,
@@ -20,7 +20,7 @@ const useRequestCount = () => {
},
}
);
- setCount(res.data.data.count);
+ setCount(res.data.count);
} catch (err) {
console.error('❌ Error al obtener el número de solicitudes:', err.message);
}
diff --git a/src/pages/Anuncios.jsx b/src/pages/Anuncios.jsx
index 41a4a90..9ff9ea5 100644
--- a/src/pages/Anuncios.jsx
+++ b/src/pages/Anuncios.jsx
@@ -25,9 +25,9 @@ const Anuncios = () => {
if (configLoading) return
;
const reqConfig = {
- baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.announces.all}`,
+ baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.announcements.all}`,
params: {
- _sort: 'created_at',
+ _sort: 'createdAt',
_order: 'desc',
},
};
@@ -61,7 +61,7 @@ const AnunciosContent = ({ reqConfig }) => {
(filters.baja && anuncio.priority === 0) ||
(filters.media && anuncio.priority === 1) ||
(filters.alta && anuncio.priority === 2);
- const createdAt = new Date(anuncio.created_at);
+ const createdAt = new Date(anuncio.createdAt);
const now = new Date();
const matchesFecha =
(filters.ultimos7 && (now - createdAt) / (1000 * 60 * 60 * 24) <= 7) ||
@@ -74,7 +74,7 @@ const AnunciosContent = ({ reqConfig }) => {
const normalized = term.toLowerCase();
return (
anuncio.body?.toLowerCase().includes(normalized) ||
- anuncio.published_by_name?.toLowerCase().includes(normalized)
+ anuncio.publishedByName?.toLowerCase().includes(normalized)
);
},
initialFilters: {
@@ -90,10 +90,10 @@ const AnunciosContent = ({ reqConfig }) => {
const handleCreate = () => {
setCreatingAnuncio(true);
setTempAnuncio({
- announce_id: null,
body: 'Nuevo anuncio',
priority: 1,
- published_by_name: 'Admin',
+ publishedBy: JSON.parse(localStorage.getItem("identity"))?.user?.displayName,
+ createdAt: Date.now()
});
document.querySelector('.cards-grid')?.scrollTo({ top: 0, behavior: 'smooth' });
};
@@ -162,12 +162,12 @@ const AnunciosContent = ({ reqConfig }) => {
/>
)}
- renderCard={(anuncio) => (
+ renderCard={(anuncio, idx) => (
handleEditSubmit(a, id)}
- onDelete={() => handleDelete(anuncio.announce_id)}
+ onDelete={() => handleDelete(anuncio.announceId)}
error={error}
onClearError={() => setError(null)}
/>
diff --git a/src/pages/Documentacion.jsx b/src/pages/Documentacion.jsx
index 31d53bb..23870d8 100644
--- a/src/pages/Documentacion.jsx
+++ b/src/pages/Documentacion.jsx
@@ -19,9 +19,8 @@ const Documentacion = () => {
const reqConfig = {
baseUrl: config.apiConfig.coreUrl + config.apiConfig.endpoints.files.all,
- uploadUrl: config.apiConfig.coreUrl + config.apiConfig.endpoints.files.upload,
params: {
- _sort: 'uploaded_at',
+ _sort: 'uploadedAt',
_order: 'desc'
}
};
@@ -40,22 +39,22 @@ const DocumentacionContent = ({ reqConfig }) => {
const handleSelectFiles = async (files) => {
const file = files[0];
- if (!file || !reqConfig?.uploadUrl) return;
+ if (!file || !reqConfig?.baseUrl) return;
- const file_name = file.name;
- const mime_type = file.type || "application/octet-stream";
- const uploaded_by = JSON.parse(localStorage.getItem("user"))?.user_id;
+ const fileName = file.name;
+ const mimeType = file.type || "application/octet-stream";
+ const uploadedBy = JSON.parse(localStorage.getItem("identity"))?.user?.userId;
const context = 1;
const formData = new FormData();
formData.append("file", file);
- formData.append("file_name", file_name);
- formData.append("mime_type", mime_type);
- formData.append("uploaded_by", uploaded_by);
+ formData.append("fileName", fileName);
+ formData.append("mimeType", mimeType);
+ formData.append("uploadedBy", uploadedBy);
formData.append("context", context);
try {
- await postData(reqConfig.uploadUrl, formData);
+ await postData(reqConfig.baseUrl, formData);
fileUploadRef.current?.resetSelectedFiles();
} catch (err) {
console.error("Error al subir archivo:", err);
@@ -100,8 +99,8 @@ const DocumentacionContent = ({ reqConfig }) => {
variant="danger"
onClick={async () => {
try {
- await deleteDataWithBody(`${reqConfig.baseUrl}/${deleteTarget.file_id}`, {
- file_path: deleteTarget.file_path
+ await deleteDataWithBody(`${reqConfig.baseUrl}/${deleteTarget.fileId}`, {
+ filePath: deleteTarget.filePath
});
setDeleteTarget(null);
} catch (err) {
diff --git a/src/pages/Gastos.jsx b/src/pages/Gastos.jsx
index fe7f8a5..e13244c 100644
--- a/src/pages/Gastos.jsx
+++ b/src/pages/Gastos.jsx
@@ -30,7 +30,7 @@ const Gastos = () => {
const reqConfig = {
baseUrl: `${config.apiConfig.baseUrl}${config.apiConfig.endpoints.expenses.all}`,
params: {
- _sort: 'created_at',
+ _sort: 'createdAt',
_order: 'desc',
},
};
@@ -84,7 +84,7 @@ const GastosContent = ({ reqConfig }) => {
const handleCreate = () => {
setCreatingGasto(true);
setTempGasto({
- expense_id: null,
+ expenseId: null,
concept: '',
amount: 0.0,
supplier: '',
@@ -160,7 +160,7 @@ const GastosContent = ({ reqConfig }) => {
)}
renderCard={(gasto) => (
{
rawUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.incomes.all,
membersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.members.all,
params: {
- _sort: 'created_at',
+ _sort: 'createdAt',
_order: 'desc'
}
};
@@ -98,16 +98,16 @@ const IngresosContent = ({ reqConfig }) => {
searchFn: (ingreso, term) => {
const normalized = term.toLowerCase();
return ingreso.concept?.toLowerCase().includes(normalized) ||
- String(ingreso.member_number).includes(normalized) ||
- ingreso.display_name?.toLowerCase().includes(normalized);
+ String(ingreso.memberNumber).includes(normalized) ||
+ ingreso.displayName?.toLowerCase().includes(normalized);
}
});
const handleCreate = () => {
setCreatingIngreso(true);
setTempIngreso({
- income_id: null,
- member_number: 0,
+ incomeId: null,
+ memberNumber: 0,
concept: '',
amount: 0.0,
frequency: CONSTANTS.PAYMENT_FREQUENCY_YEARLY,
@@ -183,10 +183,10 @@ const IngresosContent = ({ reqConfig }) => {
)}
renderCard={(income) => (
handleEditSubmit(data, id)}
- onDelete={() => handleDelete(income.income_id)}
+ onDelete={() => handleDelete(income.incomeId)}
error={error}
onClearError={() => setError(null)}
/>
diff --git a/src/pages/ListaEspera.jsx b/src/pages/ListaEspera.jsx
index 8a85ee4..db7475b 100644
--- a/src/pages/ListaEspera.jsx
+++ b/src/pages/ListaEspera.jsx
@@ -23,10 +23,10 @@ const ListaEspera = () => {
if (configLoading) return
;
const reqConfig = {
- baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.members.limitedWaitlist,
+ baseUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.users.waitlistLimited,
requestUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.requests.all,
- preUsersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.pre_users.all,
- preUserValidationUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.pre_users.validation,
+ preUsersUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.preUsers.all,
+ preUserValidationUrl: config.apiConfig.baseUrl + config.apiConfig.endpoints.preUsers.validate,
params: {}
};
@@ -39,7 +39,7 @@ const ListaEspera = () => {
const ListaEsperaContent = ({ reqConfig }) => {
const { authStatus } = useAuth();
- const { data, dataLoading, dataError, postDataValidated, postData } = useDataContext();
+ const { data, dataLoading, dataError, postData, postDataValidated } = useDataContext();
const [showWelcomeModal, setShowWelcomeModal] = useState(false);
const [showPreUserFormModal, setShowPreUserFormModal] = useState(false);
@@ -64,27 +64,30 @@ const ListaEsperaContent = ({ reqConfig }) => {
const handleRegisterSubmit = async (formData) => {
setValidationErrors({});
- const { _, errors } = await postDataValidated(reqConfig.preUserValidationUrl, formData);
+ const validation = await postDataValidated(
+ reqConfig.preUserValidationUrl,
+ formData
+ );
- if (errors) {
- setValidationErrors(errors);
+ if (!validation.ok) {
+ setValidationErrors(validation.errors);
return;
}
try {
const request = await postData(reqConfig.requestUrl, { type: 0, status: 0 });
- const requestId = request?.request_id;
+ const requestId = request?.requestId;
if (!requestId) throw new Error("No se pudo registrar la solicitud.");
await postData(reqConfig.preUsersUrl, {
...formData,
- request_id: requestId
+ requestId
});
setShowPreUserFormModal(false);
setShowConfirmationModal(true);
} catch (err) {
- setValidationErrors({ general: err.message });
+ setValidationErrors({ general: "Error inesperado al enviar la solicitud" });
}
};
@@ -94,13 +97,6 @@ const ListaEsperaContent = ({ reqConfig }) => {
setShowPreUserFormModal(true);
};
- const mapped = [...(data ?? [])]
- .sort((a, b) => new Date(a.created_at) - new Date(b.created_at))
- .map((item) => ({
- ...item,
- created_at: DateParser.timestampToString(item.created_at)
- }));
-
if (dataLoading) return
;
if (dataError) return {dataError}
;
@@ -117,7 +113,7 @@ const ListaEsperaContent = ({ reqConfig }) => {