| 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 |
|
|