version-history-modal.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use client'
  2. import React, { useState } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import useSWR from 'swr'
  5. import { useWorkflowRun } from '../hooks'
  6. import VersionHistoryItem from './version-history-item'
  7. import type { VersionHistory } from '@/types/workflow'
  8. import { useStore as useAppStore } from '@/app/components/app/store'
  9. import { fetchPublishedAllWorkflow } from '@/service/workflow'
  10. import Loading from '@/app/components/base/loading'
  11. import Button from '@/app/components/base/button'
  12. const limit = 10
  13. const VersionHistoryModal = () => {
  14. const [selectedVersion, setSelectedVersion] = useState('draft')
  15. const [page, setPage] = useState(1)
  16. const { handleRestoreFromPublishedWorkflow } = useWorkflowRun()
  17. const appDetail = useAppStore.getState().appDetail
  18. const { t } = useTranslation()
  19. const {
  20. data: versionHistory,
  21. isLoading,
  22. } = useSWR(
  23. `/apps/${appDetail?.id}/workflows?page=${page}&limit=${limit}`,
  24. fetchPublishedAllWorkflow,
  25. )
  26. const handleVersionClick = (item: VersionHistory) => {
  27. if (item.version !== selectedVersion) {
  28. setSelectedVersion(item.version)
  29. handleRestoreFromPublishedWorkflow(item)
  30. }
  31. }
  32. const handleNextPage = () => {
  33. if (versionHistory?.has_more)
  34. setPage(page => page + 1)
  35. }
  36. return (
  37. <div className='w-[336px] bg-white rounded-2xl border-[0.5px] border-gray-200 shadow-xl p-2'>
  38. <div className="max-h-[400px] overflow-auto">
  39. {(isLoading && page) === 1
  40. ? (
  41. <div className='flex items-center justify-center h-10'>
  42. <Loading/>
  43. </div>
  44. )
  45. : (
  46. <>
  47. {versionHistory?.items?.map((item, idx) => (
  48. <VersionHistoryItem
  49. key={item.version}
  50. item={item}
  51. selectedVersion={selectedVersion}
  52. onClick={handleVersionClick}
  53. curIdx={idx}
  54. page={page}
  55. />
  56. ))}
  57. {isLoading && page > 1 && (
  58. <div className='flex items-center justify-center h-10'>
  59. <Loading/>
  60. </div>
  61. )}
  62. {!isLoading && versionHistory?.has_more && (
  63. <div className='flex items-center justify-center h-10 mt-2'>
  64. <Button
  65. className='text-sm'
  66. onClick={handleNextPage}
  67. >
  68. {t('workflow.common.loadMore')}
  69. </Button>
  70. </div>
  71. )}
  72. {!isLoading && !versionHistory?.items?.length && (
  73. <div className='flex items-center justify-center h-10 text-gray-500'>
  74. {t('workflow.common.noHistory')}
  75. </div>
  76. )}
  77. </>
  78. )}
  79. </div>
  80. </div>
  81. )
  82. }
  83. export default React.memo(VersionHistoryModal)