viewof recordButton = {
let label,
reduce,
localMediaRecorder,
{ state } = mediaRecorder || {};
const RECORDING = "recording",
INACTIVE = "inactive",
ACTIVE = "active";
if (state ?? true) {
label = "Grant mic access";
reduce = async () => {
try {
let userMedia = await navigator.mediaDevices.getUserMedia({
audio: true
});
mutable mediaRecorder = await new MediaRecorder(userMedia, {
mimeType: "audio/mp4"
});
} catch (error) {
return error.message;
}
};
}
if (state === RECORDING) {
label = "Stop Recording";
reduce = async () => await mediaRecorder.stop();
}
if (state === INACTIVE) {
label = "Start Recording";
reduce = async () => await mediaRecorder.start();
}
return Inputs.button(label, {
value: null,
reduce: async () => {
reduce();
mutable mediaRecorder = mediaRecorder;
return state;
}
});
}