mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2025-12-20 20:29:06 +00:00
ADditional features
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import React, { useRef, useEffect } from 'react';
|
import React, { useRef, useEffect } from 'react';
|
||||||
|
|
||||||
function AudioVisualizer() {
|
function AudioVisualizer(props) {
|
||||||
const canvasRef = useRef(null);
|
const canvasRef = useRef(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -29,6 +29,8 @@ function AudioVisualizer() {
|
|||||||
analyser.getByteFrequencyData(dataArray);
|
analyser.getByteFrequencyData(dataArray);
|
||||||
context.fillStyle = '#000';
|
context.fillStyle = '#000';
|
||||||
context.fillRect(0, 0, canvas.width, canvas.height);
|
context.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
|
||||||
for (let i = 0; i < bufferLength; i++) {
|
for (let i = 0; i < bufferLength; i++) {
|
||||||
barHeight = dataArray[i];
|
barHeight = dataArray[i];
|
||||||
|
|
||||||
@@ -49,7 +51,10 @@ function AudioVisualizer() {
|
|||||||
return () => cancelAnimationFrame(animationFrameId);
|
return () => cancelAnimationFrame(animationFrameId);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return <canvas className='w-full h-16' ref={canvasRef} />;
|
return <>
|
||||||
|
<p>Is recording: {props.isRecording ? "true" : "false"}</p>
|
||||||
|
<canvas className='w-full h-16' ref={canvasRef} />
|
||||||
|
</>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default AudioVisualizer;
|
export default AudioVisualizer;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { Mulberry32 } from '../utils.js'
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import AudioVisualizer from './audioVisualizer.js';
|
import AudioVisualizer from './audioVisualizer.js';
|
||||||
|
|
||||||
export function Dashboard()
|
export function Dashboard(props)
|
||||||
{
|
{
|
||||||
const [openIndex, setOpenIndex] = useState(null);
|
const [openIndex, setOpenIndex] = useState(null);
|
||||||
const [liveTranscript, setLiveTranscript] = useState("");
|
const [liveTranscript, setLiveTranscript] = useState("");
|
||||||
@@ -107,7 +107,15 @@ export function Dashboard()
|
|||||||
{liveTranscript}
|
{liveTranscript}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<AudioVisualizer />
|
<AudioVisualizer isRecording={props.isRecording} />
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={() => props.onRecord(!props.isRecording)}
|
||||||
|
className={`px-4 py-2 mb-4 text-2xl font-bold rounded ${props.isRecording ? 'bg-red-500' : 'bg-blue-500'}`}
|
||||||
|
>
|
||||||
|
{props.isRecording ? 'STOP' : 'RESUME'}
|
||||||
|
</button>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
25
app/page.js
25
app/page.js
@@ -11,24 +11,35 @@ const App = () => {
|
|||||||
|
|
||||||
|
|
||||||
const handleRecord = (recording) => {
|
const handleRecord = (recording) => {
|
||||||
|
console.log("handleRecord", recording);
|
||||||
|
|
||||||
setIsRecording(recording);
|
setIsRecording(recording);
|
||||||
setSplashScreen(false);
|
setSplashScreen(false);
|
||||||
|
|
||||||
|
if (recording)
|
||||||
|
{
|
||||||
|
navigator.mediaDevices.getUserMedia({ audio: true })
|
||||||
|
.then(setStream)
|
||||||
|
.catch(err => console.error(err));
|
||||||
|
} else if (!recording) {
|
||||||
|
if (stream) {
|
||||||
|
const tracks = stream.getTracks();
|
||||||
|
tracks.forEach(track => track.stop());
|
||||||
|
setStream(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
setIsRecording(false);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const [stream, setStream] = useState(null);
|
const [stream, setStream] = useState(null);
|
||||||
const serverData = useWebRTC(stream);
|
const serverData = useWebRTC(stream);
|
||||||
console.log(serverData);
|
console.log(serverData);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
navigator.mediaDevices.getUserMedia({ audio: true })
|
|
||||||
.then(setStream)
|
|
||||||
.catch(err => console.error(err));
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
|
<div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
|
||||||
{splashScreen && <Record isRecording={isRecording} onRecord={(recording) => handleRecord(recording)} /> }
|
{splashScreen && <Record isRecording={isRecording} onRecord={(recording) => handleRecord(recording)} /> }
|
||||||
{!splashScreen && <Dashboard />}
|
{!splashScreen && <Dashboard isRecording={isRecording} onRecord={(recording) => handleRecord(recording)} />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user