123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- import { useContext } from 'use-context-selector'
- import { useTranslation } from 'react-i18next'
- import cn from 'classnames'
- import Button from '../../base/button'
- import Tag from '../../base/tag'
- import Tooltip from '../../base/tooltip'
- import { getIcon } from '../common/retrieval-method-info'
- import s from './style.module.css'
- import DatasetDetailContext from '@/context/dataset-detail'
- import type { HitTestingResponse } from '@/models/datasets'
- import { hitTesting } from '@/service/datasets'
- import { asyncRunSafe } from '@/utils'
- import { RETRIEVE_METHOD, type RetrievalConfig } from '@/types/app'
- type TextAreaWithButtonIProps = {
- datasetId: string
- onUpdateList: () => void
- setHitResult: (res: HitTestingResponse) => void
- loading: boolean
- setLoading: (v: boolean) => void
- text: string
- setText: (v: string) => void
- onClickRetrievalMethod: () => void
- retrievalConfig: RetrievalConfig
- isEconomy: boolean
- onSubmit?: () => void
- }
- const TextAreaWithButton = ({
- datasetId,
- onUpdateList,
- setHitResult,
- setLoading,
- loading,
- text,
- setText,
- onClickRetrievalMethod,
- retrievalConfig,
- isEconomy,
- onSubmit: _onSubmit,
- }: TextAreaWithButtonIProps) => {
- const { t } = useTranslation()
- const { indexingTechnique } = useContext(DatasetDetailContext)
- function handleTextChange(event: any) {
- setText(event.target.value)
- }
- const onSubmit = async () => {
- setLoading(true)
- const [e, res] = await asyncRunSafe<HitTestingResponse>(
- hitTesting({
- datasetId,
- queryText: text,
- retrieval_model: {
- ...retrievalConfig,
- search_method: isEconomy ? RETRIEVE_METHOD.keywordSearch : retrievalConfig.search_method,
- },
- }) as Promise<HitTestingResponse>,
- )
- if (!e) {
- setHitResult(res)
- onUpdateList?.()
- }
- setLoading(false)
- _onSubmit && _onSubmit()
- }
- const retrievalMethod = isEconomy ? RETRIEVE_METHOD.invertedIndex : retrievalConfig.search_method
- const Icon = getIcon(retrievalMethod)
- return (
- <>
- <div className={s.wrapper}>
- <div className='pt-2 rounded-tl-xl rounded-tr-xl bg-[#EEF4FF]'>
- <div className="px-4 pb-2 flex justify-between h-8 items-center">
- <span className="text-gray-800 font-semibold text-sm">
- {t('datasetHitTesting.input.title')}
- </span>
- <Tooltip
- selector={'change-retrieval-method'}
- htmlContent={t('dataset.retrieval.changeRetrievalMethod')}
- >
- <div
- onClick={onClickRetrievalMethod}
- className='flex px-2 h-7 items-center space-x-1 bg-white hover:bg-[#ECE9FE] rounded-md shadow-sm cursor-pointer text-[#6927DA]'
- >
- <Icon className='w-3.5 h-3.5'></Icon>
- <div className='text-xs font-medium'>{t(`dataset.retrieval.${retrievalMethod}.title`)}</div>
- </div>
- </Tooltip>
- </div>
- <div className='h-2 rounded-tl-xl rounded-tr-xl bg-white'></div>
- </div>
- <div className='px-4 pb-11'>
- <textarea
- value={text}
- onChange={handleTextChange}
- placeholder={t('datasetHitTesting.input.placeholder') as string}
- className={s.textarea}
- />
- <div className="absolute inset-x-0 bottom-0 flex items-center justify-between mx-4 mt-2 mb-2">
- {text?.length > 200
- ? (
- <Tooltip
- content={t('datasetHitTesting.input.countWarning') as string}
- selector="hit-testing-warning"
- >
- <div>
- <Tag color="red" className="!text-red-600">
- {text?.length}
- <span className="text-red-300 mx-0.5">/</span>
- 200
- </Tag>
- </div>
- </Tooltip>
- )
- : (
- <Tag
- color="gray"
- className={cn('!text-gray-500', text?.length ? '' : 'opacity-50')}
- >
- {text?.length}
- <span className="text-gray-300 mx-0.5">/</span>
- 200
- </Tag>
- )}
- <div>
- <Button
- onClick={onSubmit}
- variant="primary"
- loading={loading}
- disabled={(!text?.length || text?.length > 200)}
- >
- {t('datasetHitTesting.input.testing')}
- </Button>
- </div>
- </div>
- </div>
- </div>
- </>
- )
- }
- export default TextAreaWithButton
|