import React, { useContext, ReactChild, useState, useCallback } from 'react'; import { useTimeoutFn } from 'react-use'; import classnames from 'classnames'; import { PlayroomProps } from '../Playroom'; import { StoreContext, EditorPosition } from '../../StoreContext/StoreContext'; import FramesPanel from '../FramesPanel/FramesPanel'; import PreviewPanel from '../PreviewPanel/PreviewPanel'; import Snippets from '../Snippets/Snippets'; import ToolbarItem from '../ToolbarItem/ToolbarItem'; import AddIcon from '../icons/AddIcon'; import FramesIcon from '../icons/FramesIcon'; import EditorUndockedIcon from '../icons/EditorUndockedIcon'; import EditorBottomIcon from '../icons/EditorBottomIcon'; import EditorRightIcon from '../icons/EditorRightIcon'; import ShareIcon from '../icons/ShareIcon'; import PlayIcon from '../icons/PlayIcon'; // @ts-ignore import styles from './Toolbar.less'; interface Props { themes: PlayroomProps['themes']; widths: PlayroomProps['widths']; snippets: PlayroomProps['snippets']; } interface Icon { component: ReactChild; title: string; } const positionIcon: Record = { undocked: { component: , title: 'Undock into separate window ', }, right: { component: , title: 'Dock to right', }, bottom: { component: , title: 'Dock to bottom', }, }; export default ({ themes: allThemes, widths: allWidths, snippets }: Props) => { const [ { visibleThemes = [], visibleWidths = [], editorPosition, activeToolbarPanel, validCursorPosition, code, }, dispatch, ] = useContext(StoreContext); const [copying, setCopying] = useState(false); const [isReady, cancel, reset] = useTimeoutFn(() => setCopying(false), 3000); const copyHandler = useCallback(() => { dispatch({ type: 'copyToClipboard', payload: { url: window.location.href, trigger: 'toolbarItem' }, }); setCopying(true); if (isReady() === false) { cancel(); } reset(); }, [cancel, dispatch, isReady, reset]); const isSnippetsOpen = activeToolbarPanel === 'snippets'; const isFramesOpen = activeToolbarPanel === 'frames'; const isPositionOpen = activeToolbarPanel === 'positions'; const isPreviewOpen = activeToolbarPanel === 'preview'; const hasSnippets = snippets && snippets.length > 0; const hasFilteredFrames = visibleThemes.length > 0 || visibleWidths.length > 0; const isOpen = Boolean(activeToolbarPanel); return (
{isOpen && (
dispatch({ type: 'closeToolbar' })} /> )}
{hasSnippets && ( { dispatch({ type: 'toggleToolbar', payload: { panel: 'snippets' }, }); }} > )} { dispatch({ type: 'toggleToolbar', payload: { panel: 'frames' }, }); }} data-testid="toggleFrames" > { dispatch({ type: 'toggleToolbar', payload: { panel: 'preview' }, }); }} data-testid="togglePreview" >
dispatch({ type: 'toggleToolbar', payload: { panel: 'positions' }, }) } > {positionIcon[editorPosition].component}
dispatch({ type: 'closeToolbar' })} > {Object.keys(positionIcon) .filter((pos) => pos !== editorPosition) .map((pos) => { const position = pos as EditorPosition; return position === 'undocked' ? null : ( ); })}
{isSnippetsOpen && ( )}
); };