import { useRef } from 'react'; import { IoChevronDown, IoChevronUp, IoDuplicateOutline, IoFolderOpenOutline, IoReorderTwo, IoTrash, } from 'react-icons/io5'; import { IconButton } from '@chakra-ui/react'; import { useSortable } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import { EntryId, OntimeBlock } from 'ontime-types'; import { useContextMenu } from '../../../common/hooks/useContextMenu'; import { useEntryActions } from '../../../common/hooks/useEntryAction'; import { cx, getAccessibleColour } from '../../../common/utils/styleUtils'; import { formatDuration, formatTime } from '../../../common/utils/time'; import EditableBlockTitle from '../common/EditableBlockTitle'; import { canDrop } from '../rundown.utils'; import style from './BlockBlock.module.scss'; interface BlockBlockProps { data: OntimeBlock; hasCursor: boolean; collapsed: boolean; onCollapse: (collapsed: boolean, groupId: EntryId) => void; } export default function BlockBlock(props: BlockBlockProps) { const { data, hasCursor, collapsed, onCollapse } = props; const handleRef = useRef(null); const { clone, ungroup, deleteEntry } = useEntryActions(); const [onContextMenu] = useContextMenu([ { label: 'Clone Block', icon: IoDuplicateOutline, onClick: () => clone(data.id), }, { label: 'Ungroup', icon: IoFolderOpenOutline, onClick: () => ungroup(data.id), isDisabled: data.events.length === 0, }, { label: 'Delete Block', icon: IoTrash, onClick: () => deleteEntry([data.id]), withDivider: true, }, ]); const { attributes: dragAttributes, listeners: dragListeners, setNodeRef, transform, transition, isDragging, isOver, over, } = useSortable({ id: data.id, data: { type: 'block', }, animateLayoutChanges: () => false, }); const binderColours = data.colour && getAccessibleColour(data.colour); const isValidDrop = over?.id && canDrop(over.data.current?.type, over.data.current?.parent); const dragStyle = { zIndex: isDragging ? 2 : 'inherit', transform: CSS.Translate.toString(transform), transition, cursor: isOver ? (isValidDrop ? 'grabbing' : 'no-drop') : 'default', }; return (
onCollapse(!collapsed, data.id)} color='#e2e2e2' // $gray-200 variant='ontime-ghosted' size='sm' > {collapsed ? : }
Start
{formatTime(data.startTime)}
End
{formatTime(data.endTime)}
Duration
{formatDuration(data.duration)}
Events
{data.events.length}
); }