Merge branch 'master' into olivicmic-fy-faceanimator-media-links

This commit is contained in:
Victor Holguin committed 2023-10-19 23:27:48 -07:00
commit f9fca18e38
5 files changed
+96 -61

No files matched your search

@@ -17,6 +17,7 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
square?: boolean;
tooltip?: string;
full?: boolean;
iconFlip?: boolean;
}
export default function Button({
@@ -30,11 +31,14 @@ export default function Button({
square,
tooltip,
full = false,
iconFlip = false,
...rest
}: ButtonProps) {
let iconMarginClass = !square && label ? (iconFlip ? "ms-2" : "me-2") : "";
let IconComponent = icon ? (
<FontAwesomeIcon icon={icon} className={!square && label ? "me-2" : ""} />
<FontAwesomeIcon icon={icon} className={iconMarginClass} />
) : null;
let LabelComponent = !square ? label : null;
const externalClass = rest.className || "";
@@ -47,7 +51,12 @@ export default function Button({
delete rest.className;
const ButtonContent = (
const ButtonContent = iconFlip ? (
<>
{LabelComponent}
{IconComponent}
</>
) : (
<>
{IconComponent}
{LabelComponent}
@@ -310,6 +310,15 @@ styles with important tags:
box-shadow: none !important;
}
.video-bg {
background-color: $black;
}
.panel-border {
border-color: #ffffff12 !important;
border: 1px solid;
}
.panel-inner {
background-color: lighten($panel, 4%);
}
@@ -510,7 +519,7 @@ styles with important tags:
box-shadow: none;
}
.panel-border {
.pricing-border {
box-sizing: border-box;
box-shadow: inset 0px 0px 0px 3px $primary;
}
@@ -2,9 +2,14 @@ import React from "react";
import WaveSurfer from "wavesurfer.js";
import { useEffect, useState } from "react";
import { BucketConfig } from "@storyteller/components/src/api/BucketConfig";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faPlay, faPause } from "@fortawesome/pro-solid-svg-icons";
import {
faPlay,
faPause,
faRepeat,
faArrowRight,
} from "@fortawesome/pro-solid-svg-icons";
import { MediaFile } from "@storyteller/components/src/api/media_files/GetMediaFile";
import Button from "components/common/Button";
enum PlaybackSpeed {
HALF,
@@ -26,13 +31,12 @@ export default function MediaAudioPlayer({ mediaFile }: MediaAudioPlayerProps) {
const wavesurferInstance = WaveSurfer.create({
container: "#waveform", // Previousy I used 'this.ref.current' and React.createRef()
height: 200,
responsive: true,
waveColor: "#cbcbcb",
progressColor: "#fc8481",
cursorColor: "#fc6b68",
cursorWidth: 2,
normalize: false,
normalize: true,
});
setWaveSurfer(wavesurferInstance);
@@ -93,20 +97,12 @@ export default function MediaAudioPlayer({ mediaFile }: MediaAudioPlayerProps) {
setPlaybackSpeed(nextSpeed);
};
let playButtonText = (
<>
<FontAwesomeIcon icon={faPlay} />
</>
);
let playButtonIcon = faPlay;
if (isPlaying) {
playButtonText = (
<>
<FontAwesomeIcon icon={faPause} />
</>
);
playButtonIcon = faPause;
}
let repeatButtonText = isRepeating ? "Repeat" : "NoRepeat";
let repeatButtonIcon = isRepeating ? faRepeat : faArrowRight;
let speedButtonText = "1x";
switch (playbackSpeed) {
@@ -117,33 +113,34 @@ export default function MediaAudioPlayer({ mediaFile }: MediaAudioPlayerProps) {
speedButtonText = "2x";
break;
case PlaybackSpeed.HALF:
speedButtonText = "1/2x";
speedButtonText = "0.5x";
break;
}
return (
<div>
<div id="waveform"></div>
<div className="d-flex gap-4 flex-column justify-content-center align-items-center mt-4">
<div className="d-flex gap-2">
<button className="btn btn-primary" onClick={() => togglePlayPause()}>
{playButtonText}
</button>
<div className="d-flex justify-content-center gap-2 mt-3">
<Button
square={true}
icon={playButtonIcon}
onClick={() => togglePlayPause()}
/>
<button
className="btn btn-secondary"
onClick={() => toggleIsRepeating()}
>
{repeatButtonText}
</button>
<Button
tooltip="Toggle Repeat"
variant="secondary"
square={true}
icon={repeatButtonIcon}
onClick={() => toggleIsRepeating()}
/>
<button
className="btn btn-secondary"
onClick={() => togglePlaybackSpeed()}
>
{speedButtonText}
</button>
</div>
<Button
tooltip="Speed"
label={speedButtonText}
variant="secondary"
onClick={() => togglePlaybackSpeed()}
/>
</div>
</div>
);
@@ -61,24 +61,39 @@ export default function MediaPage({ sessionWrapper }: MediaPageProps) {
switch (mediaFile.media_type) {
case MediaFileType.Audio:
return (
<div className="panel p-3 p-lg-4 d-flex flex-column gap-4 rounded">
<div className="panel p-3 p-lg-4 d-flex flex-column">
{/* Voice model name that is used to generate the audio */}
<h3 className="fw-bold mb-4">[Voice Model Name]</h3>
<MediaAudioComponent mediaFile={mediaFile} />
<div>
<h5 className="fw-semibold">
<FontAwesomeIcon icon={faSquareQuote} className="me-2" />
Audio Text
</h5>
{/*<p>{mediaFile?.audio_text && mediaFile.audio_text}</p>*/}
</div>
{/* Show TTS text input if it is a TTS result */}
{mediaFile.public_bucket_path.includes("tts_inference_output") && (
<div className="mt-4">
<h5 className="fw-semibold">
<FontAwesomeIcon icon={faSquareQuote} className="me-2" />
Audio Text
</h5>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Pellentesque elit ullamcorper dignissim cras tincidunt
lobortis. Integer malesuada nunc vel risus commodo viverra
maecenas accumsan lacus.
</p>
</div>
)}
</div>
);
case MediaFileType.Video:
return (
<div className="panel panel-clear">
<div className="ratio ratio-16x9">
<MediaVideoComponent mediaFile={mediaFile} />
<>
<div className="panel panel-clear">
<div className="ratio ratio-16x9 video-bg panel-border rounded">
<MediaVideoComponent mediaFile={mediaFile} />
</div>
</div>
</div>
</>
);
case MediaFileType.Image:
@@ -187,24 +202,26 @@ export default function MediaPage({ sessionWrapper }: MediaPageProps) {
},
];
const imageDetails = [
{ property: "Type", value: mediaFile.media_type },
{ property: "Created at", value: mediaFile.created_at.toString() },
{
property: "Visibility",
value: mediaFile.creator_set_visibility.toString(),
},
];
let mediaDetails = undefined;
switch (mediaFile.media_type) {
case MediaFileType.Audio:
mediaDetails = (
<Accordion.Item title="Audio Details" defaultOpen={true}>
<DataTable data={audioDetails} />
</Accordion.Item>
);
mediaDetails = <DataTable data={audioDetails} />;
break;
case MediaFileType.Video:
mediaDetails = (
<Accordion.Item title="Video Details" defaultOpen={true}>
<DataTable data={videoDetails} />
</Accordion.Item>
);
mediaDetails = <DataTable data={videoDetails} />;
break;
case MediaFileType.Image:
mediaDetails = <DataTable data={imageDetails} />;
break;
default:
}
@@ -307,7 +324,10 @@ export default function MediaPage({ sessionWrapper }: MediaPageProps) {
</div>
<Accordion>
{mediaDetails}
<Accordion.Item title="Video Details" defaultOpen={true}>
{mediaDetails}
</Accordion.Item>
{modMediaDetails}
</Accordion>
</div>
@@ -143,7 +143,7 @@ function PricingPage(props: Props) {
// Highlight the mid-tier plan if nothing is subscribed
if (!userHasPaidPremium) {
proBorderCss = "rounded panel p-4 h-100 panel-border";
proBorderCss = "rounded panel p-4 h-100 pricing-border";
}
return (