feat: agregar eliminacion y Walmart Connect multipais

This commit is contained in:
2026-06-05 15:59:54 -04:00
parent c546f59009
commit 8c3d18814d
10 changed files with 720 additions and 404 deletions
+70 -6
View File
@@ -57,6 +57,7 @@ type DbProject = {
const DEFAULT_COLOR: ColorId = "blue";
const OPEN_STATUS = "Activo";
const GERARDO_EMAIL = "gmarrero@gomezleemarketing.com";
const DELETE_ALLOWED_EMAILS = [GERARDO_EMAIL, "areyes@gomezleemarketing.com"];
let listeners: Array<() => void> = [];
let cache: Project[] = [];
@@ -146,6 +147,11 @@ async function currentUserIsGerardo(): Promise<boolean> {
return user.email?.toLowerCase() === GERARDO_EMAIL;
}
async function currentUserCanDeleteProjects(): Promise<boolean> {
const user = await getCurrentUser();
return DELETE_ALLOWED_EMAILS.includes(user.email?.toLowerCase() || "");
}
function toProjectRow(project: Omit<Project, "id" | "createdAt"> | Partial<Project>) {
return {
title: project.nombre,
@@ -207,7 +213,7 @@ function getSyncWebhookUrl() {
async function syncProjectToSheet(
projectId: string,
action: "create" | "update",
action: "create" | "update" | "delete",
): Promise<Omit<SaveProjectResult, "projectId">> {
const webhookUrl = getSyncWebhookUrl();
@@ -215,7 +221,10 @@ async function syncProjectToSheet(
console.info("No se configuró VITE_WEBHOOK_URL; se omite sincronización con Google Sheet.");
return {
sheetSyncStatus: "skipped",
sheetSyncMessage: "Proyecto guardado. No hay webhook configurado para sincronizar el Sheet.",
sheetSyncMessage:
action === "delete"
? "No hay webhook configurado para eliminar el proyecto del Google Sheet."
: "Proyecto guardado. No hay webhook configurado para sincronizar el Sheet.",
};
}
@@ -249,13 +258,19 @@ async function syncProjectToSheet(
return {
sheetSyncStatus: "failed",
sheetSyncMessage: `Proyecto guardado, pero el Sheet no se pudo sincronizar: ${message}`,
sheetSyncMessage:
action === "delete"
? `No se pudo eliminar el proyecto del Google Sheet: ${message}`
: `Proyecto guardado, pero el Sheet no se pudo sincronizar: ${message}`,
};
}
return {
sheetSyncStatus: "synced",
sheetSyncMessage: "Proyecto guardado y sincronizado con el Google Sheet.",
sheetSyncMessage:
action === "delete"
? "Proyecto eliminado del Google Sheet."
: "Proyecto guardado y sincronizado con el Google Sheet.",
};
} catch (error) {
const isTimeout = error instanceof DOMException && error.name === "AbortError";
@@ -265,8 +280,12 @@ async function syncProjectToSheet(
return {
sheetSyncStatus: isTimeout ? "timeout" : "failed",
sheetSyncMessage: isTimeout
? "Proyecto guardado, pero n8n tardó demasiado en responder. Revisa el workflow si el Sheet no se actualizó."
: "Proyecto guardado, pero no se pudo sincronizar con Google Sheet.",
? action === "delete"
? "n8n tardó demasiado en responder. No se eliminó el proyecto para evitar inconsistencias."
: "Proyecto guardado, pero n8n tardó demasiado en responder. Revisa el workflow si el Sheet no se actualizó."
: action === "delete"
? "No se pudo eliminar el proyecto del Google Sheet. No se eliminó el proyecto para evitar inconsistencias."
: "Proyecto guardado, pero no se pudo sincronizar con Google Sheet.",
};
} finally {
window.clearTimeout(timeout);
@@ -465,6 +484,50 @@ async function updateProject(id: string, patch: Partial<Project>) {
}
async function deleteProject(id: string) {
setError(null);
const canDelete = await currentUserCanDeleteProjects();
if (!canDelete) {
const message = "No tienes permiso para eliminar proyectos.";
setError(message);
throw new Error(message);
}
const sheetSync = await syncProjectToSheet(id, "delete");
if (sheetSync.sheetSyncStatus !== "synced") {
const message = sheetSync.sheetSyncMessage || "No se pudo eliminar el proyecto del Google Sheet.";
setError(message);
throw new Error(message);
}
const { error: linksError } = await supabase
.from("tablero_cdc_project_links")
.delete()
.eq("project_id", id);
if (linksError) {
setError(linksError.message);
throw linksError;
}
const { error: projectError } = await supabase
.from("tablero_cdc_projects")
.delete()
.eq("id", id);
if (projectError) {
setError(projectError.message);
throw projectError;
}
setCache(cache.filter((project) => project.id !== id));
await loadProjects();
}
export function useProjects() {
const [, force] = useState(0);
@@ -496,6 +559,7 @@ export function useProjects() {
refresh: loadProjects,
add: addProject,
update: updateProject,
remove: deleteProject,
};
}