import { type FC, useState, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import clsx from 'clsx'; import { Button, Space, Input, Form, App } from 'antd'; import Tag, { type TagProps } from './components/Tag' import RbCard from '@/components/RbCard/Card' import { getReleaseList, rollbackRelease } from '@/api/application' import ReleaseModal from './components/ReleaseModal' import ReleaseShareModal from './components/ReleaseShareModal' import type { Release, ReleaseModalRef, ReleaseShareModalRef } from './types' import type { Application } from '@/views/ApplicationManagement/types' import Empty from '@/components/Empty' import { formatDateTime } from '@/utils/format'; import Markdown from '@/components/Markdown' const tagColors: Record = { current: 'processing', rolledBack: 'warning', history: 'default', } const ReleasePage: FC<{data: Application; refresh: () => void}> = ({data, refresh}) => { const { t } = useTranslation(); const { message } = App.useApp() const releaseModalRef = useRef(null) const releaseShareModalRef = useRef(null) const [selectedVersion, setSelectedVersion] = useState(null); const [releaseList, setReleaseList] = useState([]) useEffect(() => { getData() }, [data.id]) const getData = () => { refresh() getReleaseList(data.id).then(res => { const response = res as Release[] || [] setReleaseList(response) setSelectedVersion(response?.[0]) }) } const handleRollback = () => { if (!selectedVersion) return rollbackRelease(data.id, selectedVersion.version).then(() => { getData() message.success(t('common.operateSuccess')) }) } return (
{t('application.versionList')}
{t('application.versionListDesc')}
{releaseList.length === 0 ? : selectedVersion && releaseList.map((version, index) => { const tagKey = version.id === data.current_release_id && index === 0 ? 'current' : version.id === data.current_release_id ? 'rolledBack' : 'history' return ( {version.version_name || `v${version.version}`} {tagKey && {tagKey} } } className={clsx("rb:hover:border-[#155EEF]! rb:cursor-pointer", { 'rb:bg-[rgba(21,94,239,0.06)]! rb:border-[#155EEF]!': version.id === selectedVersion.id, 'rb:border-[#DFE4ED] rb:bg-[#FBFDFF]': version.id !== selectedVersion.id })} headerType="borderless" onClick={() => setSelectedVersion(version)} >
{t('application.publishedOn')} {formatDateTime(version.published_at, 'YYYY-MM-DD HH:mm:ss')}
{t('application.publisher')}: {version.publisher_name}
) }) }
{selectedVersion && t('application.DetailsOfVersion', { version: selectedVersion.version_name || `v${selectedVersion.version}` || '-' })} {selectedVersion && <> {/* */} {data.current_release_id !== selectedVersion.id && } }
{selectedVersion &&
{/* 日志 */} {selectedVersion && ( {formatDateTime(selectedVersion.published_at, 'YYYY-MM-DD HH:mm:ss')}
} extra={{selectedVersion.publisher_name}} >
)} }
); } export default ReleasePage;