fix: Actualizar con branding de GLM y restringir acceso con Supabase.
This commit is contained in:
+36
-26
@@ -9,19 +9,7 @@ import React, {
|
||||
} from "react";
|
||||
import type { User as SupabaseUser } from "@supabase/supabase-js";
|
||||
import { supabase } from "@/lib/supabase";
|
||||
|
||||
const ALLOWED_DOMAIN = "gomezleemarketing.com";
|
||||
const GERARDO_EMAIL = "gmarrero@gomezleemarketing.com";
|
||||
const JOSE_LEOPOLDO_EMAIL = "jgomez@gomezleemarketing.com";
|
||||
const ISAAC_EMAIL = "iaracena@gomezleemarketing.com";
|
||||
const INTERNAL_PRICING_ALLOWED_EMAILS = [GERARDO_EMAIL, ISAAC_EMAIL];
|
||||
const PRICING_SUMMARY_CONTROLLER_EMAILS = [GERARDO_EMAIL, JOSE_LEOPOLDO_EMAIL, ISAAC_EMAIL];
|
||||
const DELETE_ALLOWED_EMAILS = [GERARDO_EMAIL, "iaracena@gomezleemarketing.com"];
|
||||
|
||||
function isAllowedEmail(email: string | null | undefined): boolean {
|
||||
if (!email) return false;
|
||||
return email.toLowerCase().endsWith(`@${ALLOWED_DOMAIN}`);
|
||||
}
|
||||
import { getActiveTableroCdcAccess, type TableroCdcUserAccess } from "@/lib/accessControl";
|
||||
|
||||
function getRedirectTo(): string {
|
||||
if (typeof window === "undefined") return "/tablero-cdc/";
|
||||
@@ -75,23 +63,44 @@ const AuthContext = createContext<AuthContextValue | null>(null);
|
||||
|
||||
export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
const [user, setUser] = useState<AuthUser | null>(null);
|
||||
const [access, setAccess] = useState<TableroCdcUserAccess | null>(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
const applyUser = useCallback(async (supabaseUser: SupabaseUser | null) => {
|
||||
if (!supabaseUser) {
|
||||
setUser(null);
|
||||
setAccess(null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isAllowedEmail(supabaseUser.email)) {
|
||||
let nextAccess: TableroCdcUserAccess | null = null;
|
||||
|
||||
try {
|
||||
nextAccess = await getActiveTableroCdcAccess(supabaseUser.email);
|
||||
} catch (accessError) {
|
||||
console.error("Error al validar acceso al Tablero CDC:", accessError);
|
||||
await supabase.auth.signOut();
|
||||
setUser(null);
|
||||
setError("Solo se permite acceso con correos corporativos de GomezLee Marketing.");
|
||||
setAccess(null);
|
||||
setError(
|
||||
"No se pudo validar tu acceso al Tablero CDC. Verifica que el SQL de accesos esté ejecutado o contacta a IT.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!nextAccess) {
|
||||
await supabase.auth.signOut();
|
||||
setUser(null);
|
||||
setAccess(null);
|
||||
setError(
|
||||
"Tu correo no está autorizado para acceder al Tablero CDC. Solicita acceso a IT o al equipo CDC.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
setUser(normalizeSupabaseUser(supabaseUser));
|
||||
setAccess(nextAccess);
|
||||
setError(null);
|
||||
}, []);
|
||||
|
||||
@@ -123,8 +132,10 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
});
|
||||
|
||||
const { data: listener } = supabase.auth.onAuthStateChange((_event, session) => {
|
||||
void applyUser(session?.user ?? null);
|
||||
setLoading(false);
|
||||
setLoading(true);
|
||||
void applyUser(session?.user ?? null).finally(() => {
|
||||
if (mounted) setLoading(false);
|
||||
});
|
||||
});
|
||||
|
||||
return () => {
|
||||
@@ -142,7 +153,6 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
redirectTo: getRedirectTo(),
|
||||
queryParams: {
|
||||
prompt: "select_account",
|
||||
hd: ALLOWED_DOMAIN,
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -163,22 +173,22 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
||||
}
|
||||
|
||||
setUser(null);
|
||||
setAccess(null);
|
||||
setError(null);
|
||||
}, []);
|
||||
|
||||
const normalizedEmail = user?.email?.toLowerCase() || "";
|
||||
const isGerardo = useMemo(() => normalizedEmail === GERARDO_EMAIL, [normalizedEmail]);
|
||||
const isGerardo = useMemo(() => access?.role === "director_creativo", [access?.role]);
|
||||
const canManageInternalPricing = useMemo(
|
||||
() => INTERNAL_PRICING_ALLOWED_EMAILS.includes(normalizedEmail),
|
||||
[normalizedEmail],
|
||||
() => access?.canManageInternalPricing === true,
|
||||
[access?.canManageInternalPricing],
|
||||
);
|
||||
const canDeleteProjects = useMemo(
|
||||
() => DELETE_ALLOWED_EMAILS.includes(normalizedEmail),
|
||||
[normalizedEmail],
|
||||
() => access?.canDeleteProjects === true,
|
||||
[access?.canDeleteProjects],
|
||||
);
|
||||
const canControlPricingSummary = useMemo(
|
||||
() => PRICING_SUMMARY_CONTROLLER_EMAILS.includes(normalizedEmail),
|
||||
[normalizedEmail],
|
||||
() => access?.canControlPricingSummary === true,
|
||||
[access?.canControlPricingSummary],
|
||||
);
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user