Mensajes y Conversaciones
El sistema de mensajería es uno de los módulos más completos de Closegram. Admite múltiples tipos de mensajes, chats grupales, mensajes pagos, encuestas, ubicación en vivo, mensajes que desaparecen, y más.
Cada propiedad tiene su propia casilla que indica si esa pieza específica está totalmente implementada y funcional de extremo a extremo (frontend + backend) — actualízalas tú mismo a medida que se completa el trabajo; esta página no las sobrescribirá.
- Mensajes directos 1 a 1
- Conversaciones grupales (crear un grupo, enviar/recibir mensajes en él)
- Enlaces de invitación a grupos compartibles (
/join/[token]— previsualiza el grupo y luego únete después de iniciar sesión) - Indicadores de "escribiendo..."
- Confirmaciones de lectura (indicador de visto/entregado) — doble check azul en
MessageBubble.tsxcuandostatus === 'read', actualizado en vivo mediante la subscriptionmessageRead - Reacciones a mensajes
- Permisos de publicación en grupos — los creadores/administradores eligen quién puede enviar mensajes (todos / solo administradores / miembros específicos); los miembros bloqueados ven un compositor bloqueado. Aplicado en el backend en
createMessage - Contenido compartido en el panel de detalles — pestañas de Multimedia / Documentos / Enlaces, además de Destacados y Fijados como secciones propias
- Quitar miembros de un grupo (administrador) — con un reembolso prorrateado automático para los miembros que pagaron para unirse a un grupo de suscripción (
conversationRemovalPreviewmuestra el monto antes de confirmar) - Agregar miembros oculta a los usuarios cuya configuración de privacidad de "quién puede agregarme a grupos" lo bloquea (
User.canAddToGroup) - El nombre/avatar en el encabezado del chat enlaza al perfil de la otra persona (1 a 1)
- Destacar/fijar mensajes
- Entrega en tiempo real vía subscriptions
- Mensajes pagos/bloqueados, restringidos por monedas
- Integración de llamadas de voz/video desde el chat
- Transferencia de monedas vía mensaje
- Encuestas en el chat
- Mensajes que desaparecen — se habilitan por conversación (administradores de grupo, en el panel de detalles de la conversación) con una duración (5 min / 1 h / 24 h / 7 días). Los mensajes nuevos se marcan con una fecha de expiración al enviarse, se ocultan del hilo una vez transcurrido ese tiempo, y se eliminan (borrado suave) en la siguiente lectura. Habilitar esta función también corrigió un error preexistente por el cual
updateConversationSettingsnunca persistía nada (el resolver pasaba claves en camelCase que el manager interpretaba como snake_case, y luego las escribía en una columnasettingsinexistente). Funciona tanto en chats grupales (gestionado por administradores) como en mensajes directos 1 a 1, donde cualquiera de los participantes puede activarlo/desactivarlo (la mutation de configuración permite a cualquier participante de una conversación directa hacerlo, pero solo a los administradores en los grupos). - Menciones (@) en el chat — al enviar un mensaje se analizan las menciones
@nombredeusuariodel texto, se resuelven a usuarios y se registran filas deMessageMention(nueva tablamessage_mention+ modelo + integración encreateMessage), lo que dispara una notificaciónmentionque aparece en el panel de notificaciones existente. Esto también corrigió código muerto: el lado de lectura (el tipoMessageMention, las queriesuserMentions/messageMentions,markMentionAsRead, y los métodos del servicio de acceso) hacía referencia a un modeloMessageMentionque nunca existió, por lo que esas rutas fallaban en tiempo de ejecución. Todavía no existe una vista dedicada de historial de menciones dentro del chat (las queries son funcionales a nivel de API). - Traducción de chat en tiempo real — cada participante puede activar un modo de traducción por conversación y elegir su idioma de lectura (Español / English) desde el encabezado del chat. Los mensajes entrantes de la otra persona se muestran en el idioma del lector, con un interruptor "Ver original" en cada burbuja traducida. Las traducciones se calculan una sola vez y se almacenan en caché en la tabla
message_translation, indexadas por(message_id, target_language), de modo que un mensaje solo se envía a la API de traducción paga una vez por idioma durante toda su vida útil — el costo está acotado por un presupuesto mensual opcional de caracteres (TRANSLATION_MONTHLY_CHAR_LIMIT, rastreado en Redis) y un límite de longitud por mensaje. Al enviarse, el mensaje se pre-traduce (precalentado) a todos los idiomas en los que un destinatario esté leyendo en ese momento, de modo que aparece traducido al instante; si alguien activa la traducción más tarde, los mensajes anteriores se traducen de forma diferida en la primera lectura y luego se almacenan en caché. Los textos vacíos / solo con URL / solo con emojis y los mensajes en el mismo idioma se omiten para evitar gastos innecesarios de API. El motor es independiente del proveedor (LibreTranslate, DeepL, Google Translate u OpenAI) y se elige a partir de variables de entorno — sin un proveedor configurado, la función simplemente se oculta y el chat muestra el texto original. Consultamessage-translation.service.js/message-translation.manager.jsy las operaciones de GraphQLmessageTranslations/setMessageTranslation. - Compartir ubicación en el chat — 'Compartir ubicación' en el compositor envía la ubicación actual (
shareLocation); la burbuja renderiza ubicaciones estáticas y en vivo (MessageBubble) con un enlace a Maps y una insignia En vivo (el envío de transmisión en vivo necesitalocationTypeenLocationInput+ una regeneración de codegen)
Consulta la referencia técnica para ver los esquemas de GraphQL, rutas, enlaces a los archivos fuente y el estado de integración de cada campo.