| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 'use client' | 
					
						
							|  |  |  | import type { FC } from 'react' | 
					
						
							|  |  |  | import React, { Fragment, useEffect, useState } from 'react' | 
					
						
							|  |  |  | import { Combobox, Listbox, Transition } from '@headlessui/react' | 
					
						
							| 
									
										
										
										
											2024-06-12 17:46:53 +08:00
										 |  |  | import { CheckIcon, ChevronDownIcon, ChevronUpIcon, XMarkIcon } from '@heroicons/react/20/solid' | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | import { useTranslation } from 'react-i18next' | 
					
						
							| 
									
										
										
										
											2024-07-09 15:05:40 +08:00
										 |  |  | import classNames from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2023-11-08 13:03:42 +08:00
										 |  |  | import { | 
					
						
							|  |  |  |   PortalToFollowElem, | 
					
						
							|  |  |  |   PortalToFollowElemContent, | 
					
						
							|  |  |  |   PortalToFollowElemTrigger, | 
					
						
							|  |  |  | } from '@/app/components/base/portal-to-follow-elem' | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const defaultItems = [ | 
					
						
							|  |  |  |   { value: 1, name: 'option1' }, | 
					
						
							|  |  |  |   { value: 2, name: 'option2' }, | 
					
						
							|  |  |  |   { value: 3, name: 'option3' }, | 
					
						
							|  |  |  |   { value: 4, name: 'option4' }, | 
					
						
							|  |  |  |   { value: 5, name: 'option5' }, | 
					
						
							|  |  |  |   { value: 6, name: 'option6' }, | 
					
						
							|  |  |  |   { value: 7, name: 'option7' }, | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export type Item = { | 
					
						
							|  |  |  |   value: number | string | 
					
						
							|  |  |  |   name: string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export type ISelectProps = { | 
					
						
							|  |  |  |   className?: string | 
					
						
							|  |  |  |   wrapperClassName?: string | 
					
						
							|  |  |  |   items?: Item[] | 
					
						
							|  |  |  |   defaultValue?: number | string | 
					
						
							|  |  |  |   disabled?: boolean | 
					
						
							|  |  |  |   onSelect: (value: Item) => void | 
					
						
							|  |  |  |   allowSearch?: boolean | 
					
						
							|  |  |  |   bgClassName?: string | 
					
						
							|  |  |  |   placeholder?: string | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  |   overlayClassName?: string | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |   optionClassName?: string | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | const Select: FC<ISelectProps> = ({ | 
					
						
							|  |  |  |   className, | 
					
						
							|  |  |  |   items = defaultItems, | 
					
						
							|  |  |  |   defaultValue = 1, | 
					
						
							|  |  |  |   disabled = false, | 
					
						
							|  |  |  |   onSelect, | 
					
						
							|  |  |  |   allowSearch = true, | 
					
						
							|  |  |  |   bgClassName = 'bg-gray-100', | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  |   overlayClassName, | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |   optionClassName, | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | }) => { | 
					
						
							|  |  |  |   const [query, setQuery] = useState('') | 
					
						
							|  |  |  |   const [open, setOpen] = useState(false) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const [selectedItem, setSelectedItem] = useState<Item | null>(null) | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     let defaultSelect = null | 
					
						
							|  |  |  |     const existed = items.find((item: Item) => item.value === defaultValue) | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  |     if (existed) | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |       defaultSelect = existed | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     setSelectedItem(defaultSelect) | 
					
						
							|  |  |  |   }, [defaultValue]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const filteredItems: Item[] | 
					
						
							|  |  |  |     = query === '' | 
					
						
							|  |  |  |       ? items | 
					
						
							|  |  |  |       : items.filter((item) => { | 
					
						
							|  |  |  |         return item.name.toLowerCase().includes(query.toLowerCase()) | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <Combobox | 
					
						
							|  |  |  |       as="div" | 
					
						
							|  |  |  |       disabled={disabled} | 
					
						
							|  |  |  |       value={selectedItem} | 
					
						
							|  |  |  |       className={className} | 
					
						
							|  |  |  |       onChange={(value: Item) => { | 
					
						
							|  |  |  |         if (!disabled) { | 
					
						
							|  |  |  |           setSelectedItem(value) | 
					
						
							|  |  |  |           setOpen(false) | 
					
						
							|  |  |  |           onSelect(value) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }}> | 
					
						
							|  |  |  |       <div className={classNames('relative')}> | 
					
						
							|  |  |  |         <div className='group text-gray-800'> | 
					
						
							|  |  |  |           {allowSearch | 
					
						
							|  |  |  |             ? <Combobox.Input | 
					
						
							|  |  |  |               className={`w-full rounded-lg border-0 ${bgClassName} py-1.5 pl-3 pr-10 shadow-sm sm:text-sm sm:leading-6 focus-visible:outline-none focus-visible:bg-gray-200 group-hover:bg-gray-200 cursor-not-allowed`} | 
					
						
							|  |  |  |               onChange={(event) => { | 
					
						
							|  |  |  |                 if (!disabled) | 
					
						
							|  |  |  |                   setQuery(event.target.value) | 
					
						
							|  |  |  |               }} | 
					
						
							|  |  |  |               displayValue={(item: Item) => item?.name} | 
					
						
							|  |  |  |             /> | 
					
						
							|  |  |  |             : <Combobox.Button onClick={ | 
					
						
							|  |  |  |               () => { | 
					
						
							|  |  |  |                 if (!disabled) | 
					
						
							|  |  |  |                   setOpen(!open) | 
					
						
							|  |  |  |               } | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |             } className={classNames(optionClassName, `flex items-center h-9 w-full rounded-lg border-0 ${bgClassName} py-1.5 pl-3 pr-10 shadow-sm sm:text-sm sm:leading-6 focus-visible:outline-none focus-visible:bg-gray-200 group-hover:bg-gray-200`)}> | 
					
						
							| 
									
										
										
										
											2023-12-22 16:54:18 +08:00
										 |  |  |               <div className='w-0 grow text-left truncate' title={selectedItem?.name}>{selectedItem?.name}</div> | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |             </Combobox.Button>} | 
					
						
							|  |  |  |           <Combobox.Button className="absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none group-hover:bg-gray-200" onClick={ | 
					
						
							|  |  |  |             () => { | 
					
						
							|  |  |  |               if (!disabled) | 
					
						
							|  |  |  |                 setOpen(!open) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           }> | 
					
						
							|  |  |  |             {open ? <ChevronUpIcon className="h-5 w-5" /> : <ChevronDownIcon className="h-5 w-5" />} | 
					
						
							|  |  |  |           </Combobox.Button> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         {filteredItems.length > 0 && ( | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  |           <Combobox.Options className={`absolute z-10 mt-1 px-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg border-gray-200 border-[0.5px] focus:outline-none sm:text-sm ${overlayClassName}`}> | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |             {filteredItems.map((item: Item) => ( | 
					
						
							|  |  |  |               <Combobox.Option | 
					
						
							|  |  |  |                 key={item.value} | 
					
						
							|  |  |  |                 value={item} | 
					
						
							|  |  |  |                 className={({ active }: { active: boolean }) => | 
					
						
							|  |  |  |                   classNames( | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |                     optionClassName, | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |                     'relative cursor-default select-none py-2 pl-3 pr-9 rounded-lg hover:bg-gray-100 text-gray-700', | 
					
						
							|  |  |  |                     active ? 'bg-gray-100' : '', | 
					
						
							|  |  |  |                   ) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               > | 
					
						
							|  |  |  |                 {({ /* active, */ selected }) => ( | 
					
						
							|  |  |  |                   <> | 
					
						
							| 
									
										
										
										
											2024-01-30 14:53:10 +08:00
										 |  |  |                     <span className={classNames('block', selected && 'font-normal')}>{item.name}</span> | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |                     {selected && ( | 
					
						
							|  |  |  |                       <span | 
					
						
							|  |  |  |                         className={classNames( | 
					
						
							|  |  |  |                           'absolute inset-y-0 right-0 flex items-center pr-4 text-gray-700', | 
					
						
							|  |  |  |                         )} | 
					
						
							|  |  |  |                       > | 
					
						
							|  |  |  |                         <CheckIcon className="h-5 w-5" aria-hidden="true" /> | 
					
						
							|  |  |  |                       </span> | 
					
						
							|  |  |  |                     )} | 
					
						
							|  |  |  |                   </> | 
					
						
							|  |  |  |                 )} | 
					
						
							|  |  |  |               </Combobox.Option> | 
					
						
							|  |  |  |             ))} | 
					
						
							|  |  |  |           </Combobox.Options> | 
					
						
							|  |  |  |         )} | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </Combobox > | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const SimpleSelect: FC<ISelectProps> = ({ | 
					
						
							|  |  |  |   className, | 
					
						
							| 
									
										
										
										
											2023-11-27 11:47:48 +08:00
										 |  |  |   wrapperClassName = '', | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   items = defaultItems, | 
					
						
							|  |  |  |   defaultValue = 1, | 
					
						
							|  |  |  |   disabled = false, | 
					
						
							|  |  |  |   onSelect, | 
					
						
							|  |  |  |   placeholder, | 
					
						
							|  |  |  | }) => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  |   const localPlaceholder = placeholder || t('common.placeholder.select') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const [selectedItem, setSelectedItem] = useState<Item | null>(null) | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     let defaultSelect = null | 
					
						
							|  |  |  |     const existed = items.find((item: Item) => item.value === defaultValue) | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  |     if (existed) | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |       defaultSelect = existed | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     setSelectedItem(defaultSelect) | 
					
						
							|  |  |  |   }, [defaultValue]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <Listbox | 
					
						
							|  |  |  |       value={selectedItem} | 
					
						
							|  |  |  |       onChange={(value: Item) => { | 
					
						
							|  |  |  |         if (!disabled) { | 
					
						
							|  |  |  |           setSelectedItem(value) | 
					
						
							|  |  |  |           onSelect(value) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }} | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <div className={`relative h-9 ${wrapperClassName}`}> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |         <Listbox.Button className={`w-full h-full rounded-lg border-0 bg-gray-100 py-1.5 pl-3 pr-10 sm:text-sm sm:leading-6 focus-visible:outline-none focus-visible:bg-gray-200 group-hover:bg-gray-200 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'} ${className}`}> | 
					
						
							| 
									
										
										
										
											2023-07-19 12:41:35 +08:00
										 |  |  |           <span className={classNames('block truncate text-left', !selectedItem?.name && 'text-gray-400')}>{selectedItem?.name ?? localPlaceholder}</span> | 
					
						
							| 
									
										
										
										
											2024-06-12 17:46:53 +08:00
										 |  |  |           <span className="absolute inset-y-0 right-0 flex items-center pr-2"> | 
					
						
							|  |  |  |             {selectedItem | 
					
						
							|  |  |  |               ? ( | 
					
						
							|  |  |  |                 <XMarkIcon | 
					
						
							|  |  |  |                   onClick={(e) => { | 
					
						
							|  |  |  |                     e.stopPropagation() | 
					
						
							|  |  |  |                     setSelectedItem(null) | 
					
						
							| 
									
										
										
										
											2024-07-25 11:21:51 +08:00
										 |  |  |                     onSelect({ name: '', value: '' }) | 
					
						
							| 
									
										
										
										
											2024-06-12 17:46:53 +08:00
										 |  |  |                   }} | 
					
						
							|  |  |  |                   className="h-5 w-5 text-gray-400 cursor-pointer" | 
					
						
							|  |  |  |                   aria-hidden="false" | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |               ) | 
					
						
							|  |  |  |               : ( | 
					
						
							|  |  |  |                 <ChevronDownIcon | 
					
						
							|  |  |  |                   className="h-5 w-5 text-gray-400" | 
					
						
							|  |  |  |                   aria-hidden="true" | 
					
						
							|  |  |  |                 /> | 
					
						
							|  |  |  |               )} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |           </span> | 
					
						
							|  |  |  |         </Listbox.Button> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |         {!disabled && ( | 
					
						
							|  |  |  |           <Transition | 
					
						
							|  |  |  |             as={Fragment} | 
					
						
							|  |  |  |             leave="transition ease-in duration-100" | 
					
						
							|  |  |  |             leaveFrom="opacity-100" | 
					
						
							|  |  |  |             leaveTo="opacity-0" | 
					
						
							|  |  |  |           > | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             <Listbox.Options className="absolute z-10 mt-1 px-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg border-gray-200 border-[0.5px] focus:outline-none sm:text-sm"> | 
					
						
							|  |  |  |               {items.map((item: Item) => ( | 
					
						
							|  |  |  |                 <Listbox.Option | 
					
						
							|  |  |  |                   key={item.value} | 
					
						
							|  |  |  |                   className={({ active }) => | 
					
						
							|  |  |  |                     `relative cursor-pointer select-none py-2 pl-3 pr-9 rounded-lg hover:bg-gray-100 text-gray-700 ${active ? 'bg-gray-100' : '' | 
					
						
							|  |  |  |                     }`
 | 
					
						
							|  |  |  |                   } | 
					
						
							|  |  |  |                   value={item} | 
					
						
							|  |  |  |                   disabled={disabled} | 
					
						
							|  |  |  |                 > | 
					
						
							|  |  |  |                   {({ /* active, */ selected }) => ( | 
					
						
							|  |  |  |                     <> | 
					
						
							| 
									
										
										
										
											2024-01-30 14:53:10 +08:00
										 |  |  |                       <span className={classNames('block', selected && 'font-normal')}>{item.name}</span> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                       {selected && ( | 
					
						
							|  |  |  |                         <span | 
					
						
							|  |  |  |                           className={classNames( | 
					
						
							|  |  |  |                             'absolute inset-y-0 right-0 flex items-center pr-4 text-gray-700', | 
					
						
							|  |  |  |                           )} | 
					
						
							|  |  |  |                         > | 
					
						
							|  |  |  |                           <CheckIcon className="h-5 w-5" aria-hidden="true" /> | 
					
						
							|  |  |  |                         </span> | 
					
						
							|  |  |  |                       )} | 
					
						
							|  |  |  |                     </> | 
					
						
							|  |  |  |                   )} | 
					
						
							|  |  |  |                 </Listbox.Option> | 
					
						
							|  |  |  |               ))} | 
					
						
							|  |  |  |             </Listbox.Options> | 
					
						
							|  |  |  |           </Transition> | 
					
						
							|  |  |  |         )} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |       </div> | 
					
						
							|  |  |  |     </Listbox> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-11-08 13:03:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type PortalSelectProps = { | 
					
						
							|  |  |  |   value: string | number | 
					
						
							|  |  |  |   onSelect: (value: Item) => void | 
					
						
							|  |  |  |   items: Item[] | 
					
						
							|  |  |  |   placeholder?: string | 
					
						
							|  |  |  |   popupClassName?: string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | const PortalSelect: FC<PortalSelectProps> = ({ | 
					
						
							|  |  |  |   value, | 
					
						
							|  |  |  |   onSelect, | 
					
						
							|  |  |  |   items, | 
					
						
							|  |  |  |   placeholder, | 
					
						
							|  |  |  |   popupClassName, | 
					
						
							|  |  |  | }) => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  |   const [open, setOpen] = useState(false) | 
					
						
							|  |  |  |   const localPlaceholder = placeholder || t('common.placeholder.select') | 
					
						
							|  |  |  |   const selectedItem = items.find(item => item.value === value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <PortalToFollowElem | 
					
						
							|  |  |  |       open={open} | 
					
						
							|  |  |  |       onOpenChange={setOpen} | 
					
						
							|  |  |  |       placement='bottom-start' | 
					
						
							|  |  |  |       offset={4} | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)} className='w-full'> | 
					
						
							|  |  |  |         <div | 
					
						
							|  |  |  |           className={`
 | 
					
						
							|  |  |  |             flex items-center justify-between px-2.5 h-9 rounded-lg border-0 bg-gray-100 text-sm cursor-pointer  | 
					
						
							|  |  |  |           `}
 | 
					
						
							|  |  |  |           title={selectedItem?.name} | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           <span | 
					
						
							|  |  |  |             className={`
 | 
					
						
							|  |  |  |               grow truncate | 
					
						
							|  |  |  |               ${!selectedItem?.name && 'text-gray-400'} | 
					
						
							|  |  |  |             `}
 | 
					
						
							|  |  |  |           > | 
					
						
							|  |  |  |             {selectedItem?.name ?? localPlaceholder} | 
					
						
							|  |  |  |           </span> | 
					
						
							|  |  |  |           <ChevronDownIcon className='shrink-0 h-4 w-4 text-gray-400' /> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </PortalToFollowElemTrigger> | 
					
						
							|  |  |  |       <PortalToFollowElemContent className={`z-20 ${popupClassName}`}> | 
					
						
							|  |  |  |         <div | 
					
						
							|  |  |  |           className='px-1 py-1 max-h-60 overflow-auto rounded-md bg-white text-base shadow-lg border-gray-200 border-[0.5px] focus:outline-none sm:text-sm' | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           {items.map((item: Item) => ( | 
					
						
							|  |  |  |             <div | 
					
						
							|  |  |  |               key={item.value} | 
					
						
							|  |  |  |               className={`
 | 
					
						
							|  |  |  |                 flex items-center justify-between px-2.5 h-9 cursor-pointer rounded-lg hover:bg-gray-100 text-gray-700 | 
					
						
							|  |  |  |                 ${item.value === value && 'bg-gray-100'} | 
					
						
							|  |  |  |               `}
 | 
					
						
							|  |  |  |               title={item.name} | 
					
						
							|  |  |  |               onClick={() => { | 
					
						
							|  |  |  |                 onSelect(item) | 
					
						
							|  |  |  |                 setOpen(false) | 
					
						
							|  |  |  |               }} | 
					
						
							|  |  |  |             > | 
					
						
							|  |  |  |               <span | 
					
						
							| 
									
										
										
										
											2023-12-22 16:54:18 +08:00
										 |  |  |                 className='w-0 grow truncate' | 
					
						
							| 
									
										
										
										
											2023-11-08 13:03:42 +08:00
										 |  |  |                 title={item.name} | 
					
						
							|  |  |  |               > | 
					
						
							|  |  |  |                 {item.name} | 
					
						
							|  |  |  |               </span> | 
					
						
							|  |  |  |               {item.value === value && ( | 
					
						
							|  |  |  |                 <CheckIcon className='shrink-0 h-4 w-4' /> | 
					
						
							|  |  |  |               )} | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           ))} | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </PortalToFollowElemContent> | 
					
						
							|  |  |  |     </PortalToFollowElem> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | export { SimpleSelect, PortalSelect } | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | export default React.memo(Select) |