import type { FC } from 'react' import { Fragment, memo, useCallback, useState, } from 'react' import { useTranslation } from 'react-i18next' import { useReactFlow, useViewport, } from 'reactflow' import { useNodesSyncDraft, useWorkflowReadOnly, } from '../hooks' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import { SearchLg } from '@/app/components/base/icons/src/vender/line/general' import { ChevronDown } from '@/app/components/base/icons/src/vender/line/arrows' const ZoomInOut: FC = () => { 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 ZOOM_IN_OUT_OPTIONS = [ [ { key: 'in', text: t('workflow.operator.zoomIn'), }, { key: 'out', text: t('workflow.operator.zoomOut'), }, ], [ { key: 'to50', text: t('workflow.operator.zoomTo50'), }, { key: 'to100', text: t('workflow.operator.zoomTo100'), }, ], [ { key: 'fit', text: t('workflow.operator.zoomToFit'), }, ], ] const handleZoom = (type: string) => { if (workflowReadOnly) return if (type === 'in') zoomIn() if (type === 'out') zoomOut() if (type === 'fit') fitView() if (type === 'to50') zoomTo(0.5) if (type === 'to100') zoomTo(1) handleSyncWorkflowDraft() } const handleTrigger = useCallback(() => { if (getWorkflowReadOnly()) return setOpen(v => !v) }, [getWorkflowReadOnly]) return (
{parseFloat(`${zoom * 100}`).toFixed(0)}%
{ ZOOM_IN_OUT_OPTIONS.map((options, i) => ( { i !== 0 && (
) }
{ options.map(option => (
handleZoom(option.key)} > {option.text}
)) }
)) }
) } export default memo(ZoomInOut)