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.

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 RenderEstructura 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 chatTipos 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 errorServicios
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
globalfunctionspara 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
-
Inicialización:
User clicks FAB → toggleChat() → isOpen = true → Render Chat UI -
Envío de mensaje:
User types message → handleSendMessage() → Add user message (optimistic) → API call → Add bot response → Update UI -
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 secundarioTipografí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 chathelp-chat.title: Título del chathelp-chat.subtitle: Subtítulohelp-chat.welcome-message: Mensaje de bienvenidahelp-chat.suggestions-intro: Introducción a sugerenciashelp-chat.suggestion-create-project: Sugerencia crear proyectohelp-chat.suggestion-create-version: Sugerencia crear versiónhelp-chat.suggestion-add-screen: Sugerencia agregar pantallahelp-chat.loading-message: Mensaje de cargahelp-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 testGuí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