DatasetCard.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. 'use client'
  2. import { useContext } from 'use-context-selector'
  3. import Link from 'next/link'
  4. import type { MouseEventHandler } from 'react'
  5. import { useCallback, useState } from 'react'
  6. import { useTranslation } from 'react-i18next'
  7. import classNames from 'classnames'
  8. import style from '../list.module.css'
  9. import Confirm from '@/app/components/base/confirm'
  10. import { ToastContext } from '@/app/components/base/toast'
  11. import { deleteDataset } from '@/service/datasets'
  12. import AppIcon from '@/app/components/base/app-icon'
  13. import type { DataSet } from '@/models/datasets'
  14. export type DatasetCardProps = {
  15. dataset: DataSet
  16. onDelete?: () => void
  17. }
  18. const DatasetCard = ({
  19. dataset,
  20. onDelete,
  21. }: DatasetCardProps) => {
  22. const { t } = useTranslation()
  23. const { notify } = useContext(ToastContext)
  24. const [showConfirmDelete, setShowConfirmDelete] = useState(false)
  25. const onDeleteClick: MouseEventHandler = useCallback((e) => {
  26. e.preventDefault()
  27. setShowConfirmDelete(true)
  28. }, [])
  29. const onConfirmDelete = useCallback(async () => {
  30. try {
  31. await deleteDataset(dataset.id)
  32. notify({ type: 'success', message: t('dataset.datasetDeleted') })
  33. if (onDelete)
  34. onDelete()
  35. }
  36. catch (e: any) {
  37. notify({ type: 'error', message: `${t('dataset.datasetDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}` })
  38. }
  39. setShowConfirmDelete(false)
  40. }, [dataset.id])
  41. return (
  42. <>
  43. <Link href={`/datasets/${dataset.id}/documents`} className={style.listItem}>
  44. <div className={style.listItemTitle}>
  45. <AppIcon size='small' />
  46. <div className={style.listItemHeading}>
  47. <div className={style.listItemHeadingContent}>{dataset.name}</div>
  48. </div>
  49. <span className={style.deleteAppIcon} onClick={onDeleteClick} />
  50. </div>
  51. <div className={style.listItemDescription}>{dataset.description}</div>
  52. <div className={classNames(style.listItemFooter, style.datasetCardFooter)}>
  53. <span className={style.listItemStats}>
  54. <span className={classNames(style.listItemFooterIcon, style.docIcon)} />
  55. {dataset.document_count}{t('dataset.documentCount')}
  56. </span>
  57. <span className={style.listItemStats}>
  58. <span className={classNames(style.listItemFooterIcon, style.textIcon)} />
  59. {Math.round(dataset.word_count / 1000)}{t('dataset.wordCount')}
  60. </span>
  61. <span className={style.listItemStats}>
  62. <span className={classNames(style.listItemFooterIcon, style.applicationIcon)} />
  63. {dataset.app_count}{t('dataset.appCount')}
  64. </span>
  65. </div>
  66. {showConfirmDelete && (
  67. <Confirm
  68. title={t('dataset.deleteDatasetConfirmTitle')}
  69. content={t('dataset.deleteDatasetConfirmContent')}
  70. isShow={showConfirmDelete}
  71. onClose={() => setShowConfirmDelete(false)}
  72. onConfirm={onConfirmDelete}
  73. onCancel={() => setShowConfirmDelete(false)}
  74. />
  75. )}
  76. </Link>
  77. </>
  78. )
  79. }
  80. export default DatasetCard