1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 'use client'
- import { useContext } from 'use-context-selector'
- import Link from 'next/link'
- import type { MouseEventHandler } from 'react'
- import { useCallback, useState } from 'react'
- import { useTranslation } from 'react-i18next'
- import cn from 'classnames'
- import style from '../list.module.css'
- import Confirm from '@/app/components/base/confirm'
- import { ToastContext } from '@/app/components/base/toast'
- import { deleteDataset } from '@/service/datasets'
- import AppIcon from '@/app/components/base/app-icon'
- import type { DataSet } from '@/models/datasets'
- import Tooltip from '@/app/components/base/tooltip'
- export type DatasetCardProps = {
- dataset: DataSet
- onDelete?: () => void
- }
- const DatasetCard = ({
- dataset,
- onDelete,
- }: DatasetCardProps) => {
- const { t } = useTranslation()
- const { notify } = useContext(ToastContext)
- const [showConfirmDelete, setShowConfirmDelete] = useState(false)
- const onDeleteClick: MouseEventHandler = useCallback((e) => {
- e.preventDefault()
- setShowConfirmDelete(true)
- }, [])
- const onConfirmDelete = useCallback(async () => {
- try {
- await deleteDataset(dataset.id)
- notify({ type: 'success', message: t('dataset.datasetDeleted') })
- if (onDelete)
- onDelete()
- }
- catch (e: any) {
- notify({ type: 'error', message: `${t('dataset.datasetDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}` })
- }
- setShowConfirmDelete(false)
- }, [dataset.id])
- return (
- <>
- <Link href={`/datasets/${dataset.id}/documents`} className={cn(style.listItem)}>
- <div className={style.listItemTitle}>
- <AppIcon size='small' className={cn(!dataset.embedding_available && style.unavailable)} />
- <div className={cn(style.listItemHeading, !dataset.embedding_available && style.unavailable)}>
- <div className={style.listItemHeadingContent}>
- {dataset.name}
- </div>
- </div>
- {!dataset.embedding_available && (
- <Tooltip
- selector={`dataset-tag-${dataset.id}`}
- htmlContent={t('dataset.unavailableTip')}
- >
- <span className='px-1 border boder-gray-200 rounded-md text-gray-500 text-xs font-normal leading-[18px]'>{t('dataset.unavailable')}</span>
- </Tooltip>
- )}
- <span className={style.deleteDatasetIcon} onClick={onDeleteClick} />
- </div>
- <div className={cn(style.listItemDescription, !dataset.embedding_available && style.unavailable)}>{dataset.description}</div>
- <div className={cn(style.listItemFooter, style.datasetCardFooter, !dataset.embedding_available && style.unavailable)}>
- <span className={style.listItemStats}>
- <span className={cn(style.listItemFooterIcon, style.docIcon)} />
- {dataset.document_count}{t('dataset.documentCount')}
- </span>
- <span className={style.listItemStats}>
- <span className={cn(style.listItemFooterIcon, style.textIcon)} />
- {Math.round(dataset.word_count / 1000)}{t('dataset.wordCount')}
- </span>
- <span className={style.listItemStats}>
- <span className={cn(style.listItemFooterIcon, style.applicationIcon)} />
- {dataset.app_count}{t('dataset.appCount')}
- </span>
- </div>
- {showConfirmDelete && (
- <Confirm
- title={t('dataset.deleteDatasetConfirmTitle')}
- content={t('dataset.deleteDatasetConfirmContent')}
- isShow={showConfirmDelete}
- onClose={() => setShowConfirmDelete(false)}
- onConfirm={onConfirmDelete}
- onCancel={() => setShowConfirmDelete(false)}
- />
- )}
- </Link>
- </>
- )
- }
- export default DatasetCard
|