diff --git a/packages/fakeyou.com/src/components/common/Accordion/Accordion.tsx b/packages/fakeyou.com/src/components/common/Accordion/Accordion.tsx index 0b37834dea..206b841044 100644 --- a/packages/fakeyou.com/src/components/common/Accordion/Accordion.tsx +++ b/packages/fakeyou.com/src/components/common/Accordion/Accordion.tsx @@ -39,17 +39,24 @@ function AccordionItem({ ) as AccordionContextType; const isOpen = openItems.includes(title); - const [contentHeight, setContentHeight] = useState( - isOpen ? undefined : 0 + const [contentHeight, setContentHeight] = useState( + defaultOpen ? 0 : 0 ); const contentRef = useRef(null); - // Update content height when content changes useEffect(() => { + // Update content height whenever the accordion item is opened or closed + if (contentRef.current) { + setContentHeight(isOpen ? contentRef.current.scrollHeight : 0); + } + }, [isOpen]); + + useEffect(() => { + // Adjust height when the content changes, only if the item is open if (isOpen && contentRef.current) { setContentHeight(contentRef.current.scrollHeight); } - }, [children, isOpen]); // Dependency on children and isOpen + }, [children, isOpen]); const heightProps = useSpring({ height: isOpen ? `${contentHeight}px` : "0px", diff --git a/packages/fakeyou.com/src/v2/view/pages/weights/inference_panels/TtsInferencePanel.tsx b/packages/fakeyou.com/src/v2/view/pages/weights/inference_panels/TtsInferencePanel.tsx new file mode 100644 index 0000000000..886bfdb6dd --- /dev/null +++ b/packages/fakeyou.com/src/v2/view/pages/weights/inference_panels/TtsInferencePanel.tsx @@ -0,0 +1,127 @@ +import React, { useState } from "react"; +import { faDeleteLeft } from "@fortawesome/pro-solid-svg-icons"; +import Panel from "components/common/Panel/Panel"; +import { SessionSubscriptionsWrapper } from "@storyteller/components/src/session/SessionSubscriptionsWrapper"; +import TextArea from "components/common/TextArea"; +import { Button } from "components/common"; +import { + FrontendInferenceJobType, + InferenceJob, +} from "@storyteller/components/src/jobs/InferenceJob"; +import { TtsInferenceJob } from "@storyteller/components/src/jobs/TtsInferenceJobs"; +import { faVolumeUp } from "@fortawesome/free-solid-svg-icons"; +import useVoiceRequests from "../../voice_designer/useVoiceRequests"; +import { v4 as uuidv4 } from "uuid"; +import Accordion from "components/common/Accordion"; +import { SessionVoiceDesignerInferenceResultsList } from "v2/view/_common/SessionVoiceDesignerInferenceResultsList"; + +interface TtsInferencePanelProps { + sessionSubscriptionsWrapper: SessionSubscriptionsWrapper; + inferenceJobs: Array; + ttsInferenceJobs: Array; + enqueueInferenceJob: ( + jobToken: string, + frontendInferenceJobType: FrontendInferenceJobType + ) => void; + inferenceJobsByCategory: Map>; + voiceToken: string; +} + +export default function TtsInferencePanel({ + inferenceJobs, + sessionSubscriptionsWrapper, + ttsInferenceJobs, + enqueueInferenceJob, + inferenceJobsByCategory, + voiceToken, +}: TtsInferencePanelProps) { + const [textBuffer, setTextBuffer] = useState(""); + const { inference } = useVoiceRequests({}); + const [isEnqueuing, setIsEnqueuing] = useState(false); + + const handleEnqueueTts = () => { + setIsEnqueuing(true); + inference + .enqueue("", { + uuid_idempotency_token: uuidv4(), + text: textBuffer, + voice_token: voiceToken, + }) + .then((res: any) => { + if (res && res.success) { + enqueueInferenceJob( + res.inference_job_token, + FrontendInferenceJobType.TextToSpeech + ); + } + }) + .catch(error => { + console.error("Error enqueuing TTS:", error); + }) + .finally(() => { + setIsEnqueuing(false); + }); + }; + + const handleChangeText = (ev: React.FormEvent) => { + const textValue = (ev.target as HTMLTextAreaElement).value; + setTextBuffer(textValue); + }; + + const handleClearText = () => { + setTextBuffer(""); + }; + + return ( + +
+
+

Generate TTS

+