// Push-to-Talk-mikrofon: lyssnar ENDAST efter aktivt tryck, visar tydligt // när inspelning pågår och skriver in transkriberingen i ett redigerbart // fält. Skicka sker aldrig automatiskt. import { useEffect, useRef, useState } from "react"; import { startaIgenkanning, stodRost } from "./rost"; export function MikrofonKnapp({ paText }: { paText: (text: string) => void }) { const [lyssnar, setLyssnar] = useState(false); const [interim, setInterim] = useState(""); const igenkanningRef = useRef>(undefined); const paTextRef = useRef(paText); paTextRef.current = paText; useEffect(() => () => igenkanningRef.current?.abort(), []); if (!stodRost()) return null; const stoppa = () => { igenkanningRef.current?.stop(); igenkanningRef.current = undefined; setLyssnar(false); setInterim(""); }; const starta = () => { setLyssnar(true); igenkanningRef.current = startaIgenkanning( ({ transkript, slutgiltigt }) => { if (slutgiltigt) { setInterim(""); paTextRef.current(transkript.trim()); } else { setInterim(transkript); } }, () => { setLyssnar(false); setInterim(""); }, ); }; return ( {lyssnar && ( ● Inspelning pågår{interim ? ` — ”${interim}”` : "…"} )} ); }