feat: agregar eliminacion y Walmart Connect multipais
This commit is contained in:
+70
-6
@@ -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,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user