/* * @Author: ZhaoYing * @Date: 2026-02-03 16:29:41 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-03-26 15:24:41 */ import { type FC, useState, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import clsx from 'clsx'; import { Space, Input, Form, App, Flex } from 'antd'; import Tag, { type TagProps } from './components/Tag' import RbCard from '@/components/RbCard/Card' import { getReleaseList, rollbackRelease, appExport } from '@/api/application' import ReleaseModal from './components/ReleaseModal' import ReleaseShareModal from './components/ReleaseShareModal' import AppSharingModal from './components/AppSharingModal' import type { Release, ReleaseModalRef, ReleaseShareModalRef, AppSharingModalRef } from './types' import type { Application } from '@/views/ApplicationManagement/types' import Empty from '@/components/Empty' import { formatDateTime } from '@/utils/format'; import Markdown from '@/components/Markdown' import RbButton from '@/components/RbButton'; /** * Tag color mapping for release versions */ const tagColors: Record = { current: 'processing', rolledBack: 'warning', history: 'default', } const heightClass = 'rb:max-h-[calc(100vh-140px)]' /** * Release page component * Manages application version releases, rollbacks, and version history * @param data - Application data * @param refresh - Function to refresh application data */ 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 appSharingModalRef = useRef(null) const [selectedVersion, setSelectedVersion] = useState(null); const [releaseList, setReleaseList] = useState([]) useEffect(() => { getData() }, [data.id]) /** * Fetch release list data */ const getData = () => { refresh() getReleaseList(data.id).then(res => { const response = res as Release[] || [] setReleaseList(response) setSelectedVersion(response?.[0]) }) } /** * Rollback to selected version */ const handleRollback = () => { if (!selectedVersion) return rollbackRelease(data.id, selectedVersion.version).then(() => { getData() message.success(t('common.operateSuccess')) }) } const handleExport = () => { if (!selectedVersion) return appExport(data.id, data.name, { release_id: selectedVersion.id}) } 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 && version.version_name[0].toLocaleLowerCase() === 'v' ? version.version_name : version.version_name ? `v${version.version_name}` : `v${version.version}`} {tagKey && {tagKey} } } className={clsx("rb:hover:shadow-[0px_2px_8px_0px_rgba(0,0,0,0.2)]! rb:cursor-pointer rb:bg-white", { 'rb:border-[#171719]!': version.id === selectedVersion.id, 'rb:border-[#DFE4ED] ': 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 && selectedVersion.version_name[0].toLocaleLowerCase() === 'v' ? selectedVersion.version_name : selectedVersion.version_name ? `v${selectedVersion.version_name}` : `v${selectedVersion.version}` || '-' })} {selectedVersion && <> {data?.type !== 'multi_agent' && {t('common.export')}} {data.current_release_id !== selectedVersion.id && {t('application.willRollToThisVersion')}} releaseShareModalRef.current?.handleOpen()}>{t('application.share')} {data?.type !== 'multi_agent' && appSharingModalRef.current?.handleOpen()}>{t('application.sharing')}} } releaseModalRef.current?.handleOpen()}>{t('application.release')} {selectedVersion &&
{/* Logs */} {selectedVersion && ( {formatDateTime(selectedVersion.published_at, 'YYYY-MM-DD HH:mm:ss')}
} extra={{selectedVersion.publisher_name}} bodyClassName="rb:pt-0! rb:pb-3! rb:px-4!" variant="outlined" >
)}
} ); } export default ReleasePage;