import type { FC } from 'react' import { cn } from '@langgenius/dify-ui/cn' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@langgenius/dify-ui/dropdown-menu' import { useSuspenseQuery } from '@tanstack/react-query' import { Fragment, memo, useState, } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow, useViewport, } from 'reactflow' import { systemFeaturesQueryOptions } from '@/service/system-features' import { useNodesSyncDraft, useWorkflowReadOnly, } from '../hooks' import { ShortcutKbd } from '../shortcuts/shortcut-kbd' import TipPopup from './tip-popup' enum ZoomType { zoomToFit = 'zoomToFit', zoomTo25 = 'zoomTo25', zoomTo50 = 'zoomTo50', zoomTo75 = 'zoomTo75', zoomTo100 = 'zoomTo100', zoomTo200 = 'zoomTo200', toggleUserComments = 'toggleUserComments', toggleUserCursors = 'toggleUserCursors', toggleMiniMap = 'toggleMiniMap', } type ZoomInOutProps = { showMiniMap?: boolean onToggleMiniMap?: () => void showUserCursors?: boolean onToggleUserCursors?: () => void showUserComments?: boolean onToggleUserComments?: () => void isCommentMode?: boolean } const ZoomInOut: FC = ({ showMiniMap = true, onToggleMiniMap, showUserCursors = true, onToggleUserCursors, showUserComments = true, onToggleUserComments, isCommentMode = false, }) => { const { t } = useTranslation() const { zoomIn, zoomOut, zoomTo, fitView, } = useReactFlow() const { zoom } = useViewport() const { handleSyncWorkflowDraft } = useNodesSyncDraft() const [open, setOpen] = useState(false) const { workflowReadOnly, getWorkflowReadOnly, } = useWorkflowReadOnly() const { data: isCollaborationEnabled } = useSuspenseQuery({ ...systemFeaturesQueryOptions(), select: s => s.enable_collaboration_mode, }) const zoomOptions = [ [ { key: ZoomType.zoomTo200, text: '200%', }, { key: ZoomType.zoomTo100, text: '100%', }, { key: ZoomType.zoomTo75, text: '75%', }, { key: ZoomType.zoomTo50, text: '50%', }, { key: ZoomType.zoomTo25, text: '25%', }, { key: ZoomType.zoomToFit, text: t('operator.zoomToFit', { ns: 'workflow' }), }, ], isCollaborationEnabled ? [ { key: ZoomType.toggleUserComments, text: t('operator.showUserComments', { ns: 'workflow' }), }, { key: ZoomType.toggleUserCursors, text: t('operator.showUserCursors', { ns: 'workflow' }), }, { key: ZoomType.toggleMiniMap, text: t('operator.showMiniMap', { ns: 'workflow' }), }, ] : [ { key: ZoomType.toggleMiniMap, text: t('operator.showMiniMap', { ns: 'workflow' }), }, ], ] const handleZoom = (type: string) => { if (workflowReadOnly) return setOpen(false) if (type === ZoomType.zoomToFit) fitView() if (type === ZoomType.zoomTo25) zoomTo(0.25) if (type === ZoomType.zoomTo50) zoomTo(0.5) if (type === ZoomType.zoomTo75) zoomTo(0.75) if (type === ZoomType.zoomTo100) zoomTo(1) if (type === ZoomType.zoomTo200) zoomTo(2) if (type === ZoomType.toggleUserComments) { if (!isCommentMode) onToggleUserComments?.() return } if (type === ZoomType.toggleUserCursors) { onToggleUserCursors?.() return } if (type === ZoomType.toggleMiniMap) { onToggleMiniMap?.() return } handleSyncWorkflowDraft() } return (
{Number.parseFloat(`${zoom * 100}`).toFixed(0)} %
{zoomOptions.map((options, groupIndex) => ( {groupIndex !== 0 && ( )}
{options.map(option => ( handleZoom(option.key)} >
{option.key === ZoomType.toggleUserComments && showUserComments && ( )} {option.key === ZoomType.toggleUserComments && !showUserComments && ( )} {option.key === ZoomType.toggleUserCursors && showUserCursors && ( )} {option.key === ZoomType.toggleUserCursors && !showUserCursors && ( )} {option.key === ZoomType.toggleMiniMap && showMiniMap && ( )} {option.key === ZoomType.toggleMiniMap && !showMiniMap && ( )} {option.key === ZoomType.zoomToFit && ( )} {option.key !== ZoomType.toggleUserComments && option.key !== ZoomType.toggleUserCursors && option.key !== ZoomType.toggleMiniMap && option.key !== ZoomType.zoomToFit && ( )} {option.text}
{option.key === ZoomType.zoomToFit && ( )} {option.key === ZoomType.zoomTo50 && ( )} {option.key === ZoomType.zoomTo100 && ( )}
))}
))}
) } export default memo(ZoomInOut)