'use client' import React, { FC, useEffect } from 'react' import cn from 'classnames' import { useBoolean } from 'ahooks' import { ChevronRightIcon } from '@heroicons/react/24/outline' export interface IPanelProps { className?: string headerIcon: React.ReactNode title: React.ReactNode headerRight?: React.ReactNode bodyClassName?: string children: React.ReactNode keepUnFold?: boolean foldDisabled?: boolean onFoldChange?: (fold: boolean) => void controlUnFold?: number controlFold?: number } const Panel: FC = ({ className, headerIcon, title, headerRight, bodyClassName, children, keepUnFold, foldDisabled = false, onFoldChange, controlUnFold, controlFold }) => { const [fold, { setTrue: setFold, setFalse: setUnFold, toggle: toggleFold }] = useBoolean(keepUnFold ? false : true) useEffect(() => { onFoldChange?.(fold) }, [fold]) useEffect(() => { if (controlUnFold) { setUnFold() } }, [controlUnFold]) useEffect(() => { if (controlFold) { setFold() } }, [controlFold]) // overflow-hidden return (
{/* Header */}
(!foldDisabled && !keepUnFold) && toggleFold()} className={cn(!fold && 'border-b border-gray-100', 'flex justify-between items-center h-12 bg-gray-50 pl-4 pr-2')}>
{headerIcon}
{title}
{(fold && headerRight) ? headerRight : ''} {!headerRight && !keepUnFold && ( )}
{/* Main Content */} {!fold && !foldDisabled && (
{children}
)}
) } export default React.memo(Panel)