import { memo, useCallback, useState, } from 'react' import { useTranslation } from 'react-i18next' import { useStore, useWorkflowStore, } from '../store' import { useNodesReadOnly, useNodesSyncDraft, useWorkflow, useWorkflowRun, } from '../hooks' import Button from '@/app/components/base/button' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import { publishWorkflow } from '@/service/workflow' import { useStore as useAppStore } from '@/app/components/app/store' import { useToastContext } from '@/app/components/base/toast' const Publish = () => { const { t } = useTranslation() const { notify } = useToastContext() const [published, setPublished] = useState(false) const workflowStore = useWorkflowStore() const { formatTimeFromNow } = useWorkflow() const { handleBackupDraft, handleCheckBeforePublish, handleRestoreFromPublishedWorkflow, } = useWorkflowRun() const { handleSyncWorkflowDraft } = useNodesSyncDraft() const { nodesReadOnly, getNodesReadOnly, } = useNodesReadOnly() const draftUpdatedAt = useStore(s => s.draftUpdatedAt) const publishedAt = useStore(s => s.publishedAt) const [open, setOpen] = useState(false) const handlePublish = async () => { const appId = useAppStore.getState().appDetail?.id if (handleCheckBeforePublish()) { try { const res = await publishWorkflow(`/apps/${appId}/workflows/publish`) if (res) { notify({ type: 'success', message: t('common.api.actionSuccess') }) setPublished(true) workflowStore.getState().setPublishedAt(res.created_at) } } catch (e) { setPublished(false) } } } const handleRestore = useCallback(() => { workflowStore.getState().setIsRestoring(true) handleBackupDraft() handleRestoreFromPublishedWorkflow() setOpen(false) }, [workflowStore, handleBackupDraft, handleRestoreFromPublishedWorkflow]) const handleTrigger = useCallback(() => { if (getNodesReadOnly()) return if (open) setOpen(false) if (!open) { handleSyncWorkflowDraft(true) setOpen(true) setPublished(false) } }, [getNodesReadOnly, open, handleSyncWorkflowDraft]) return (
{t('workflow.common.currentDraft').toLocaleUpperCase()}
{t('workflow.common.autoSaved')} {formatTimeFromNow(draftUpdatedAt)}
{ !!publishedAt && (
{t('workflow.common.latestPublished').toLocaleUpperCase()}
{t('workflow.common.autoSaved')} {formatTimeFromNow(publishedAt)}
) }
) } export default memo(Publish)