| @@ -1,5 +1,5 @@ | |||
| import type { FC } from 'react' | |||
| import { useState } from 'react' | |||
| import { useRef, useState } from 'react' | |||
| import { useTranslation } from 'react-i18next' | |||
| import { RiSearchLine } from '@remixicon/react' | |||
| import cn from '@/utils/classnames' | |||
| @@ -12,6 +12,7 @@ type SearchInputProps = { | |||
| onChange: (v: string) => void | |||
| white?: boolean | |||
| } | |||
| const SearchInput: FC<SearchInputProps> = ({ | |||
| placeholder, | |||
| className, | |||
| @@ -21,6 +22,7 @@ const SearchInput: FC<SearchInputProps> = ({ | |||
| }) => { | |||
| const { t } = useTranslation() | |||
| const [focus, setFocus] = useState<boolean>(false) | |||
| const isComposing = useRef<boolean>(false) | |||
| return ( | |||
| <div className={cn( | |||
| @@ -45,7 +47,14 @@ const SearchInput: FC<SearchInputProps> = ({ | |||
| placeholder={placeholder || t('common.operation.search')!} | |||
| value={value} | |||
| onChange={(e) => { | |||
| onChange(e.target.value) | |||
| if (!isComposing.current) | |||
| onChange(e.target.value) | |||
| }} | |||
| onCompositionStart={() => { | |||
| isComposing.current = true | |||
| }} | |||
| onCompositionEnd={() => { | |||
| isComposing.current = false | |||
| }} | |||
| onFocus={() => setFocus(true)} | |||
| onBlur={() => setFocus(false)} | |||