Microphone
getUserMedia-based capture. stop() releases tracks so the OS indicator clears.
- Methods: requestPermission(), start(), stop(), getStream()
- Pair start/stop; never leave tracks open after unmount
TSXMicrophone — React
1import { useEffect, useState } from "react";
2import { Microphone, toast } from "@quan-erp/shared-frontend-core";
3
4export function MicToggle() {
5 const [listening, setListening] = useState(false);
6 const mic = Microphone.instance;
7
8 useEffect(() => {
9 return () => {
10 mic.stop();
11 };
12 }, [mic]);
13
14 async function toggle() {
15 try {
16 if (listening) {
17 mic.stop();
18 setListening(false);
19 return;
20 }
21 await mic.requestPermission();
22 await mic.start();
23 const stream = mic.getStream();
24 console.log("tracks", stream?.getTracks().length);
25 setListening(true);
26 } catch (e) {
27 toast.error((e as Error).message ?? "Microphone failed");
28 }
29 }
30
31 return (
32 <button type="button" onClick={() => void toggle()}>
33 {listening ? "Stop mic" : "Start mic"}
34 </button>
35 );
36}