| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | import type { FC } from 'react'import { useRef, useState } from 'react'import { useTranslation } from 'react-i18next'import { RiCloseCircleFill, RiSearchLine } from '@remixicon/react'import cn from '@/utils/classnames'type SearchInputProps = {  placeholder?: string  className?: string  value: string  onChange: (v: string) => void  white?: boolean}const SearchInput: FC<SearchInputProps> = ({  placeholder,  className,  value,  onChange,  white,}) => {  const { t } = useTranslation()  const [focus, setFocus] = useState<boolean>(false)  const isComposing = useRef<boolean>(false)  const [internalValue, setInternalValue] = useState<string>(value)  return (    <div className={cn(      'group flex h-8 items-center overflow-hidden rounded-lg border-none bg-components-input-bg-normal px-2 hover:bg-components-input-bg-hover',      focus && '!bg-components-input-bg-active',      white && '!border-gray-300 !bg-white shadow-xs hover:!border-gray-300 hover:!bg-white',      className,    )}>      <div className="pointer-events-none mr-1.5 flex h-4 w-4 shrink-0 items-center justify-center">        <RiSearchLine className="h-4 w-4 text-components-input-text-placeholder" aria-hidden="true" />      </div>      <input        type="text"        name="query"        className={cn(          'system-sm-regular caret-#295EFF block h-[18px] grow appearance-none border-0 bg-transparent text-components-input-text-filled outline-none placeholder:text-components-input-text-placeholder',          white && '!bg-white placeholder:!text-gray-400 hover:!bg-white group-hover:!bg-white',        )}        placeholder={placeholder || t('common.operation.search')!}        value={internalValue}        onChange={(e) => {          setInternalValue(e.target.value)          if (!isComposing.current)            onChange(e.target.value)        }}        onCompositionStart={() => {          isComposing.current = true        }}        onCompositionEnd={(e) => {          isComposing.current = false          onChange(e.data)        }}        onFocus={() => setFocus(true)}        onBlur={() => setFocus(false)}        autoComplete="off"      />      {value && (        <div          className='group/clear flex h-4 w-4 shrink-0 cursor-pointer items-center justify-center'          onClick={() => {            onChange('')            setInternalValue('')          }}        >          <RiCloseCircleFill className='h-4 w-4 text-text-quaternary group-hover/clear:text-text-tertiary' />        </div>      )}    </div>  )}export default SearchInput
 |