loading and redirecting front-end

This commit is contained in:
Sara
2023-11-13 18:33:24 +01:00
parent 14ebfa53a8
commit e98f1bf4bc
6 changed files with 77 additions and 31 deletions

View File

@@ -13,6 +13,7 @@ import ShareLink from "../shareLink";
import QRCode from "react-qr-code";
import TranscriptTitle from "../transcriptTitle";
import Player from "../player";
import WaveformLoading from "../waveformLoading";
type TranscriptDetails = {
params: {
@@ -83,9 +84,9 @@ export default function TranscriptDetails(details: TranscriptDetails) {
mediaDuration={transcript.response.duration}
/>
) : mp3.error || waveform.error ? (
"error loading this recording"
<div>"error loading this recording"</div>
) : (
"Loading Recording"
<WaveformLoading />
)}
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 grid-rows-2 lg:grid-rows-1 gap-2 lg:gap-4 h-full">
@@ -104,10 +105,17 @@ export default function TranscriptDetails(details: TranscriptDetails) {
summary={transcript.response.longSummary}
transcriptId={transcript.response.id}
/>
) : transcript.response.status == "processing" ? (
"Loading Transcript"
) : (
"error final summary"
<div className="flex flex-col h-full justify-center content-center">
{transcript.response.status == "processing" ? (
<p>Loading Transcript</p>
) : (
<p>
There was an error generating the final summary, please
come back later
</p>
)}
</div>
)}
</section>

View File

@@ -11,9 +11,12 @@ import { Topic } from "../../webSocketTypes";
import LiveTrancription from "../../liveTranscription";
import DisconnectedIndicator from "../../disconnectedIndicator";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faGear } from "@fortawesome/free-solid-svg-icons";
import { faGear, faSpinner } from "@fortawesome/free-solid-svg-icons";
import { lockWakeState, releaseWakeState } from "../../../../lib/wakeLock";
import { useRouter } from "next/navigation";
import Player from "../../player";
import useMp3 from "../../useMp3";
import WaveformLoading from "../../waveformLoading";
type TranscriptDetails = {
params: {
@@ -42,8 +45,10 @@ const TranscriptRecord = (details: TranscriptDetails) => {
const { audioDevices, getAudioStream } = useAudioDevice();
const [hasRecorded, setHasRecorded] = useState(false);
const [recordedTime, setRecordedTime] = useState(0);
const [startTime, setStartTime] = useState(0);
const [transcriptStarted, setTranscriptStarted] = useState(false);
const mp3 = useMp3(true, "");
const router = useRouter();
@@ -54,8 +59,6 @@ const TranscriptRecord = (details: TranscriptDetails) => {
useEffect(() => {
const statusToRedirect = ["ended", "error"];
console.log(webSockets.status, "hey");
console.log(transcript.response, "ho");
//TODO if has no topic and is error, get back to new
if (
@@ -80,16 +83,31 @@ const TranscriptRecord = (details: TranscriptDetails) => {
return (
<>
<Recorder
setStream={setStream}
onStop={() => {
setStream(null);
setHasRecorded(true);
webRTC?.send(JSON.stringify({ cmd: "STOP" }));
}}
getAudioStream={getAudioStream}
audioDevices={audioDevices}
/>
{webSockets.waveform && mp3.media ? (
<Player
topics={webSockets.topics || []}
useActiveTopic={useActiveTopic}
waveform={webSockets.waveform}
media={mp3.media}
mediaDuration={recordedTime}
/>
) : recordedTime ? (
<WaveformLoading />
) : (
<Recorder
setStream={setStream}
onStop={() => {
setStream(null);
setRecordedTime(Date.now() - startTime);
webRTC?.send(JSON.stringify({ cmd: "STOP" }));
}}
onRecord={() => {
setStartTime(Date.now());
}}
getAudioStream={getAudioStream}
audioDevices={audioDevices}
/>
)}
<div className="grid grid-cols-1 lg:grid-cols-2 grid-rows-mobile-inner lg:grid-rows-1 gap-2 lg:gap-4 h-full">
<TopicList
@@ -101,7 +119,7 @@ const TranscriptRecord = (details: TranscriptDetails) => {
<section
className={`w-full h-full bg-blue-400/20 rounded-lg md:rounded-xl p-2 md:px-4`}
>
{!hasRecorded ? (
{!recordedTime ? (
<>
{transcriptStarted && (
<h2 className="md:text-lg font-bold">Transcription</h2>
@@ -135,7 +153,7 @@ const TranscriptRecord = (details: TranscriptDetails) => {
couple of minutes. Please do not navigate away from the page
during this time.
</p>
{/* TODO If login required remove last sentence */}
{/* NTH If login required remove last sentence */}
</div>
)}
</section>

View File

@@ -87,7 +87,7 @@ export default function FinalSummary(props: FinalSummaryProps) {
<div
className={
(isEditMode ? "overflow-y-none" : "overflow-y-auto") +
" h-auto max-h-full flex flex-col h-full"
" max-h-full flex flex-col h-full"
}
>
<div className="flex flex-row flex-wrap-reverse justify-between items-center">

View File

@@ -14,11 +14,11 @@ import { waveSurferStyles } from "../../styles/recorder";
import { useError } from "../../(errors)/errorContext";
type RecorderProps = {
setStream?: React.Dispatch<React.SetStateAction<MediaStream | null>>;
onStop?: () => void;
getAudioStream?: (deviceId) => Promise<MediaStream | null>;
audioDevices?: Option[];
mediaDuration?: number | null;
setStream: React.Dispatch<React.SetStateAction<MediaStream | null>>;
onStop: () => void;
onRecord?: () => void;
getAudioStream: (deviceId) => Promise<MediaStream | null>;
audioDevices: Option[];
};
export default function Recorder(props: RecorderProps) {
@@ -94,7 +94,6 @@ export default function Recorder(props: RecorderProps) {
autoCenter: true,
barWidth: 2,
height: "auto",
duration: props.mediaDuration || 1,
...waveSurferStyles.player,
});
@@ -161,10 +160,10 @@ export default function Recorder(props: RecorderProps) {
setScreenMediaStream(null);
setDestinationStream(null);
} else {
if (props.onRecord) props.onRecord();
const stream = await getCurrentStream();
if (props.setStream) props.setStream(stream);
waveRegions?.clearRegions();
if (stream) {
await record.startRecording(stream);
setIsRecording(true);

View File

@@ -1,8 +1,8 @@
import { useContext, useEffect, useState } from "react";
import { Topic, FinalSummary, Status } from "./webSocketTypes";
import { useError } from "../../(errors)/errorContext";
import { useRouter } from "next/navigation";
import { DomainContext } from "../domainContext";
import { AudioWaveform } from "../../api";
export type UseWebSockets = {
transcriptText: string;
@@ -11,6 +11,7 @@ export type UseWebSockets = {
topics: Topic[];
finalSummary: FinalSummary;
status: Status;
waveform: AudioWaveform | null;
};
export const useWebSockets = (transcriptId: string | null): UseWebSockets => {
@@ -21,6 +22,7 @@ export const useWebSockets = (transcriptId: string | null): UseWebSockets => {
const [translationQueue, setTranslationQueue] = useState<string[]>([]);
const [isProcessing, setIsProcessing] = useState(false);
const [topics, setTopics] = useState<Topic[]>([]);
const [waveform, setWaveForm] = useState<AudioWaveform | null>(null);
const [finalSummary, setFinalSummary] = useState<FinalSummary>({
summary: "",
});
@@ -405,5 +407,13 @@ export const useWebSockets = (transcriptId: string | null): UseWebSockets => {
};
}, [transcriptId]);
return { transcriptText, translateText, topics, finalSummary, title, status };
return {
transcriptText,
translateText,
topics,
finalSummary,
title,
status,
waveform,
};
};

View File

@@ -0,0 +1,11 @@
import { faSpinner } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
export default () => (
<div className="flex flex-grow items-center justify-center h-20">
<FontAwesomeIcon
icon={faSpinner}
className="animate-spin-slow text-gray-600 flex-grow rounded-lg md:rounded-xl h-10"
/>
</div>
);