| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 | 'use client'import List from './list'import React, { useEffect, useRef, useState } from 'react'import Input from '@/app/components/base/input'import cn from '@/utils/classnames'import { RiAddLine, RiPriceTagLine, RiRefreshLine, RiSearchLine } from '@remixicon/react'import Button from '@/app/components/base/button'import useSWR from 'swr'import { fetchIntent, fetchIntentType } from '@/service/common'import { SimpleSelect } from '@/app/components/base/select'import DetailModal from './detail-modal'import TypeModal from './type-modal'const CorpusIndex = () => {  const [page, setPage] = useState<number>(0)  const [limit, setLimit] = useState<number>(10)  const [intentName, setIntentName] = useState<string>('') // the input value  const [intentType, setIntentType] = useState<string>('') // the input value  const { data: dataOptionsIntentType, mutate: mutateOptionsIntentType }: any = useSWR(    {      url: '/intentions/types',      params: {        page: 1,        limit: 99999,      },    },    fetchIntentType,  )  const optionsIntentType: any = dataOptionsIntentType?.data.map((v: any) => ({ name: v.name, value: v.id })) || []  const query = useRef<any>({})  const [list, setList] = useState<any>([])  const [total, setTotal] = useState(0)  const handlePage = () => {    const params: any = {      page: page + 1,      limit,    }    if (query.current.intentType)      params.type_id = query.current.intentType    if (query.current.intentName)      params.name_search = query.current.intentName    fetchIntent({      url: '/intentions',      params,    }).then((res: any) => {      setList(res.data)      setTotal(res.total)    })  }  const [refresh, setRefresh] = useState<boolean>(false)  const handleSearch = (reset = false) => {    setRefresh(true)    setPage(0)    if (reset) {      setIntentName('')      setIntentType('')      query.current = {}    }    else {      query.current = {        intentType, intentName,      }    }    handlePage()    setRefresh(false)  }  useEffect(() => {    if (!refresh)      handlePage()  }, [page, limit])  const [detailModalVisible, setDetailModalVisible] = useState(false)  const [transfer, setTransfer] = useState<any>({    mode: 'add',    row: {},  })  const [showIntentTypeModalVisible, setShowIntentTypeModalVisible] = useState(false)  return (    <>      <div className='flex h-full w-full flex-col bg-background-default-subtle p-6'>        <div className="flex items-center gap-2">          <div className="flex shrink-0 items-center text-gray-500">            意图类型            <div className="ml-2 flex h-[32px]">              <SimpleSelect                className="h-[32px] w-[200px]"                defaultValue={intentType}                onSelect={(i: any) => {                  setIntentType(i.value)                }}                items={optionsIntentType}                allowSearch={false}                placeholder="请选择意图类型"              />            </div>          </div>          <div className="flex shrink-0 items-center text-gray-500">            意图名称            <Input              className="ml-2"              showClearIcon              wrapperClassName='!w-[200px]'              value={intentName}              onChange={e => setIntentName(e.target.value)}              onClear={() => setIntentName('')}            />          </div>          <Button variant='primary' className={cn('ml-auto shrink-0')} onClick={() => {            handleSearch(false)          }}>            <RiSearchLine className='mr-1 h-4 w-4' />            搜索          </Button>          <Button variant='primary' className={cn('shrink-0')} onClick={() => {            handleSearch(true)          }}>            <RiRefreshLine className='mr-1 h-4 w-4' />            重置          </Button>        </div>        <div className="mt-2">          <Button variant='primary' className={cn('shrink-0')}            onClick={() => {              setTransfer({ mode: 'add', row: null })              setDetailModalVisible(true)            }}>            <RiAddLine className='mr-1 h-4 w-4' />            新增          </Button>          <Button variant='primary' className={cn('ml-2 shrink-0')}            onClick={() => {              setShowIntentTypeModalVisible(true)            }}>            <RiPriceTagLine className='mr-1 h-4 w-4' />            意图类型管理          </Button>        </div>        <div className="flex-1">          <List            list={list}            onUpdate={() => handleSearch(false)}            pagination={{              total,              limit,              onLimitChange: setLimit,              current: page,              onChange: setPage,            }}          />        </div>      </div>      {        detailModalVisible && (          <DetailModal            transfer={transfer}            onCancel={() => {              setDetailModalVisible(false)              handleSearch()            }}            onSend={() => {              setDetailModalVisible(false)              handleSearch()            }}            onRefresh={(id: string) => {              setTransfer({                mode: 'edit',                row: { id },              })            }}          />        )      }      {        showIntentTypeModalVisible && (          <TypeModal            onCancel={() => {              mutateOptionsIntentType()              setShowIntentTypeModalVisible(false)            }}          />        )      }    </>  )}export default CorpusIndex
 |