import type { FC } from 'react' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@langgenius/dify-ui/dropdown-menu' import { useSuspenseQuery } from '@tanstack/react-query' import { Fragment, memo } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow, useViewport } from 'reactflow' import { systemFeaturesQueryOptions } from '@/features/system-features/client' import { useNodesSyncDraft, useWorkflowReadOnly } from '../hooks' import { ShortcutKbd } from '../shortcuts/shortcut-kbd' import TipPopup from './tip-popup' const ZoomType = { zoomToFit: 'zoomToFit', zoomTo25: 'zoomTo25', zoomTo50: 'zoomTo50', zoomTo75: 'zoomTo75', zoomTo100: 'zoomTo100', zoomTo200: 'zoomTo200', toggleUserComments: 'toggleUserComments', toggleUserCursors: 'toggleUserCursors', toggleMiniMap: 'toggleMiniMap', } as const type ZoomType = (typeof ZoomType)[keyof typeof ZoomType] 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 { 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: ZoomType) => { if (workflowReadOnly) return 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 (
$['operator.zoomOut'], { ns: 'workflow' })} shortcut="workflow.zoom-out" > {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 && ( )}
))}
))}
$['operator.zoomIn'], { ns: 'workflow' })} shortcut="workflow.zoom-in" >
) } export default memo(ZoomInOut)