import React from "react" import { useStyletron } from "baseui" import { Block } from "baseui/block" import AngleDoubleLeft from "~/components/Icons/AngleDoubleLeft" import Scrollable from "~/components/Scrollable" import { useEditor } from "@layerhub-io/react" import useSetIsSidebarOpen from "~/hooks/useSetIsSidebarOpen" import useDesignEditorContext from "~/hooks/useDesignEditorContext" const loadVideoResource = (videoSrc: string): Promise => { return new Promise(function (resolve, reject) { var video = document.createElement("video") video.src = videoSrc video.crossOrigin = "anonymous" video.addEventListener("loadedmetadata", function (event) { video.currentTime = 1 }) video.addEventListener("seeked", function () { resolve(video) }) video.addEventListener("error", function (error) { reject(error) }) }) } const captureFrame = (video: HTMLVideoElement) => { return new Promise(function (resolve) { var canvas = document.createElement("canvas") as HTMLCanvasElement canvas.width = video.videoWidth canvas.height = video.videoHeight canvas.getContext("2d")!.drawImage(video, 0, 0, canvas.width, canvas.height) URL.revokeObjectURL(video.src) const data = canvas.toDataURL() fetch(data) .then((res) => { return res.blob() }) .then((blob) => { const url = URL.createObjectURL(blob) resolve(url) }) }) } const captureDuration = (video: HTMLVideoElement): Promise => { return new Promise((resolve) => { resolve(video.duration) }) } export default function () { const editor = useEditor() const setIsSidebarOpen = useSetIsSidebarOpen() const [videos, setVideos] = React.useState([]) const { scenes, setScenes, currentScene } = useDesignEditorContext() const loadPixabayVideos = async () => { // const videos = await getPixabayVideos("people") // setVideos(videos) } const loadPexelsVideos = async () => { // const videos = (await getPexelsVideos("people")) as any // setVideos(videos) } React.useEffect(() => { loadPexelsVideos() }, []) const addObject = React.useCallback( async (options: any) => { if (editor) { const video = await loadVideoResource(options.src) const frame = await captureFrame(video) const duration = await captureDuration(video) editor.objects.add({ ...options, duration, preview: frame }) const updatedScenes = scenes.map((scn) => { if (scn.id === currentScene?.id) { return { ...currentScene, duration: duration * 1000 > currentScene.duration! ? duration * 1000 : currentScene.duration!, } } return scn }) setScenes(updatedScenes) } }, [editor, scenes, currentScene] ) return ( Videos setIsSidebarOpen(false)} $style={{ cursor: "pointer", display: "flex" }}>
{videos.map((video, index) => { return addObject(video)} /> })}
) } function ImageItem({ preview, onClick }: { preview: any; onClick?: (option: any) => void }) { const [css] = useStyletron() return (
) }