Spaces:
Build error
Build error
import type { FC } from 'react' | |
import { useState } from 'react' | |
import { | |
RiMoreFill, | |
} from '@remixicon/react' | |
import { | |
PortalToFollowElem, | |
PortalToFollowElemContent, | |
PortalToFollowElemTrigger, | |
} from '@/app/components/base/portal-to-follow-elem' | |
export type Item = { | |
value: string | number | |
text: string | JSX.Element | |
} | |
type DropdownProps = { | |
items: Item[] | |
secondItems?: Item[] | |
onSelect: (item: Item) => void | |
renderTrigger?: (open: boolean) => React.ReactNode | |
popupClassName?: string | |
} | |
const Dropdown: FC<DropdownProps> = ({ | |
items, | |
onSelect, | |
secondItems, | |
renderTrigger, | |
popupClassName, | |
}) => { | |
const [open, setOpen] = useState(false) | |
const handleSelect = (item: Item) => { | |
setOpen(false) | |
onSelect(item) | |
} | |
return ( | |
<PortalToFollowElem | |
open={open} | |
onOpenChange={setOpen} | |
placement='bottom-end' | |
> | |
<PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}> | |
{ | |
renderTrigger | |
? renderTrigger(open) | |
: ( | |
<div | |
className={` | |
flex items-center justify-center w-6 h-6 cursor-pointer rounded-md | |
${open && 'bg-black/5'} | |
`} | |
> | |
<RiMoreFill className='w-4 h-4 text-gray-500' /> | |
</div> | |
) | |
} | |
</PortalToFollowElemTrigger> | |
<PortalToFollowElemContent className={popupClassName}> | |
<div className='rounded-lg border-[0.5px] border-gray-200 bg-white shadow-lg text-sm text-gray-700'> | |
{ | |
!!items.length && ( | |
<div className='p-1'> | |
{ | |
items.map(item => ( | |
<div | |
key={item.value} | |
className='flex items-center px-3 h-8 rounded-lg cursor-pointer hover:bg-gray-100' | |
onClick={() => handleSelect(item)} | |
> | |
{item.text} | |
</div> | |
)) | |
} | |
</div> | |
) | |
} | |
{ | |
(!!items.length && !!secondItems?.length) && ( | |
<div className='h-[1px] bg-gray-100' /> | |
) | |
} | |
{ | |
!!secondItems?.length && ( | |
<div className='p-1'> | |
{ | |
secondItems.map(item => ( | |
<div | |
key={item.value} | |
className='flex items-center px-3 h-8 rounded-lg cursor-pointer hover:bg-gray-100' | |
onClick={() => handleSelect(item)} | |
> | |
{item.text} | |
</div> | |
)) | |
} | |
</div> | |
) | |
} | |
</div> | |
</PortalToFollowElemContent> | |
</PortalToFollowElem> | |
) | |
} | |
export default Dropdown | |