12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 'use client'
- import type { FC } from 'react'
- import React, { useEffect, useReducer } from 'react'
- import { useTranslation } from 'react-i18next'
- import useSWR from 'swr'
- import StatusWithAction from './status-with-action'
- import { getErrorDocs, retryErrorDocs } from '@/service/datasets'
- import type { IndexingStatusResponse } from '@/models/datasets'
- type Props = {
- datasetId: string
- }
- type IIndexState = {
- value: string
- }
- type ActionType = 'retry' | 'success' | 'error'
- type IAction = {
- type: ActionType
- }
- const indexStateReducer = (state: IIndexState, action: IAction) => {
- const actionMap = {
- retry: 'retry',
- success: 'success',
- error: 'error',
- }
- return {
- ...state,
- value: actionMap[action.type] || state.value,
- }
- }
- const RetryButton: FC<Props> = ({ datasetId }) => {
- const { t } = useTranslation()
- const [indexState, dispatch] = useReducer(indexStateReducer, { value: 'success' })
- const { data: errorDocs, isLoading } = useSWR({ datasetId }, getErrorDocs)
- const onRetryErrorDocs = async () => {
- dispatch({ type: 'retry' })
- const document_ids = errorDocs?.data.map((doc: IndexingStatusResponse) => doc.id) || []
- const res = await retryErrorDocs({ datasetId, document_ids })
- if (res.result === 'success')
- dispatch({ type: 'success' })
- else
- dispatch({ type: 'error' })
- }
- useEffect(() => {
- if (errorDocs?.total === 0)
- dispatch({ type: 'success' })
- else
- dispatch({ type: 'error' })
- }, [errorDocs?.total])
- if (isLoading || indexState.value === 'success')
- return null
- return (
- <StatusWithAction
- type='warning'
- description={`${errorDocs?.total} ${t('dataset.docsFailedNotice')}`}
- actionText={t('dataset.retry')}
- disabled={indexState.value === 'retry'}
- onAction={indexState.value === 'error' ? onRetryErrorDocs : () => { }}
- />
- )
- }
- export default RetryButton
|