/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import useListenToStreamingState from '@/common/components/toolbar/useListenToStreamingState'; import useToolbarTabs from '@/common/components/toolbar/useToolbarTabs'; import useVideo from '@/common/components/video/editor/useVideo'; import useVideoEffect from '@/common/components/video/editor/useVideoEffect'; import {EffectIndex} from '@/common/components/video/effects/Effects'; import useScreenSize from '@/common/screen/useScreenSize'; import { codeEditorOpenedAtom, isPlayingAtom, isStreamingAtom, } from '@/demo/atoms'; import {useAtom, useAtomValue, useSetAtom} from 'jotai'; import {useCallback, useEffect} from 'react'; import DesktopToolbar from './DesktopToolbar'; import MobileToolbar from './MobileToolbar'; import {OBJECT_TOOLBAR_INDEX} from './ToolbarConfig'; export default function Toolbar() { const [tabIndex, setTabIndex] = useToolbarTabs(); const video = useVideo(); const setIsPlaying = useSetAtom(isPlayingAtom); const [isStreaming, setIsStreaming] = useAtom(isStreamingAtom); const codeEditorOpened = useAtomValue(codeEditorOpenedAtom); const {isMobile} = useScreenSize(); const setEffect = useVideoEffect(); const resetEffects = useCallback(() => { setEffect('Original', EffectIndex.BACKGROUND, {variant: 0}); setEffect('Overlay', EffectIndex.HIGHLIGHT, {variant: 0}); }, [setEffect]); const handleStopVideo = useCallback(() => { if (isStreaming) { video?.abortStreamMasks(); } else { video?.pause(); } }, [video, isStreaming]); const handleTabChange = useCallback( (newIndex: number) => { if (newIndex === OBJECT_TOOLBAR_INDEX) { handleStopVideo(); resetEffects(); } setTabIndex(newIndex); }, [handleStopVideo, resetEffects, setTabIndex], ); useListenToStreamingState(); useEffect(() => { function onPlay() { setIsPlaying(true); } function onPause() { setIsPlaying(false); } video?.addEventListener('play', onPlay); video?.addEventListener('pause', onPause); return () => { video?.removeEventListener('play', onPlay); video?.removeEventListener('pause', onPause); }; }, [video, resetEffects, setIsStreaming, setIsPlaying]); if (codeEditorOpened) { return null; } return isMobile ? ( ) : ( ); }