Files
bot/apps/builder/src/components/DropdownList.tsx

69 lines
1.8 KiB
TypeScript
Raw Normal View History

2022-01-15 17:30:20 +01:00
import {
Button,
chakra,
2022-01-15 17:30:20 +01:00
Menu,
MenuButton,
MenuButtonProps,
MenuItem,
MenuList,
Portal,
2022-01-15 17:30:20 +01:00
Stack,
} from '@chakra-ui/react'
import { ChevronLeftIcon } from '@/components/icons'
2022-05-13 09:18:25 -07:00
import React, { ReactNode } from 'react'
2022-01-15 17:30:20 +01:00
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Props<T extends readonly any[]> = {
currentItem: T[number] | undefined
onItemSelect: (item: T[number]) => void
items: T
placeholder?: string
2022-01-15 17:30:20 +01:00
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const DropdownList = <T extends readonly any[]>({
2022-01-15 17:30:20 +01:00
currentItem,
onItemSelect,
items,
placeholder = '',
2022-01-15 17:30:20 +01:00
...props
}: Props<T> & MenuButtonProps) => {
const handleMenuItemClick = (operator: T[number]) => () => {
2022-01-15 17:30:20 +01:00
onItemSelect(operator)
}
return (
<Menu isLazy placement="bottom-end" matchWidth>
<MenuButton
as={Button}
rightIcon={<ChevronLeftIcon transform={'rotate(-90deg)'} />}
colorScheme="gray"
justifyContent="space-between"
textAlign="left"
{...props}
>
2022-06-18 07:58:51 +02:00
<chakra.span noOfLines={1} display="block">
2022-05-13 09:18:25 -07:00
{(currentItem ?? placeholder) as unknown as ReactNode}
</chakra.span>
</MenuButton>
<Portal>
<MenuList maxW="500px" zIndex={1500}>
<Stack maxH={'35vh'} overflowY="scroll" spacing="0">
{items.map((item) => (
<MenuItem
key={item as unknown as string}
maxW="500px"
overflow="hidden"
whiteSpace="nowrap"
textOverflow="ellipsis"
onClick={handleMenuItemClick(item)}
>
2022-05-13 09:18:25 -07:00
{item as unknown as ReactNode}
</MenuItem>
))}
</Stack>
</MenuList>
</Portal>
</Menu>
2022-01-15 17:30:20 +01:00
)
}