DatasetCard.tsx 3.2 KB

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