import { useEffect, useState } from 'react';

/**
 * Wie lange das Tippen ruhen muss, bevor eine Live-Region spricht.
 *
 * Gemeinsame Quelle für alle Ansichten mit einem Filterfeld. Zwei Zahlen an
 * zwei Stellen liefen auseinander, und eine davon wäre dann die falsche.
 */
export const RUHE_MS = 400;

/**
 * Ein Ansagetext, der erst nach einer Ruhepause nachzieht.
 *
 * **Wozu.** Eine höfliche Live-Region, die bei jedem Tastenanschlag eine neue
 * Zahl spricht, ist genau das, wovor der Prüfplan zu WCAG 4.1.3 warnt: Wer
 * „Aufbewahrung“ tippt, bekäme bis zu dreizehn einander unterbrechende
 * Zahlenansagen zwischen die Zeichen-Echos gemischt. Nach der Ruhepause steht
 * ein Satz da, und der wird gesprochen.
 *
 * **Warum der sichtbare Text mit wartet.** Naheliegend wäre, die Zahl sofort
 * anzuzeigen und nur die Ansage aufzuschieben. Das verlangte zwei Elemente –
 * eine sichtbare Zahl und eine zweite, versteckte Live-Region mit demselben
 * Inhalt in anderer Fassung. Zwei Fassungen derselben Auskunft laufen
 * auseinander, und die versteckte fiele beim Nachsehen niemandem auf.
 * 400 Millisekunden Verzug sind an einer Trefferzahl nicht zu bemerken; an
 * der Liste darunter, die sofort folgt, sieht man ohnehin, dass etwas
 * geschieht.
 *
 * Bis 0.22.0 hatte nur die Fragensuche diese Ruhepause. Die Glossaransicht
 * sprach bei jedem Anschlag – dieselbe Art Auskunft, zwei verschiedene
 * Verhaltensweisen.
 */
export function useVerzoegerteAnsage(text: string, ruheMs: number = RUHE_MS): string {
  const [ansage, setzeAnsage] = useState(text);

  useEffect(() => {
    const uhr = setTimeout(() => {
      setzeAnsage(text);
    }, ruheMs);
    return () => {
      clearTimeout(uhr);
    };
  }, [text, ruheMs]);

  return ansage;
}
