LegbaChat
expérimentaldepuis 0.1.0@legba-core/ui
Aperçu en direct — vrai composant, pas une image
LegbaChat
Ce que ça fait
Fil de discussion (<legba-chat for="id">) qui réutilise la connexion RTC
d’un <legba-call> référencé par id — jamais sa propre connexion.
Rend <legba-message> par message + <legba-message-input> en pied ;
envoie via sendData() de la connexion partagée, écoute dataReceived. Un
message envoyé s’affiche immédiatement en local (écho, sendData() ne
redéclenche jamais son propre dataReceived).
Signature
class LegbaChat extends LegbaElement {
for: string;
}
Tag : legba-chat.
Paramètres
| Propriété | Type | Requis | Défaut | Description |
|---|---|---|---|---|
for | string | oui | "" | id de l’élément <legba-call> référencé, dont la connexion est réutilisée |
Retour
N/A — un élément DOM. Aucun événement propre émis.
Erreurs
Aucune exception : un for invalide produit un console.error explicite
(comme <legba-call-button>) ; un dataReceived dont le payload n’est pas
l’enveloppe de message attendue est ignoré silencieusement, jamais une
exception qui casse la boucle d’écouteurs de LegbaClientRoom.
Exemple minimal
<legba-call id="salle-1" room="salle-demo" token-endpoint="/api/token"></legba-call>
<legba-call-button for="salle-1"></legba-call-button>
<legba-chat for="salle-1"></legba-chat>
Exemple complet
import type { LegbaChat } from "@legba-core/ui";
// Deux instances référençant le même <legba-call> restent synchronisées
// par construction : chacune écoute indépendamment le même dataReceived de
// la même connexion partagée.
function mountTwoViews(): void {
const primary = document.querySelector<LegbaChat>("#chat-principal")!;
const secondary = document.querySelector<LegbaChat>("#chat-secondaire")!;
primary.for = "salle-1";
secondary.for = "salle-1";
}
Pièges
- Ne réutilise QUE la connexion, pas l’identité ni l’UI de
<legba-call>:<legba-chat>litLegbaCall.clientRoom(une propriété, pas un événement) à chaque changement delegba-call-phase-changede la cible. - Avant connexion, affiche « en attente », jamais une erreur — un
<legba-chat for="...">monté avant que l’appel ne soit établi est un état normal, pas un cas d’échec. - Après déconnexion, l’historique reste visible : seule la capacité
d’envoyer un nouveau message s’arrête (le composeur
<legba-message-input>disparaît, remplacé par l’indicateur « en attente »). - L’enveloppe de message sur le canal de données est propre à Legba
(
{ type: "legba-chat-message", text }) : un pair non-Legba sur le même canal de données ne sera jamais confondu avec un message de chat (ignoré silencieusement, voirlegba-chat-logic.ts). - Le fil de messages est une région live (LGB-035,
part="messages",role="log"/aria-live="polite") : un message reçu est annoncé, pas seulement affiché.logplutôt questatus— c’est le rôle prévu pour un historique où seul l’ajout compte, et il n’interrompt jamais la lecture en cours. Un::part(messages)qui poseraitdisplay: nonerendrait le fil muet en plus de l’effacer. - Consomme les jetons
--legba-*comme tout composant@legba-core/ui: ne redéclare jamais un jeton public directement, voirLegbaElement.