Volver a la wiki

Chat equipo: avisos audio+badge, maximizar, paste imágenes y Jitsi Meet

Chat equipo: avisos audio+badge, maximizar, paste imágenes y Jitsi Meet

Cuatro mejoras del widget TeamChat del dashboard (DesktopA) mergeadas en el commit 605a339 (2026-05-20). Pedidas por Edu. Afectan a src/components/widgets/TeamChat.tsx, la librería src/lib/chatNotify.ts, los CF Pages Functions de upload/stream de imágenes y el nuevo modal JitsiMeetingModal.


Item 1 — Avisos audio + badge de mensajes no leídos

Cuando llega un mensaje de otro miembro del equipo y el tab no está visible, el sistema dispara:

Si el usuario está mirando el tab (visibilityState === 'visible'), los mensajes se marcan como leídos inmediatamente, sin emitir sonido ni badge.

Persistencia del estado de lectura

Archivos clave

ArchivoRol
src/lib/chatNotify.tsplayChatBeep(), setTabBadge(n), setFaviconBadge(active)
src/components/widgets/TeamChat.tsxConsume chatNotify; gestiona unreadCount, lastSeenIdRef, efectos de visibilidad

Item 2 — Maximizar widget

El bento del chat (div.team-chat-bento) puede expandirse a posición fija cubriendo toda la altura disponible del canvas en el lado derecho del dashboard.


Item 3 — Pegar capturas con Ctrl+V

El textarea del chat intercepta el evento paste buscando items image/* en el clipboardData.

Flujo

  1. Usuario presiona Ctrl+V con una imagen en el portapapeles (p. ej. captura de pantalla).
  2. onPaste detecta el File de tipo imagen, llama a POST /api/chat/upload-image con multipart/form-data.
  3. El CF Pages Function sube el archivo al bucket R2 TASK_ATTACHMENTS con el prefijo chat/ y devuelve { filename, url, content_type }.
  4. Se inserta en el draft el marcador [abrir imagen:/api/chat-images/<uuid.ext>].
  5. La función renderBody() detecta el marcador con CHAT_IMG_REGEX y lo convierte en un link <abrir imagen> que abre la imagen en pestaña nueva.

Restricciones del endpoint

ParámetroValor
Tamaño máximo5 MB
MIME permitidosimage/png, image/jpeg, image/webp, image/gif
Bucket R2TASK_ATTACHMENTS
Prefijo R2chat/
AuthCF Access (cualquier sesión staff válida)

Durante la subida el textarea muestra placeholder Subiendo imagen… y queda deshabilitado.


Item 4 — Jitsi Meet embebido

Botón “Reunión” en la barra interna del widget abre JitsiMeetingModal: un portal React con createPortal que renderiza un <iframe> fullscreen a meet.jit.si.


Endpoints CF Pages Functions nuevos

POST /api/chat/upload-image

GET /api/chat-images/:name


Véase también

Subir