/** * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates * SPDX-License-Identifier: MIT */ import React, { CSSProperties, useEffect, useRef, useState } from 'react'; import { usePlaygroundContainer } from '@flowgram.ai/core'; import { MinimapInactiveStyle } from './type'; import { FlowMinimapService } from './service'; import { MinimapDefaultInactiveStyle } from './constant'; interface MinimapProps { service?: FlowMinimapService; panelStyles?: CSSProperties; containerStyles?: CSSProperties; inactiveStyle?: Partial; } export const MinimapRender: React.FC = (props) => { const { panelStyles = {}, containerStyles = {}, inactiveStyle: customInactiveStyle = {} } = props; const inactiveStyle = { ...MinimapDefaultInactiveStyle, ...customInactiveStyle, }; const playgroundContainer = usePlaygroundContainer(); const service = props.service || playgroundContainer?.get(FlowMinimapService); const panelRef = useRef(null); const [activated, setActivated] = useState(false); useEffect(() => { const canvasContainer: HTMLDivElement | null = panelRef.current; if (canvasContainer && service.canvas) { canvasContainer.appendChild(service.canvas); } const disposer = service.onActive((activate: boolean) => { setActivated(activate); }); service.setVisible(true); service.render(); return () => { disposer.dispose(); service.setVisible(false); }; }, [service]); // 计算缩放比例和透明度 const scale: number = activated ? 1 : inactiveStyle.scale; const opacity: number = activated ? 1 : inactiveStyle.opacity; // 计算偏移量 const translateX: number = activated ? 0 : inactiveStyle.translateX; // 向右偏移的像素 const translateY: number = activated ? 0 : inactiveStyle.translateY; // 向下偏移的像素 return (
{ service.setActivate(true); }} onMouseLeave={() => { service.setActivate(false); }} onTouchStartCapture={() => { service.setActivate(true); }} onTouchEndCapture={() => { service.setActivate(false); }} >
); };