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