| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import {OBJECT_TOOLBAR_INDEX} from '@/common/components/toolbar/ToolbarConfig';
|
| import Tooltip from '@/common/components/Tooltip';
|
| import useVideo from '@/common/components/video/editor/useVideo';
|
| import {isPlayingAtom, streamingStateAtom, toolbarTabIndex} from '@/demo/atoms';
|
| import {PauseFilled, PlayFilledAlt} from '@carbon/icons-react';
|
| import {useAtomValue} from 'jotai';
|
| import {useCallback, useEffect} from 'react';
|
|
|
| export default function PlaybackButton() {
|
| const tabIndex = useAtomValue(toolbarTabIndex);
|
| const streamingState = useAtomValue(streamingStateAtom);
|
| const isPlaying = useAtomValue(isPlayingAtom);
|
| const video = useVideo();
|
|
|
| const isDisabled =
|
| tabIndex === OBJECT_TOOLBAR_INDEX &&
|
| streamingState !== 'none' &&
|
| streamingState !== 'full';
|
|
|
| const handlePlay = useCallback(() => {
|
| video?.play();
|
| }, [video]);
|
|
|
| const handlePause = useCallback(() => {
|
| video?.pause();
|
| }, [video]);
|
|
|
| const handleClick = useCallback(() => {
|
| if (isDisabled) {
|
| return;
|
| }
|
| if (isPlaying) {
|
| handlePause();
|
| } else {
|
| handlePlay();
|
| }
|
| }, [isDisabled, isPlaying, handlePlay, handlePause]);
|
|
|
| useEffect(() => {
|
| const handleKey = (event: KeyboardEvent) => {
|
| const callback = {
|
| KeyK: handleClick,
|
| }[event.code];
|
| if (callback != null) {
|
| event.preventDefault();
|
| callback();
|
| }
|
| };
|
| document.addEventListener('keydown', handleKey);
|
| return () => {
|
| document.removeEventListener('keydown', handleKey);
|
| };
|
| }, [handleClick]);
|
|
|
| return (
|
| <Tooltip message={`${isPlaying ? 'Pause' : 'Play'} (k)`}>
|
| <button
|
| disabled={isDisabled}
|
| className={`group !rounded-full !w-10 !h-10 flex items-center justify-center ${getButtonStyles(isDisabled)}`}
|
| onClick={handleClick}>
|
| {isPlaying ? (
|
| <PauseFilled size={18} />
|
| ) : (
|
| <PlayFilledAlt
|
| size={18}
|
| className={!isDisabled ? 'group-hover:text-green-500' : ''}
|
| />
|
| )}
|
| </button>
|
| </Tooltip>
|
| );
|
| }
|
|
|
| function getButtonStyles(isDisabled: boolean): string {
|
| if (isDisabled) {
|
| return '!bg-gray-600 !text-graydark-700';
|
| }
|
| return `!text-black bg-white`;
|
| }
|
|
|