Skip to main content

Overview

The system uses a comprehensive notification system with toast messages and contextual alerts to provide real-time feedback to users.

Toast Notifications

Success Messages

Notify users of successful operations:
const createMutation = useMutation({
  mutationFn: alumnosApi.crear,
  onSuccess: (data) => {
    queryClient.invalidateQueries({ queryKey: ["alumnos"] });
    closeEdit();
    const successMsg = data.__successMessage || "Alumno creado correctamente";
    toast.success(successMsg);
  },
});
From ~/workspace/source/src/pages/Alumnos.tsx:254-262

Error Messages

Display error feedback:
onError: (error: Error) =>
  toast.error(error.message || "Error al crear el alumno")
From ~/workspace/source/src/pages/Alumnos.tsx:263

Login Notifications

Welcome message on successful login:
try {
  await login({ username: username.trim(), password });
  toast({
    title: "¡Bienvenido!",
    description: `Sesión iniciada como ${username}`,
  });
  navigate(from, { replace: true });
} catch (error) {
  const errorMessage =
    error instanceof Error ? error.message : "Credenciales inválidas";
  setError(errorMessage);
  toast({
    title: "Error de autenticación",
    description: errorMessage,
    variant: "destructive",
  });
}
From ~/workspace/source/src/pages/Login.tsx:50-66

Alert Components

Destructive Alerts

Display critical errors inline:
{error && (
  <div className="px-6">
    <Alert variant="destructive" className="mb-4">
      <AlertDescription>{error}</AlertDescription>
    </Alert>
  </div>
)}
From ~/workspace/source/src/pages/Login.tsx:82-88

Idle Session Notifications

Session Timeout Warning

Notify users when logged out due to inactivity:
const handleLogout = useCallback(() => {
  const isLogged = getStoredCredentials();
  if (isLogged) {
    clearCredentials();
    navigate("/login");
    toast.info("Sesión cerrada por inactividad");
  }
}, [navigate]);
From ~/workspace/source/src/components/auth/IdleHandler.tsx:11-18

Registration Notifications

Email Whitelist Validation

const isAllowed = await checkEmailWhitelist(email.trim());
if (!isAllowed) {
  setError("Este correo no está autorizado para registrarse");
  toast({
    title: "Email no autorizado",
    description: "Este correo no está en la lista de usuarios autorizados",
    variant: "destructive",
  });
  return;
}
From ~/workspace/source/src/pages/Register.tsx:85-94

Successful Registration

try {
  await register({
    username: username.trim(),
    email: email.trim(),
    password,
    rol: "ADMIN",
    activo: true,
    fechaCreacion: new Date().toISOString(),
  });
  toast({
    title: "Registro exitoso",
    description: "Tu cuenta ha sido creada. Ahora puedes iniciar sesión.",
  });
  navigate("/login");
} catch (error) {
  toast({
    title: "Error al registrar",
    description:
      error instanceof Error ? error.message : "No se pudo crear la cuenta",
    variant: "destructive",
  });
}
From ~/workspace/source/src/pages/Register.tsx:113-134

Field Validation Messages

Missing Required Fields

if (!username.trim() || !password.trim()) {
  toast({
    title: "Error",
    description: "Por favor completa todos los campos",
    variant: "destructive",
  });
  return;
}
From ~/workspace/source/src/pages/Login.tsx:37-44

CRUD Operation Notifications

Update Success

const updateMutation = useMutation({
  mutationFn: ({ id, data }: { id: number; data: Partial<Alumno> }) =>
    alumnosApi.actualizar(id, data),
  onSuccess: (data) => {
    queryClient.invalidateQueries({ queryKey: ["alumnos"] });
    closeEdit();
    const successMsg =
      data.__successMessage || "Alumno actualizado correctamente";
    toast.success(successMsg);
  },
  onError: (error: Error) =>
    toast.error(error.message || "Error al actualizar el alumno"),
});
From ~/workspace/source/src/pages/Alumnos.tsx:266-278

Delete Success

const deleteMutation = useMutation({
  mutationFn: alumnosApi.eliminar,
  onSuccess: (data) => {
    queryClient.invalidateQueries({ queryKey: ["alumnos"] });
    closeDelete();
    const successMsg =
      data.__successMessage || "Alumno eliminado correctamente";
    toast.success(successMsg);
  },
  onError: (error: Error) =>
    toast.error(error.message || "Error al eliminar el alumno"),
});
From ~/workspace/source/src/pages/Alumnos.tsx:280-291

System Notifications (from README)

Toast System

**Toast System**:
- Successful action confirmations (green)
- Errors and validations (red)
- Warnings (yellow)
- Information (blue)

**Contextual Messages**:
- Explanatory tooltips on complex fields
- Real-time validation alerts
- Confirmations before destructive actions
From ~/workspace/source/README.md:485-495

Notification Variants

Available Variants

  1. Success - Green, for successful operations
  2. Error/Destructive - Red, for errors and failures
  3. Info - Blue, for informational messages
  4. Warning - Yellow, for warnings and cautions

Loading States

Operation in Progress

{isSubmitting ? (
  <span className="flex items-center gap-2">
    <span className="animate-spin rounded-full h-4 w-4 border-b-2 border-primary-foreground"></span>
    Iniciando sesión...
  </span>
) : (
  <span className="flex items-center gap-2">
    <LogIn className="h-4 w-4" />
    Iniciar Sesión
  </span>
)}
From ~/workspace/source/src/pages/Login.tsx:148-158

Email Validation Loading

{isCheckingEmail ? (
  <span className="flex items-center gap-2">
    <span className="animate-spin rounded-full h-4 w-4 border-b-2 border-primary-foreground"></span>
    Validando email...
  </span>
) : isSubmitting ? (
  <span className="flex items-center gap-2">
    <span className="animate-spin rounded-full h-4 w-4 border-b-2 border-primary-foreground"></span>
    Registrando...
  </span>
) : (
  <span className="flex items-center gap-2">
    <UserPlus className="h-4 w-4" />
    Crear Cuenta
  </span>
)}
From ~/workspace/source/src/pages/Register.tsx:253-268

Best Practices

  1. Consistent Messaging - Use consistent tone and format across all notifications
  2. Clear Actions - Tell users what happened and what to do next
  3. Appropriate Duration - Auto-dismiss success messages, keep errors visible
  4. Visual Hierarchy - Use colors and icons to convey message importance
  5. Avoid Notification Spam - Don’t overwhelm users with too many messages
  6. Contextual Placement - Show inline alerts near relevant form fields
  7. Loading Feedback - Always indicate when operations are in progress
  8. Error Details - Provide specific error messages when possible

Build docs developers (and LLMs) love