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