component.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import React, { CSSProperties, useEffect, useRef, useState } from 'react';
  2. import { MinimapInactiveStyle } from './type';
  3. import { FlowMinimapService } from './service';
  4. import { MinimapDefaultInactiveStyle } from './constant';
  5. interface MinimapProps {
  6. service: FlowMinimapService;
  7. panelStyles?: CSSProperties;
  8. containerStyles?: CSSProperties;
  9. inactiveStyle?: Partial<MinimapInactiveStyle>;
  10. }
  11. export const MinimapRender: React.FC<MinimapProps> = (props) => {
  12. const {
  13. service,
  14. panelStyles = {},
  15. containerStyles = {},
  16. inactiveStyle: customInactiveStyle = {},
  17. } = props;
  18. const inactiveStyle = {
  19. ...MinimapDefaultInactiveStyle,
  20. ...customInactiveStyle,
  21. };
  22. const panelRef = useRef<HTMLDivElement>(null);
  23. const [activated, setActivated] = useState<boolean>(false);
  24. useEffect(() => {
  25. const canvasContainer: HTMLDivElement | null = panelRef.current;
  26. if (canvasContainer && service.canvas) {
  27. canvasContainer.appendChild(service.canvas);
  28. }
  29. const disposer = service.onActive((activate: boolean) => {
  30. setActivated(activate);
  31. });
  32. return () => {
  33. disposer.dispose();
  34. };
  35. }, []);
  36. // 计算缩放比例和透明度
  37. const scale: number = activated ? 1 : inactiveStyle.scale;
  38. const opacity: number = activated ? 1 : inactiveStyle.opacity;
  39. // 计算偏移量
  40. const translateX: number = activated ? 0 : inactiveStyle.translateX; // 向右偏移的像素
  41. const translateY: number = activated ? 0 : inactiveStyle.translateY; // 向下偏移的像素
  42. return (
  43. <div
  44. className="minimap-container"
  45. style={{
  46. position: 'fixed',
  47. right: 30,
  48. bottom: 70,
  49. transition: 'all 0.3s ease', // 添加过渡效果
  50. transform: `scale(${scale}) translate(${translateX}px, ${translateY}px)`,
  51. opacity: opacity,
  52. transformOrigin: 'bottom right', // 设置变换的原点
  53. ...containerStyles,
  54. }}
  55. >
  56. <div
  57. className="minimap-panel"
  58. style={{
  59. display: 'flex',
  60. width: '100%',
  61. height: '100%',
  62. borderRadius: '10px',
  63. backgroundColor: 'rgba(255, 255, 255, 1)',
  64. border: '0.572px solid rgba(6, 7, 9, 0.10)',
  65. overflow: 'hidden',
  66. boxShadow:
  67. '0px 2.289px 6.867px 0px rgba(0, 0, 0, 0.08), 0px 4.578px 13.733px 0px rgba(0, 0, 0, 0.04)',
  68. boxSizing: 'border-box',
  69. padding: 8,
  70. ...panelStyles,
  71. }}
  72. data-flow-editor-selectable="false"
  73. ref={panelRef}
  74. onMouseEnter={() => {
  75. service.setActivate(true);
  76. }}
  77. onMouseLeave={() => {
  78. service.setActivate(false);
  79. }}
  80. onTouchStartCapture={() => {
  81. service.setActivate(true);
  82. }}
  83. onTouchEndCapture={() => {
  84. service.setActivate(false);
  85. }}
  86. ></div>
  87. </div>
  88. );
  89. };