link-stack/apps/link/metamigo-add/_components/voice/voicelines/MicInput.tsx

153 lines
4.1 KiB
TypeScript
Raw Normal View History

2023-06-28 12:55:24 +00:00
"use client";
2023-02-13 12:41:30 +00:00
import { useInput } from "react-admin";
import React, { useState } from "react";
import dynamic from "next/dynamic";
2023-05-25 07:03:57 +00:00
import MicIcon from "@mui/icons-material/Mic";
import StopIcon from "@mui/icons-material/Stop";
import Button from "@mui/material/Button";
2023-08-25 07:11:33 +00:00
// import { useTheme } from "@mui/styles"; // makeStyles,
2023-05-24 20:27:57 +00:00
// import AudioPlayer from "material-ui-audio-player";
2023-02-13 12:41:30 +00:00
import { useStopwatch } from "react-timer-hook";
import style from "./MicInput.module.css";
2023-03-15 12:17:43 +00:00
// import type { ReactMicProps } from "react-mic";
2023-02-13 12:41:30 +00:00
2023-03-14 17:40:24 +00:00
const ReactMic = dynamic<any>(
() => {
throw new Error(
2023-08-25 07:11:33 +00:00
"MIC INPUT FEATURE IS DISABLED",
2023-03-15 12:17:43 +00:00
); /* return import("react-mic").then((mod) => mod.ReactMic); */
2023-03-14 17:40:24 +00:00
},
2023-08-25 07:11:33 +00:00
{ ssr: false },
2023-02-13 12:41:30 +00:00
);
2023-03-14 17:40:24 +00:00
const blobToDataUri = (blob: Blob) => {
2023-02-13 12:41:30 +00:00
const reader = new FileReader();
reader.readAsDataURL(blob);
return new Promise((resolve) => {
reader.onloadend = () => {
resolve(reader.result);
};
});
};
2023-03-14 17:40:24 +00:00
const dataUriToObj = (dataUri: string) => {
2023-02-13 12:41:30 +00:00
const [prefix, base64] = dataUri.split(",");
const mime = prefix.slice(5, prefix.indexOf(";"));
2023-03-14 17:40:24 +00:00
const result: any = {};
2023-02-13 12:41:30 +00:00
result[mime] = base64;
return result;
};
2023-03-14 17:40:24 +00:00
const blobToResult = async (blob: Blob) => {
const result = dataUriToObj((await blobToDataUri(blob)) as string);
2023-02-13 12:41:30 +00:00
return result;
};
2023-05-25 08:57:24 +00:00
/* const resultToDataUri = (result: Record<string, any>): string => {
2023-02-13 12:41:30 +00:00
if (!result || !result["audio/webm"]) return "";
const base64 = result["audio/webm"];
const r = `data:audio/webm;base64,${base64}`;
return r;
2023-05-25 08:57:24 +00:00
}; */
2023-02-13 12:41:30 +00:00
2023-03-14 17:40:24 +00:00
const MicInput = (props: any) => {
2023-02-13 12:41:30 +00:00
const { seconds, minutes, hours, start, reset, pause } = useStopwatch();
2023-08-25 07:11:33 +00:00
const theme: any = {}; // useTheme();
2023-02-13 12:41:30 +00:00
const {
2023-05-25 08:57:24 +00:00
field: { onChange }, // value
2023-02-13 12:41:30 +00:00
} = useInput(props);
2023-03-15 12:17:43 +00:00
const [record, setRecorder] = useState({ record: false });
2023-05-25 08:57:24 +00:00
// const decodedValue = resultToDataUri(value);
2023-02-13 12:41:30 +00:00
const startRecording = () => {
setRecorder({ record: true });
reset();
start();
};
const stopRecording = () => {
setRecorder({ record: false });
pause();
};
2023-03-15 12:17:43 +00:00
async function onData(recordedBlob: any) {
console.log({ recordedBlob });
}
2023-02-13 12:41:30 +00:00
2023-03-14 17:40:24 +00:00
async function onStop(recordedBlob: any) {
2023-02-13 12:41:30 +00:00
const result = await blobToResult(recordedBlob.blob);
onChange(result);
}
const isRecording = record.record;
2023-05-25 08:57:24 +00:00
// const canPlay = !isRecording && decodedValue;
2023-03-14 17:40:24 +00:00
const duration = `${hours.toString().padStart(2, "0")}:${minutes
2023-02-13 12:41:30 +00:00
.toString()
.padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
2023-05-25 08:57:24 +00:00
/*
2023-03-15 12:17:43 +00:00
const useStyles = makeStyles(() => ({
volumeIcon: {
display: "none",
},
mainSlider: {
display: "none",
},
}));
2023-05-25 08:57:24 +00:00
*/
2023-02-13 12:41:30 +00:00
return (
<div className="MuiFormControl-marginDense RaFormInput-input-40">
<div className={style.content}>
<div className={style.voiceWaveWrapper}>
<ReactMic
record={record.record}
className={isRecording ? style.visible : style.hidden}
onStop={onStop}
onData={onData}
2023-05-25 14:36:08 +00:00
// @ts-ignore
2023-02-13 12:41:30 +00:00
strokeColor={theme.palette.primary.main}
backgroundColor="white"
mimeType="audio/webm"
visualSetting="frequencyBars"
/>
</div>
<div>{isRecording ? <p>Recording... {duration}</p> : ""}</div>
<div className={style.buttonWrapper}>
{isRecording ? (
<Button variant="contained" color="primary" onClick={stopRecording}>
<StopIcon />
Stop
</Button>
) : (
<Button
variant="contained"
color="primary"
onClick={startRecording}
style={{ marginRight: "20px" }}
>
<MicIcon />
Record
</Button>
)}
</div>
<div className={style.playerWrapper}>
2023-05-24 20:27:57 +00:00
{/* canPlay && (
2023-02-13 12:41:30 +00:00
<AudioPlayer
elevation={0}
src={decodedValue}
variation="secondary"
volume={false}
useStyles={useStyles}
/>
2023-05-24 20:27:57 +00:00
) */}
2023-02-13 12:41:30 +00:00
</div>
</div>
</div>
);
};
export default MicInput;