import React, { useCallback, useMemo, useState } from 'react'; import { Fade } from '@mui/material'; import { BeginDragCallback } from '../SplitPane/hooks/effects/useDragState'; import { ButtonContainer, ButtonWrapper, getSizeWithUnit, ResizeGrabber, ResizePresentation, } from './helpers'; import { useMergeClasses } from '../../hooks/useMergeClasses'; import { CollapseOptions, ResizerOptions } from '../SplitPane'; import { useTransition } from './hooks/useTransition'; import { SplitType } from '../SplitPane'; import { debounce } from '../SplitPane/helpers'; const defaultResizerOptions: Required = { grabberSize: '1rem', css: { backgroundColor: 'rgba(120, 120, 120, 0.3)' }, hoverCss: { backgroundColor: 'rgba(120, 120, 120, 0.6)' }, }; export interface ResizerProps { isVertical: boolean; isLtr: boolean; split: SplitType; className?: string; paneIndex: number; collapseOptions?: CollapseOptions; resizerOptions?: Partial; onDragStarted: BeginDragCallback; onCollapseToggle: (paneIndex: number) => void; isCollapsed: boolean; } export const Resizer = ({ isVertical, split, className, paneIndex, onDragStarted, resizerOptions, collapseOptions, onCollapseToggle, isLtr, isCollapsed, }: ResizerProps) => { const { grabberSize, css, hoverCss } = { ...defaultResizerOptions, ...resizerOptions }; const classes = useMergeClasses(['Resizer', split, className]); const grabberSizeWithUnit = useMemo(() => getSizeWithUnit(grabberSize), [grabberSize]); const Transition = useTransition(collapseOptions); const [isHovered, setIsHovered] = useState(false); const handleMouseDown = useCallback( (event: React.MouseEvent) => { event.preventDefault(); if (!isCollapsed) { onDragStarted({ index: paneIndex, position: event }); } }, [paneIndex, isCollapsed, onDragStarted] ); const handleTouchStart = useCallback( (event: React.TouchEvent) => { event.preventDefault(); if (!isCollapsed) { onDragStarted({ index: paneIndex, position: event.touches[0] }); } }, [paneIndex, isCollapsed, onDragStarted] ); const handleButtonClick = useCallback( (event: React.MouseEvent) => { event.stopPropagation(); onCollapseToggle(paneIndex); }, [paneIndex, onCollapseToggle] ); const handleButtonMousedown = useCallback((event: React.MouseEvent) => { event.stopPropagation(); }, []); const debouncedSetHovered = useCallback( debounce(() => setIsHovered(true), 50), [setIsHovered] ); const handleMouseEnterGrabber = useCallback(() => { debouncedSetHovered(); }, [debouncedSetHovered]); const debouncedSetNotHovered = useCallback( debounce(() => setIsHovered(false), 100), [setIsHovered] ); const handleMouseLeaveGrabber = useCallback(() => debouncedSetNotHovered(), [ debouncedSetNotHovered, ]); const getWidthOrHeight = useCallback( (size: string | number) => (isVertical ? { width: size } : { height: size }), [isVertical] ); const preButtonFlex = useMemo( () => Math.max(100 - (collapseOptions?.buttonPositionOffset ?? 0), 0), [collapseOptions] ); const postButtonFlex = useMemo( () => Math.max(100 + (collapseOptions?.buttonPositionOffset ?? 0), 0), [collapseOptions] ); const isTransition = collapseOptions?.buttonTransition !== 'none'; const collapseButton = collapseOptions ? (
{isCollapsed ? collapseOptions.afterToggleButton : collapseOptions.beforeToggleButton}
) : null; return (
{collapseButton}
); }; Resizer.displayName = 'Resizer';