You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

create-from-scratch-modal.tsx 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import React, { useCallback, useEffect, useState } from 'react'
  2. import type { CreateDatasetReq } from '@/models/datasets'
  3. import { ChunkingMode, DatasetPermission } from '@/models/datasets'
  4. import { useMembers } from '@/service/use-common'
  5. import { useCreatePipelineDataset } from '@/service/knowledge/use-create-dataset'
  6. import type { Member } from '@/models/common'
  7. import CreateForm from '../create-form'
  8. import type { CreateFormData } from '@/models/pipeline'
  9. import Modal from '@/app/components/base/modal'
  10. import { useRouter } from 'next/navigation'
  11. import Toast from '@/app/components/base/toast'
  12. import { useTranslation } from 'react-i18next'
  13. import { useResetDatasetList } from '@/service/knowledge/use-dataset'
  14. type CreateFromScratchModalProps = {
  15. show: boolean
  16. onClose: () => void
  17. }
  18. const CreateFromScratchModal = ({
  19. show,
  20. onClose,
  21. }: CreateFromScratchModalProps) => {
  22. const { t } = useTranslation()
  23. const { push } = useRouter()
  24. const [memberList, setMemberList] = useState<Member[]>([])
  25. const { data: members } = useMembers()
  26. useEffect(() => {
  27. if (members?.accounts)
  28. setMemberList(members.accounts)
  29. }, [members])
  30. const { mutateAsync: createEmptyDataset } = useCreatePipelineDataset()
  31. const resetDatasetList = useResetDatasetList()
  32. const handleCreate = useCallback(async (payload: CreateFormData) => {
  33. const { name, appIcon, description, permission, selectedMemberIDs } = payload
  34. const request: CreateDatasetReq = {
  35. name,
  36. description,
  37. icon_info: {
  38. icon_type: appIcon.type,
  39. icon: appIcon.type === 'image' ? appIcon.fileId : appIcon.icon,
  40. icon_background: appIcon.type === 'image' ? undefined : appIcon.background,
  41. icon_url: appIcon.type === 'image' ? appIcon.url : undefined,
  42. },
  43. doc_form: ChunkingMode.text,
  44. permission,
  45. }
  46. // Handle permission
  47. if (request.permission === DatasetPermission.partialMembers) {
  48. const selectedMemberList = selectedMemberIDs.map((id) => {
  49. return {
  50. user_id: id,
  51. role: memberList.find(member => member.id === id)?.role,
  52. }
  53. })
  54. request.partial_member_list = selectedMemberList
  55. }
  56. await createEmptyDataset(request, {
  57. onSuccess: (data) => {
  58. if (data) {
  59. const { id } = data
  60. Toast.notify({
  61. type: 'success',
  62. message: t('datasetPipeline.creation.successTip'),
  63. })
  64. resetDatasetList()
  65. push(`/datasets/${id}/pipeline`)
  66. }
  67. },
  68. onError: () => {
  69. Toast.notify({
  70. type: 'error',
  71. message: t('datasetPipeline.creation.errorTip'),
  72. })
  73. },
  74. onSettled: () => {
  75. onClose?.()
  76. },
  77. })
  78. }, [createEmptyDataset, memberList, onClose, push, resetDatasetList, t])
  79. return (
  80. <Modal
  81. isShow={show}
  82. onClose={onClose}
  83. className='max-w-[520px] p-0'
  84. >
  85. <CreateForm
  86. onCreate={handleCreate}
  87. onClose={onClose}
  88. />
  89. </Modal>
  90. )
  91. }
  92. export default CreateFromScratchModal