12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 'use client'
- import React, { FC, useState } from 'react'
- import PortalToFollowElem from '../portal-to-follow-elem'
- import { ChevronDownIcon, CheckIcon } from '@heroicons/react/24/outline'
- import cn from 'classnames'
- export interface ISelectProps<T> {
- value: T
- items: { value: T, name: string }[]
- onChange: (value: T) => void
- }
- const Select: FC<ISelectProps<string | number>> = ({
- value,
- items,
- onChange
- }) => {
- const [controlHide, setControlHide] = useState(0)
- const itemsElement = items.map(item => {
- const isSelected = item.value === value
- return (
- <div
- key={item.value}
- className={cn('relative h-9 leading-9 px-10 rounded-lg text-sm text-gray-700 hover:bg-gray-100')}
- onClick={() => {
- onChange(item.value)
- setControlHide(Date.now())
- }}
- >
- {isSelected && (
- <div className='absolute left-4 top-1/2 translate-y-[-50%] flex items-center justify-center w-4 h-4 text-primary-600'>
- <CheckIcon width={16} height={16}></CheckIcon>
- </div>
- )}
- {item.name}
- </div>
- )
- })
- return (
- <div>
- <PortalToFollowElem
- portalElem={(
- <div
- className='p-1 rounded-lg bg-white cursor-pointer'
- style={{
- boxShadow: '0px 10px 15px -3px rgba(0, 0, 0, 0.1), 0px 4px 6px rgba(0, 0, 0, 0.05)'
- }}
- >
- {itemsElement}
- </div>
- )}
- controlHide={controlHide}
- >
- <div className='relative '>
- <div className='flex items-center h-9 px-3 gap-1 cursor-pointer hover:bg-gray-50'>
- <div className='text-sm text-gray-700'>{items.find(i => i.value === value)?.name}</div>
- <ChevronDownIcon width={16} height={16} />
- </div>
- {/* <div
- className='absolute z-50 left-0 top-9 p-1 w-[112px] rounded-lg bg-white'
- style={{
- boxShadow: '0px 10px 15px -3px rgba(0, 0, 0, 0.1), 0px 4px 6px rgba(0, 0, 0, 0.05)'
- }}
- >
- {itemsElement}
- </div> */}
- </div>
- </PortalToFollowElem>
- </div>
- )
- }
- export default React.memo(Select)
|