mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-13 13:22:57 +00:00
* api point works * upload api calls done, make better all components state changes, some asesthetic improvements * loading screens for the add video proccess * added and uploaded video now in the uiEvents for the Engine to listen and read --------- Co-authored-by: wil <wil@storyteller.ai>
70 lines
1.8 KiB
TypeScript
70 lines
1.8 KiB
TypeScript
import { useEffect, useRef, useState } from "react";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
import { VIDEO_STATE_STATUSES } from "./enum";
|
|
import { ButtonPlaypause } from "./ButtonPlayPause";
|
|
import { ButtonMute } from "./ButtonMute";
|
|
import { LabelTimeDuration } from "./LabelTimeDuration";
|
|
import { Spinner } from "~/components/ui";
|
|
|
|
export const VideoControls = ({
|
|
vidEl,
|
|
className,
|
|
}: {
|
|
vidEl: HTMLVideoElement | undefined;
|
|
className?: string;
|
|
}) => {
|
|
const prevVidEl = useRef<HTMLVideoElement | undefined>(undefined);
|
|
const [status, setStatus] = useState<VIDEO_STATE_STATUSES>(
|
|
VIDEO_STATE_STATUSES.INIT,
|
|
);
|
|
|
|
useEffect(() => {
|
|
// helper function for removing listenders
|
|
const handleLoadedmetadata = () => {
|
|
if (vidEl) {
|
|
setStatus(VIDEO_STATE_STATUSES.METADATA_LOADED);
|
|
prevVidEl.current = vidEl;
|
|
}
|
|
};
|
|
|
|
// DOM node referencs has changed
|
|
setStatus(VIDEO_STATE_STATUSES.INIT);
|
|
// if the node exist, attach the listener and its remover
|
|
vidEl?.addEventListener("loadedmetadata", handleLoadedmetadata);
|
|
return () => {
|
|
vidEl?.removeEventListener("loadedmetadata", handleLoadedmetadata);
|
|
};
|
|
}, [vidEl]);
|
|
|
|
useEffect(() => {
|
|
prevVidEl.current = vidEl;
|
|
}, []);
|
|
|
|
const wrapperClass = twMerge(
|
|
"flex w-full h-10 justify-center items-center gap-2",
|
|
className,
|
|
);
|
|
|
|
if (
|
|
status === VIDEO_STATE_STATUSES.METADATA_LOADED &&
|
|
vidEl &&
|
|
prevVidEl.current === vidEl
|
|
) {
|
|
return (
|
|
<div className={wrapperClass}>
|
|
<ButtonPlaypause vidEl={vidEl} />
|
|
<ButtonMute vidEl={vidEl} />
|
|
<LabelTimeDuration vidEl={vidEl} />
|
|
<div className="grow"></div>
|
|
</div>
|
|
);
|
|
}
|
|
return (
|
|
<div className={wrapperClass}>
|
|
<Spinner className="size-5" />
|
|
<span>Loading...</span>
|
|
</div>
|
|
);
|
|
};
|