import React, { useEffect, useState } from 'react' import dayjs from 'dayjs' import { useTranslation } from 'react-i18next' import ContextMenu from './context-menu' import cn from '@/utils/classnames' import type { VersionHistory } from '@/types/workflow' import { type VersionHistoryContextMenuOptions, WorkflowVersion } from '../../types' type VersionHistoryItemProps = { item: VersionHistory currentVersion: VersionHistory | null latestVersionId: string onClick: (item: VersionHistory) => void handleClickMenuItem: (operation: VersionHistoryContextMenuOptions) => void isLast: boolean } const formatVersion = (versionHistory: VersionHistory, latestVersionId: string): string => { const { version, id } = versionHistory if (version === WorkflowVersion.Draft) return WorkflowVersion.Draft if (id === latestVersionId) return WorkflowVersion.Latest try { const date = new Date(version) if (Number.isNaN(date.getTime())) return version // format as YYYY-MM-DD HH:mm:ss return date.toISOString().slice(0, 19).replace('T', ' ') } catch { return version } } const VersionHistoryItem: React.FC = ({ item, currentVersion, latestVersionId, onClick, handleClickMenuItem, isLast, }) => { const { t } = useTranslation() const [isHovering, setIsHovering] = useState(false) const [open, setOpen] = useState(false) const formatTime = (time: number) => dayjs.unix(time).format('YYYY-MM-DD HH:mm') const formattedVersion = formatVersion(item, latestVersionId) const isSelected = item.version === currentVersion?.version const isDraft = formattedVersion === WorkflowVersion.Draft const isLatest = formattedVersion === WorkflowVersion.Latest useEffect(() => { if (isDraft) onClick(item) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const handleClickItem = () => { if (isSelected) return onClick(item) } return (
setIsHovering(true)} onMouseLeave={() => { setIsHovering(false) setOpen(false) }} onContextMenu={(e) => { e.preventDefault() setOpen(true) }} > {!isLast &&
}
{isDraft ? t('workflow.versionHistory.currentDraft') : item.marked_name || t('workflow.versionHistory.defaultName')}
{isLatest && (
{t('workflow.versionHistory.latest')}
)}
{ !isDraft && (
{item.marked_comment || ''}
) } { !isDraft && (
{`${formatTime(item.created_at)} ยท ${item.created_by.name}`}
) }
{/* Context Menu */} {!isDraft && isHovering && (
)}
) } export default React.memo(VersionHistoryItem)