J’ai récemment ouvert WhatsApp Web et compté : 52 conversations où l’autre attendait une réponse de moi, perdues dans des centaines de groupes et de fils de notifications.
Le filtre natif (Toutes / Non lues / Favoris / Groupes) ne propose pas de vue « à répondre ». Non lues ne capture que les messages réellement non lus, pas ceux que j’ai ouverts à 23h en oubliant ensuite d’y répondre. J’ai donc écrit une petite extension Chrome, environ 250 lignes de JavaScript sans dépendance, pour faire émerger cette vue manquante.

L’idée
Chaque ligne de la sidebar affiche un aperçu du dernier message. Quand c’est moi qui l’ai envoyé, l’aperçu inclut une petite icône (les checkmarks envoyé / livré / lu). Quand c’est l’autre, aucune icône n’est rendue. L’heuristique est donc simple : icône présente = répondu, icône absente = non répondu.
function classifyRow(row) {
const sentByMe = row.querySelector(SENT_ICONS);
if (sentByMe || otherPersonReacted(row)) {
row.classList.add('wa-answered');
return true;
}
row.classList.add('wa-unanswered');
return false;
}Un MutationObserver ciblé sur #pane-side surveille la sidebar et applique la classe à mesure que les conversations bougent. Une règle CSS pilotée par un bouton de filtre masque les lignes déjà répondues.
Le piège des réactions
La première version se trompait sur un cas. Quand quelqu’un réagit à un de mes messages avec un emoji, l’aperçu devient une ligne de notification :
Margaux a réagi par 😂 à : « Sur ceux qui ont testé… »
Pas de checkmark sur cette ligne, alors même que le dernier message envoyé est le mien. Le correctif consiste à détecter ces phrases de réaction par langue et à les traiter comme « répondu » :
const REACTION_PATTERNS = [
/\ba réagi par\b.{1,30}\bà\b/i, // FR
/\breacted\b.{1,30}\bto\b/i, // EN
/\breagiert\b/i, // DE
/\breaccionó\b/i, // ES
/\breagito\b/i, // IT
/\breagiu\b/i, // PT
/\bgereageerd\b/i, // NL
];La regex est appliquée aux éléments span[title] et span[dir] uniquement, sinon un contact dont le nom contient « réagi » déclencherait aussi une correspondance.
