|
import { useState } from 'react' |
|
import { ChevronDownIcon, ChevronRightIcon } from '@heroicons/react/24/outline' |
|
import classNames from '@/utils/classnames' |
|
|
|
export type IItem = { |
|
key: string |
|
name: string |
|
} |
|
type ICollapse = { |
|
title: string | undefined |
|
items: IItem[] |
|
renderItem: (item: IItem) => React.ReactNode |
|
onSelect?: (item: IItem) => void |
|
wrapperClassName?: string |
|
} |
|
const Collapse = ({ |
|
title, |
|
items, |
|
renderItem, |
|
onSelect, |
|
wrapperClassName, |
|
}: ICollapse) => { |
|
const [open, setOpen] = useState(false) |
|
|
|
const toggle = () => setOpen(!open) |
|
|
|
return ( |
|
<div className={classNames('border border-gray-200 bg-gray-50 rounded-lg', wrapperClassName)}> |
|
<div className='flex items-center justify-between leading-[18px] px-3 py-2 text-xs font-medium text-gray-800 cursor-pointer' onClick={toggle}> |
|
{title} |
|
{ |
|
open |
|
? <ChevronDownIcon className='w-3 h-3 text-gray-400' /> |
|
: <ChevronRightIcon className='w-3 h-3 text-gray-400' /> |
|
} |
|
</div> |
|
{ |
|
open && ( |
|
<div className='py-2 border-t border-t-gray-100'> |
|
{ |
|
items.map(item => ( |
|
<div key={item.key} onClick={() => onSelect && onSelect(item)}> |
|
{renderItem(item)} |
|
</div> |
|
)) |
|
} |
|
</div> |
|
) |
|
} |
|
</div> |
|
) |
|
} |
|
|
|
export default Collapse |
|
|