123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- 'use client'
- import type { FC } from 'react'
- import React, { useEffect } from 'react'
- import cn from 'classnames'
- import { useBoolean } from 'ahooks'
- import { ChevronRightIcon } from '@heroicons/react/24/outline'
- export type 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<IPanelProps> = ({
- className,
- headerIcon,
- title,
- headerRight,
- bodyClassName,
- children,
- keepUnFold,
- foldDisabled = false,
- onFoldChange,
- controlUnFold,
- controlFold,
- }) => {
- const [fold, { setTrue: setFold, setFalse: setUnFold, toggle: toggleFold }] = useBoolean(!keepUnFold)
- useEffect(() => {
- onFoldChange?.(fold)
- }, [fold])
- useEffect(() => {
- if (controlUnFold)
- setUnFold()
- }, [controlUnFold])
- useEffect(() => {
- if (controlFold)
- setFold()
- }, [controlFold])
- // overflow-hidden
- return (
- <div className={cn(className, 'w-full rounded-xl border border-gray-100 overflow-hidden select-none')}>
- {/* Header */}
- <div
- onClick={() => (!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')}>
- <div className='flex items-center gap-2'>
- {headerIcon}
- <div className='text-gray-900 text-sm'>{title}</div>
- </div>
- {(fold && headerRight) ? headerRight : ''}
- {!headerRight && !keepUnFold && (
- <ChevronRightIcon className={cn(!fold && 'rotate-90', 'mr-2 cursor-pointer')} width="16" height="16">
- </ChevronRightIcon>
- )}
- </div>
- {/* Main Content */}
- {!fold && !foldDisabled && (
- <div className={cn(bodyClassName)}>
- {children}
- </div>
- )}
- </div>
- )
- }
- export default React.memo(Panel)
|