version-history-item.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React from 'react'
  2. import dayjs from 'dayjs'
  3. import { useTranslation } from 'react-i18next'
  4. import { WorkflowVersion } from '../types'
  5. import cn from '@/utils/classnames'
  6. import type { VersionHistory } from '@/types/workflow'
  7. type VersionHistoryItemProps = {
  8. item: VersionHistory
  9. selectedVersion: string
  10. onClick: (item: VersionHistory) => void
  11. curIdx: number
  12. page: number
  13. }
  14. const formatVersion = (version: string, curIdx: number, page: number): string => {
  15. if (curIdx === 0 && page === 1)
  16. return WorkflowVersion.Draft
  17. if (curIdx === 1 && page === 1)
  18. return WorkflowVersion.Latest
  19. try {
  20. const date = new Date(version)
  21. if (isNaN(date.getTime()))
  22. return version
  23. // format as YYYY-MM-DD HH:mm:ss
  24. return date.toISOString().slice(0, 19).replace('T', ' ')
  25. }
  26. catch {
  27. return version
  28. }
  29. }
  30. const VersionHistoryItem: React.FC<VersionHistoryItemProps> = ({ item, selectedVersion, onClick, curIdx, page }) => {
  31. const { t } = useTranslation()
  32. const formatTime = (time: number) => dayjs.unix(time).format('YYYY-MM-DD HH:mm:ss')
  33. const formattedVersion = formatVersion(item.version, curIdx, page)
  34. const renderVersionLabel = (version: string) => (
  35. (version === WorkflowVersion.Draft || version === WorkflowVersion.Latest)
  36. ? (
  37. <div className="shrink-0 px-1 border bg-white border-[rgba(0,0,0,0.08)] rounded-[5px] truncate">
  38. {version}
  39. </div>
  40. )
  41. : null
  42. )
  43. return (
  44. <div
  45. className={cn(
  46. 'flex items-center p-2 h-12 text-xs font-medium text-gray-700 justify-between',
  47. formattedVersion === selectedVersion ? '' : 'hover:bg-gray-100',
  48. formattedVersion === WorkflowVersion.Draft ? 'cursor-not-allowed' : 'cursor-pointer',
  49. )}
  50. onClick={() => item.version !== WorkflowVersion.Draft && onClick(item)}
  51. >
  52. <div className='flex flex-col gap-1 py-2'>
  53. <span className="text-left">{formatTime(formattedVersion === WorkflowVersion.Draft ? item.updated_at : item.created_at)}</span>
  54. <span className="text-left">{t('workflow.panel.createdBy')} {item.created_by.name}</span>
  55. </div>
  56. {renderVersionLabel(formattedVersion)}
  57. </div>
  58. )
  59. }
  60. export default React.memo(VersionHistoryItem)