TÉLÉMÉTRIE DE SAISIE / FICHE DE SESSION
Lire une session de frappe comme une fiche
Cette page relie durée, choix du texte, contrôles caractère par caractère, formules, états de carte des touches, panneau à deux joueurs et chemin de score public au code actuellement visible dans l’éditeur.
- 30 / 60 / 120 secondes · initial 60
- beginner / intermediate / expert · initial intermediate
- solo / panneau deux joueurs · initial solo
Bande de contrôle de session
Avant une session, l’éditeur expose trois sélecteurs. Ce sont des réglages de l’éditeur, pas des étiquettes sur une personne ou sa frappe.
- DURÉE — 30 · 60 · 120
Le sélecteur propose 30, 60 et 120 secondes. Sa valeur initiale est 60 secondes.
- DIFFICULTÉ — 3 JEUX DE TEXTES
Le sélecteur propose beginner, intermediate et expert. Sa valeur initiale est intermediate.
- MODE — SOLO · 2 JOUEURS
L’éditeur commence en solo. L’autre panneau visible est un mode à deux joueurs avec saisies séparées.
Source et choix du texte
Des arrays de textes sont intégrés pour chaque langue affichée et chaque difficulté. À l’initialisation puis au démarrage du test, l’éditeur emploie Math.floor(Math.random() * texts.length) pour prendre une entrée de l’array concerné.
Horloge de session et sorties
Le minuteur avance lorsqu’un test est démarré et non terminé. Une session s’achève quand timeLeft === 0 ou lorsqu’une saisie atteint la longueur du texte actuel.
01 · SOLO — Le contrôle Démarrer entre directement
En mode solo, le contrôle Démarrer appelle directement le chemin de démarrage puis place le focus sur la saisie solo.
02 · 2 JOUEURS — 3 → 2 → 1 avant les saisies
En mode deux joueurs, le contrôle Démarrer lance un compte à rebours 3–2–1. Le chemin de démarrage place ensuite le focus sur Player 1.
03 · FIN — Temps nul ou limite de texte
Le chemin de fin est atteint à timeLeft === 0, ou lorsqu’une longueur de saisie atteint au moins currentText.length.
Tableau de mesure caractère par caractère
Pour une saisie, l’éditeur parcourt les caractères par position et vérifie chacun face à currentText à cette position. Les positions correspondantes alimentent correctChars ; totalChars est la longueur de saisie.
- WPM — round((correctChars / 5) / elapsedMinutes)
Calculé seulement lorsque elapsedMinutes est supérieur à 0.
- ACCURACY — round((correctChars / totalChars) * 100)
Calculée seulement lorsque totalChars est supérieur à 0.
- PROGRESSION — round(currentIndex / currentText.length * 100)
currentIndex suit la longueur de la saisie actuelle.
Carte des touches et registre d’état
Lorsqu’un caractère solo nouvellement ajouté a un caractère attendu, ce caractère attendu est mis en minuscules et compté. Une erreur est comptée lorsque typedChar !== expectedChar.
TEST ACTUEL — Affiché seulement avec des données
La carte du test actuel est rendue seulement lorsque ses données d’erreurs de touches contiennent des entrées.
CUMULÉ — typingSpeedTest_keyErrors
À l’initialisation, l’éditeur lit les erreurs cumulées depuis localStorage sous typingSpeedTest_keyErrors. À une fin solo, les erreurs actuelles sont fusionnées et écrites sous cette clé.
RÉINITIALISER — Retirer la clé
Le contrôle de réinitialisation retire typingSpeedTest_keyErrors et vide l’état cumulé montré par l’UI. La carte cumulée est rendue seulement quand des données existent.
Fiche solo et panneau deux joueurs
Les modes visibles utilisent des états de saisie distincts. Le panneau deux joueurs est décrit ici uniquement comme une UI à deux saisies.
HISTORIQUE SOLO — Au plus cinq entrées UI
Une fin solo place son résultat devant avec [result, ...slice(0, 4)]. Cet historique est un état React utilisé dans l’UI.
SAISIES JOUEUR — Champs suivis séparément
Player 1 et Player 2 ont chacun un état de saisie, index, caractères corrects, caractères totaux, WPM et accuracy.
ÉTIQUETTE FINALE — Branche WPM
À une fin deux joueurs, Player 1 gagne seulement si player1Wpm > player2Wpm ; Player 2 seulement dans le cas inverse ; sinon le résultat est tie.
Chemin facultatif de score public
Après une fin solo, une valeur WPM supérieure à 20 ouvre une boîte de dialogue. Le champ du nom est facultatif et limité à 100 caractères avant l’envoi.
DIALOGUE — Nom facultatif et envoi
La boîte envoie WPM solo, accuracy, durée, difficulté, langue et un nom rogné lorsqu’il est saisi.
ENTRÉE SERVEUR — Bornes acceptées
saveScore accepte WPM entier au moins égal à 0, accuracy entière de 0 à 100, durée entière, difficulté beginner/intermediate/expert et langue de 10 caractères maximum ; le serveur insère l’enregistrement envoyé.
LISTE PUBLIQUE — Requête langue + difficulté
La requête de scores filtre par langue et difficulté. L’UI demande limit 10 ; la requête ordonne WPM décroissant puis accuracy décroissante.
Notes de périmètre
- Cette fiche décrit les chemins et formules de l’éditeur visibles dans le code actuel.
- Le choix du texte repose sur des arrays et utilise la langue affichée et la difficulté choisie.
- Un envoi de score public est une saisie utilisateur via le chemin de score ; cette page ne le traite pas comme une vérification.
- La requête de scores a les filtres, l’ordre et la limite UI indiqués ; cette page ne déclare pas qu’une entrée apparaîtra.
Poursuivre avec des outils voisins
Chaque outil lié a ses propres contrôles et son chemin de résultat.
- Roue de choix
Définissez des entrées dans une interface de roue séparée et consultez son panneau de sélection.
- Lancer une pièce
Ouvrez l’interface de pièce séparée pour un résultat à deux faces.
- Sudoku
Ouvrez une interface de puzzle à grille avec ses propres contrôles.
Questions sur la fiche de session
Quels contrôles sont choisis initialement ?
Les valeurs initiales sont 60 secondes, difficulté intermediate et mode solo. La durée propose 30, 60 et 120 secondes ; la difficulté propose beginner, intermediate et expert.
Comment un texte est-il choisi ?
Pour la langue et la difficulté choisies, l’éditeur prend une entrée d’array avec Math.floor(Math.random() * texts.length) à l’initialisation et au démarrage du test.
Comment sont calculés WPM, accuracy et progression ?
WPM est round((correctChars / 5) / elapsedMinutes) lorsque elapsedMinutes est supérieur à 0. Accuracy est round((correctChars / totalChars) * 100) lorsque totalChars est supérieur à 0. La progression est round(currentIndex / currentText.length * 100).
Que relève la carte des touches ?
Pour un caractère solo nouvellement ajouté, le caractère attendu est mis en minuscules et compté. typedChar !== expectedChar augmente son erreur. Les erreurs cumulées emploient la clé localStorage typingSpeedTest_keyErrors, et Réinitialiser retire cette clé.
Que transmet le dialogue public ?
Après une fin solo avec WPM au-dessus de 20, le dialogue peut transmettre un nom facultatif de 100 caractères maximum avec les champs de score. Le serveur accepte les bornes entières et valeurs enum indiquées puis insère l’enregistrement envoyé.
Ouvrir les contrôles de session de frappe
Choisissez durée, difficulté et mode dans l’éditeur, puis consultez les états caractère par caractère et métriques visibles.