Manual de desarrollador
Componentes
Componente HelpChat (Chat IA)
Introducción

Componente HelpChat

Descripción general

El componente HelpChat es un asistente virtual de inteligencia artificial integrado en el sistema ITG CMS. Proporciona soporte inmediato, información y orientación experta a los usuarios mediante una interfaz de chat conversacional.

Características principales

  • Chat IA en tiempo real con respuestas contextuales
  • Interfaz flotante integrada
  • Disponible globalmente en toda la aplicación
  • Soporte multi-idioma (Español/Inglés)
  • Autenticación integrada con tokens JWT
  • Estados de carga y manejo robusto de errores
  • Sugerencias rápidas predefinidas para mejorar UX
  • Scroll automático para nueva conversación
  • Diseño Material UI con temas personalizados

Nota sobre la implementación actual

Integración global: El componente se renderiza automáticamente en toda la aplicación a través de _layout.client.tsx, por lo que está disponible en todas las páginas sin necesidad de importarlo manualmente.

Guía visual

A continuación se muestra el funcionamiento del componente en sus principales estados: chat abierto, botón flotante (FAB), estado de carga y visualización de mensajes de error.

Demostración HelpChat

Arquitectura del componente

Patrón de arquitectura

El componente sigue un patrón de Arquitectura Modular con separación clara de responsabilidades:

HelpChat (Container)
├── HelpChatUI (Presentational)
├── useHelpChat (UI Logic Hook)
├── useHelpChatActions (Business Logic Hook)
└── Services (API Integration)

Flujo de datos

User Input → useHelpChat → useHelpChatActions → API Service → State Update → UI Render

Estructura de archivos

src/components/molecules/helpChat/
├── index.tsx                          # Componente principal (Container)
├── HelpChatUI.tsx                     # Componente de presentación
├── useHelpChat.tsx                    # Hook para lógica de UI
├── types.ts                           # Definiciones de tipos TypeScript
├── helpChat.module.scss               # Estilos CSS Modules
├── index.test.tsx                     # Tests del componente principal
├── HelpChatUI.test.tsx               # Tests del componente UI
├── useHelpChat.test.tsx              # Tests del hook UI
├── types.test.ts                     # Tests de tipos

src/modules/helpChat/
├── index.ts                          
├── hooks/
│   ├── useHelpChatActions.ts         # Hook para acciones del chat
│   └── useHelpChatActions.test.ts    # Tests del hook de acciones
└── services/
    ├── index.ts                      # Servicios de API
    └── index.test.ts                 # Tests de servicios

src/language/
└── help-chat.json                    # Traducciones del chat

Tipos e interfaces principales

ChatMessage

export type ChatMessage = {
  id: string // Identificador único del mensaje
  type: 'question' | 'answer' | 'guide' // Tipo de mensaje
  content: string // Contenido del mensaje
  section: ChatSection // Sección del chat
  keywords?: string[] // Palabras clave (opcional)
  relatedActions?: ChatAction[] // Acciones relacionadas (opcional)
  isError?: boolean // Indica si es un mensaje de error
}

ChatAction

export type ChatAction = {
  id: string // Identificador único
  label: string // Etiqueta mostrada al usuario
  type: 'navigate' | 'modal' | 'external' // Tipo de acción
  action: string // Acción a ejecutar
  icon?: string // Icono (opcional)
}

API Types

export interface ChatRequest {
  message: string // Mensaje del usuario
}
 
export interface ChatResponse {
  response?: string // Respuesta del AI
  message?: string // Mensaje alternativo
  [key: string]: unknown // Campos adicionales
}

Hooks personalizados

useHelpChat (UI Logic Hook)

Ubicación: src/components/molecules/helpChat/useHelpChat.tsx

Responsabilidades:

  • Gestión del estado de apertura/cierre del chat
  • Integración con contexto de idioma
  • Orquestación de hooks de negocio

Estado manejado:

const chatState = {
  isOpen: boolean,      // Estado de apertura del chat
  isLoading: boolean    // Estado de carga
}

Funciones expuestas:

{
  chatState,           // Estado del chat
  chatHistory,         // Historial de mensajes
  languageSelect,      // Idioma seleccionado
  translations,        // Traducciones
  isAuthenticated,     // Estado de autenticación
  toggleChat,          // Alternar apertura del chat
  closeChat,           // Cerrar chat
  sendMessage,         // Enviar mensaje
  clearHistory         // Limpiar historial
}

useHelpChatActions (Business Logic Hook)

Ubicación: src/modules/helpChat/hooks/useHelpChatActions.ts

Responsabilidades:

  • Gestión del historial de mensajes
  • Comunicación con API
  • Manejo de estados de carga y error
  • Autenticación y tokens

Tecnologías utilizadas:

  • React Query v5 para gestión de estado servidor
  • React OIDC Context para autenticación
  • Custom mutations para optimistic updates

Flujo de envío de mensaje:

1. onMutate: Agregar mensaje del usuario inmediatamente (Optimistic UI)
2. mutationFn: Enviar mensaje a API
3. onSuccess: Procesar respuesta y agregar mensaje del bot
4. onError: Mostrar mensaje de error

Servicios

ChatService

Ubicación: src/modules/helpChat/services/index.ts

Función principal:

export const sendChatMessage = async (
  data: ChatRequest
): Promise<ChatResponse> =>
  globalfunctions<ChatResponse, ChatRequest>(`/agent`, 'POST', data)

Características:

  • Integración con globalfunctions para manejo consistente de API
  • Utiliza constants.API_HOST + '/agent' como endpoint completo
  • Tipado fuerte con TypeScript
  • Manejo de errores automático
  • Soporte para autenticación JWT a través de cookies

Estados y flujo de datos

Estado global del chat

interface ChatState {
  // Estado UI
  isOpen: boolean // Chat abierto/cerrado
  isLoading: boolean // Procesando mensaje
 
  // Datos
  chatHistory: ChatMessage[] // Historial de conversación
 
  // Contexto
  languageSelect: string // Idioma actual
  isAuthenticated: boolean // Estado de autenticación
}

Flujo de datos detallado

  1. Inicialización:

    User clicks FABtoggleChat() → isOpen = true → Render Chat UI
  2. Envío de mensaje:

    User types message → handleSendMessage() →
    Add user message (optimistic) →
    API call →
    Add bot response →
    Update UI
  3. Manejo de errores:

    API Error → onError callback →
    Add error message →
    Show error UI with retry option

Funcionalidades principales

1. Chat conversacional

  • Envío de mensajes en tiempo real
  • Respuestas del AI con formato markdown
  • Historial persistente durante la sesión
  • Scroll automático a nuevos mensajes

2. Sugerencias rápidas

Sugerencias predefinidas para mejorar la experiencia del usuario:

const quickSuggestions = [
  'Crea un nuevo proyecto',
  'Crear una versión',
  'Agregar una pantalla',
]

3. Estados visuales

  • Estado de carga con spinner animado
  • Mensajes de error con iconos y estilos distintivos
  • Diferenciación visual entre preguntas y respuestas
  • Animaciones fluidas para transiciones

4. Accesibilidad

  • ARIA labels en todos los elementos interactivos
  • Navegación por teclado (Enter para enviar)
  • Contraste adecuado para legibilidad
  • Texto alternativo en iconos

Integración global

Renderizado automático

El componente HelpChat se renderiza automáticamente en toda la aplicación a través del layout principal:

Ubicación: src/app/_layout.client.tsx

export const LayoutClient = ({ children }: props) => {
  const { themeSelected } = useTheme()
 
  return (
    <QueryClientProvider client={client}>
      <AuthProvider>
        <ThemeProvider theme={themeSelected}>
          <AlertGlobal />
          <ModalGlobal />
          <HelpChat />  {/* 👈 Renderizado global */}
          {children}
        </ThemeProvider>
      </AuthProvider>
    </QueryClientProvider>
  )
}

Ventajas de la integración global

  • Disponibilidad universal: Accesible desde cualquier página
  • Estado persistente: Mantiene el estado durante la navegación
  • Contexto compartido: Acceso a providers globales (Auth, Theme, QueryClient)
  • Z-index apropiado: Posicionado correctamente sobre otros elementos

Orden de renderizado

QueryClientProvider
├── AuthProvider
    ├── ThemeProvider
        ├── AlertGlobal
        ├── ModalGlobal
        ├── HelpChat (z-index: 1300)
        └── {children} (páginas de la app)

UI/UX y diseño

Paleta de colores

$primary-orange: #ff8324; // Color principal (botones, acentos)
$light-orange: #fff7f0; // Fondo mensajes usuario
$error-red: #dc3f3f; // Mensajes de error
$background-white: #ffffff; // Fondo principal
$border-gray: #f3f3f3; // Bordes y separadores
$text-gray: #656565; // Texto secundario

Tipografía

// Títulos
font-weight: 700;
font-size: 20px;
color: #1d2734;
 
// Subtítulos
font-weight: 300;
font-size: 13px;
 
// Mensajes
font-weight: 300;
font-size: 14px;
line-height: 1.6;

Componentes UI clave

1. FAB (Floating Action Button)

<Fab
  sx={{
    background: 'linear-gradient(135deg, #ff8324, #ff6b1a)',
    '&:hover': {
      transform: 'scale(1.05)',
      boxShadow: '0 6px 24px rgba(0, 0, 0, 0.2)',
    }
  }}
>

2. Header del chat

  • Avatar del asistente con icono
  • Título y subtítulo del chat
  • Botón de cierre con hover effects

3. Área de mensajes

  • Lista scrolleable con auto-scroll
  • Burbujas de mensaje con diferentes estilos
  • Estados de carga integrados

4. Input de mensaje

  • TextField multilinea con scroll interno
  • Botón de envío integrado
  • Placeholder dinámico según idioma

Animaciones y transiciones

// Entrada del chat
@keyframes slideLeft {
  from {
    opacity: 0;
    transform: translateX(40px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}
 
// Hover effects
transition: all 0.3s ease-in-out;

Internacionalización

Sistema de traducciones

El componente utiliza el contexto de idioma de la aplicación:

const { languageSelect, translations } = useLanguageContext()

Archivo de traducciones

Ubicación: src/language/help-chat.json

Estructura:

{
  "help-chat.key": {
    "es": "Texto en español",
    "en": "Text in English"
  }
}

Claves de traducción disponibles

  • help-chat.aria-label-open: Label para abrir chat
  • help-chat.title: Título del chat
  • help-chat.subtitle: Subtítulo
  • help-chat.welcome-message: Mensaje de bienvenida
  • help-chat.suggestions-intro: Introducción a sugerencias
  • help-chat.suggestion-create-project: Sugerencia crear proyecto
  • help-chat.suggestion-create-version: Sugerencia crear versión
  • help-chat.suggestion-add-screen: Sugerencia agregar pantalla
  • help-chat.loading-message: Mensaje de carga
  • help-chat.input-placeholder: Placeholder del input

Gestión de errores

Tipos de errores manejados

1. Errores de conexión

onError: (error) => {
  const errorMessage: ChatMessage = {
    id: `error-${Date.now()}`,
    type: 'answer',
    content: `Error de conexión: ${error.message}`,
    isError: true,
  }
  setChatHistory((prev) => [...prev, errorMessage])
}

2. Errores de autenticación

if (!auth.user?.access_token) {
  // Mostrar mensaje de error de autenticación
  return
}

3. Errores de validación

if (!message.trim()) {
  // No enviar mensaje vacío
  return
}

Visualización de errores

// Mensaje de error con estilos especiales
{message.isError ? (
  <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
    <WarningIcon sx={{ color: '#DC3F3F' }} />
    <Typography sx={{ color: '#DC3F3F' }}>
      {message.content}
    </Typography>
  </Box>
) : (
  <Typography>{message.content}</Typography>
)}
  • Estrategias de recuperación:
    • Retry automático para errores de red
    • Mensajes informativos para el usuario
    • Fallback a valores por defecto en traducciones

Implementación en componentes

const placeholderText =
  translations?.helpChat?.['help-chat.input-placeholder']?.[languageSelect] ||
  'Texto por defecto'

Testing

Cobertura de testing

El componente cuenta con testing comprensivo:

1. Tests unitarios

  • Componentes: index.test.tsx, HelpChatUI.test.tsx
  • Hooks: useHelpChat.test.tsx, useHelpChatActions.test.ts
  • Tipos: types.test.ts
  • Servicios: services/index.test.ts

2. Tests de integración

  • Flujo completo de envío de mensajes
  • Integración con contexto de autenticación
  • Manejo de estados de error

3. Framework de testing

// Ejemplo de test
import { render, screen, fireEvent } from '@testing-library/react'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import HelpChat from './index'
 
describe('HelpChat Component', () => {
  test('should open chat when FAB is clicked', () => {
    render(<HelpChat />)
    const fab = screen.getByLabelText(/abrir chat/i)
    fireEvent.click(fab)
    expect(screen.getByText(/centro de ayuda/i)).toBeInTheDocument()
  })
})

4. Mocks y fixtures

// Mock del servicio de chat
jest.mock('../services', () => ({
  sendChatMessage: jest.fn(() =>
    Promise.resolve({ response: 'Mocked response' })
  ),
}))

Documentación de testing

  • README-TESTS.md: Guía general de testing
  • GUIA-TESTING-PRINCIPIANTES.md: Para desarrolladores nuevos
  • EJEMPLOS-TESTING-PRACTICOS.md: Casos de uso específicos

Consideraciones de performance

Optimizaciones implementadas

1. React Query para cache

const { mutate: sendMessage, isPending: isLoading } = useMutation({
  mutationFn: sendChatMessage,
  mutationKey: ['sendChatMessage'],
  // Cache automático de respuestas
})

2. Callbacks memoizados

const toggleChat = useCallback(() => {
  setIsOpen((prev) => !prev)
}, [])
 
const closeChat = useCallback(() => {
  setIsOpen(false)
}, [])

3. Optimistic UI updates

onMutate: (variables) => {
  // Actualización inmediata de UI antes de respuesta del servidor
  const userMessage = {
    /* ... */
  }
  setChatHistory((prev) => [...prev, userMessage])
}

4. Lazy loading

// El chat solo se renderiza cuando está abierto
if (!chatState.isOpen) {
  return <Fab onClick={toggleChat} />
}

5. Scroll optimizado

const scrollToBottom = () => {
  messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })
}
 
// Debounced scroll
useEffect(() => {
  setTimeout(scrollToBottom, 100)
}, [chatState.isOpen, chatHistory.length])

Configuración y deployment

Dependencias principales

{
  "@mui/material": "^5.x.x",
  "@mui/icons-material": "^5.x.x",
  "@tanstack/react-query": "^5.x.x",
  "react-oidc-context": "^2.x.x",
  "sass": "^1.x.x"
}

Build y bundle

# Desarrollo
npm run dev
 
# Build de producción
npm run build
 
# Testing
npm test

Guía de desarrollo

Agregar nueva funcionalidad

1. Nuevos tipos de mensaje

// En types.ts
export type ChatMessage = {
  // ... propiedades existentes
  newProperty?: NewType // Agregar nueva propiedad
}

2. Nuevas traducciones

// En help-chat.json
{
  "help-chat.new-key": {
    "es": "Nuevo texto",
    "en": "New text"
  }
}

3. Nuevos estilos

// En helpChat.module.scss
.helpChat {
  &__newElement {
    // Nuevos estilos
  }
}

4. Nuevas funcionalidades de hook

// En useHelpChatActions.ts
const newFeature = useCallback(() => {
  // Implementación
}, [dependencies])
 
return {
  // ... propiedades existentes
  newFeature,
}

Debugging

1. React DevTools

  • Inspeccionar estado de hooks
  • Verificar props y contexto
  • Analizar re-renders

2. Network Tab

  • Verificar llamadas a API
  • Inspeccionar tokens de autenticación
  • Analizar respuestas del servidor

3. Console Logs

// Debug condicional
if (process.env.NODE_ENV === 'development') {
  console.log('Chat state:', chatState)
}

Mejores prácticas

1. Código

  • Separación de responsabilidades clara
  • Tipado fuerte con TypeScript
  • Funciones puras cuando sea posible
  • Hooks reutilizables

2. Testing

  • Test cada funcionalidad nueva
  • Mocks apropiados para dependencias
  • Casos de edge y errores
  • Documentación actualizada

3. Performance

  • Memoización de funciones costosas
  • Lazy loading de componentes
  • Optimistic updates para mejor UX
  • Cleanup de efectos

4. Mantenibilidad

  • Documentación actualizada
  • Comentarios en código complejo
  • Convenciones de nomenclatura
  • Estructura de archivos clara

Mejores prácticas

  • Separación de responsabilidades clara entre componentes
  • Tipado fuerte con TypeScript para todos los contratos
  • Memoización de funciones costosas con useCallback
  • Testing comprensivo de cada funcionalidad nueva
  • Documentación actualizada con cada cambio

Última actualización: Septiembre 2025
Mantenido por: ITGlobers Apps Team