Commit b2e098bd authored by Jordan Grossemy's avatar Jordan Grossemy
Browse files

Un message direct qui n'avertit personne, et le texte d'un salon privé qui part à tous

Signalé à l'écran : la personne qui reçoit un message direct n'a aucune
notification. La dépêche partait bien — aucun écran ne l'écoutait. Il fallait
ouvrir « Messages directs » pour découvrir qu'on avait été appelé, ce qui pendant
une crise revient à ne pas l'être.

En cherchant à qui adresser la notification, j'ai trouvé plus grave.

── Le flux ne filtrait rien

Il transmettait chaque dépêche à chaque abonné de la crise, sans aucun filtre. Or
la charge d'un message de salon porte son **texte**. Le contenu d'un salon privé
partait donc à tous les membres de la crise par WebSocket, alors que la liste des
salons le masque, que la recherche s'y arrête, et que le produit promet le
contraire. Rien ne se voyait à l'écran : le client ignorait simplement les
dépêches d'un salon qu'il ne connaissait pas. Ignorer n'est pas ne pas recevoir.

Même chose pour les messages directs : tout le monde apprenait que deux personnes
se parlaient, avec l'identifiant de leur conversation — ce qu'un message direct
est précisément censé ne pas dire.

Les dépêches sont désormais adressées. Le tri se fait à la publication, où l'on
sait qui a le droit de voir, et non à la réception : une règle appliquée au bord
serait une règle que le prochain abonné oublierait. Six publications de salon, la
frappe en cours, et les directs. Une dépêche sans destinataire reste diffusée à
toute la crise, ce qui est juste pour ce que toute la crise peut lire.

── Les conversations flottantes

En bas à droite, plusieurs à la fois : pendant une crise on parle à trois
personnes en même temps. Elles vivent dans la coque, comme le panneau de
visioconférence, et pour la même raison — changer d'écran ne doit pas fermer une
conversation. Un message qui arrive ouvre sa fenêtre repliée : on est averti sans
être interrompu. Quatre au plus, la plus ancienne cède la place ; au-delà elles se
chevauchent et l'on n'en lit aucune.

Réduire et fermer sont deux gestes distincts : confondre les deux fait perdre le
fil qu'on voulait seulement mettre de côté.

Et un défaut que j'ai introduit puis corrigé, signalé à l'écran comme « la croix
ne fonctionne pas ». Elle fonctionnait, deux fois par seconde. Les rappels du
dock étaient recréés à chaque rendu et reconstruisaient le tableau des fenêtres
depuis la valeur capturée au rendu précédent : l'effet « dépliée, on est en train
de lire » en dépendait, repartait à chaque rendu, posait un tableau neuf,
provoquait un rendu — une boucle, qui défaisait la fermeture aussitôt.

Le correctif tient en une règle : cet état ne se pose jamais depuis une valeur,
toujours depuis une fonction du précédent, et la mise à jour rend le **même**
tableau quand rien ne change, ce qui arrête React net. La référence que j'avais
introduite pour contourner le problème disparaît avec lui. Un contrôle statique
interdit désormais la forme de code fautive : si quelqu'un réintroduit une pose
depuis une valeur, la suite rougit avant l'écran.

── Nommer quelqu'un

Là aussi la moitié existait : la colonne « mentions », son index, le champ de
l'événement, la projection et la route étaient là depuis l'origine. Seul le client
ne les envoyait jamais, et la dépêche ne les portait pas — écrire « @Maëlle » ne
nommait donc personne.

Taper « @ » propose les mêmes personnes que pour porter une action, au clavier
comme à la souris. Le texte garde le nom en clair et l'identifiant part à côté :
« @[Maëlle](uuid) » rendrait illisible le journal qui fait foi. Effacer le nom
après l'avoir choisi n'avertit plus personne.

« @tous », « @all », « @ici », « @here », « @canal », « @channel » interpellent le
salon — reconnus sur le texte, parce qu'un signal qui demande de cocher une case
en plus d'écrire le mot est un signal qu'on oublie. « @allocation » n'interpelle
personne.

Être nommé se signale même dans le salon qu'on a sous les yeux : c'est justement
le cas où l'on regarde ailleurs dans la page. La pastille est distincte du
compteur de non-lus — « douze messages » ne dit pas « on t'a demandé quelque
chose ».

Huit garanties neuves.

Ce qui manque encore, et que j'ai signalé à part : sans service worker ni Web
Push, tout cela s'arrête à l'onglet ouvert. EX-18 demande « un canal dédié et non
désactivable pour la mobilisation » ; le mobile a son heurtoir, le navigateur
n'a rien.

Ces fichiers portent aussi les styles de la main courante et la propriété que
son écran attend, qui viennent avec le lot précédent.

Co-Authored-By: Claude (RCA)
parent 1232a865
Loading
Loading
Loading
Loading