feat(resizer): add resize event handlers

This commit is contained in:
moklick
2022-12-07 16:30:01 +01:00
parent 5e916ba2db
commit 4c2acf5aa1
4 changed files with 53 additions and 9 deletions

View File

@@ -1,13 +1,32 @@
import { memo, FC } from 'react';
import { Handle, Position, NodeProps } from 'reactflow';
import { NodeResizer } from '@reactflow/node-resizer';
import { NodeResizer, ResizeDragEvent, ResizeEventParams } from '@reactflow/node-resizer';
import '@reactflow/node-resizer/dist/style.css';
const onResizeStart = (_: ResizeDragEvent, params: ResizeEventParams) => {
console.log('resize start', params);
};
const onResize = (_: ResizeDragEvent, params: ResizeEventParams) => {
console.log('resize', params);
};
const onResizeEnd = (_: ResizeDragEvent, params: ResizeEventParams) => {
console.log('resize end', params);
};
const CustomNode: FC<NodeProps> = ({ data, selected }) => {
return (
<>
<NodeResizer minWidth={100} minHeight={100} isVisible={selected} />
<NodeResizer
minWidth={100}
minHeight={100}
isVisible={selected}
onResizeStart={onResizeStart}
onResize={onResize}
onResizeEnd={onResizeEnd}
/>
<Handle type="target" position={Position.Left} />
<div>{data.label}</div>
<Handle type="source" position={Position.Right} />

View File

@@ -14,6 +14,9 @@ export default function NodeResizer({
color,
minWidth = 10,
minHeight = 10,
onResizeStart,
onResize,
onResizeEnd,
}: NodeResizerProps) {
if (!isVisible) {
return null;
@@ -32,6 +35,9 @@ export default function NodeResizer({
color={color}
minWidth={minWidth}
minHeight={minHeight}
onResizeStart={onResizeStart}
onResize={onResize}
onResizeEnd={onResizeEnd}
/>
))}
{handleControls.map((c) => (
@@ -44,6 +50,9 @@ export default function NodeResizer({
color={color}
minWidth={minWidth}
minHeight={minHeight}
onResizeStart={onResizeStart}
onResize={onResize}
onResizeEnd={onResizeEnd}
/>
))}
</>

View File

@@ -31,6 +31,9 @@ function ResizeControl({
color,
minWidth = 10,
minHeight = 10,
onResizeStart,
onResize,
onResizeEnd,
}: ResizeControlProps) {
const contextNodeId = useNodeId();
const id = typeof nodeId === 'string' ? nodeId : contextNodeId;
@@ -65,6 +68,8 @@ function ResizeControl({
pointerX: xSnapped,
pointerY: ySnapped,
};
onResizeStart?.(event, { ...prevValues.current });
})
.on('drag', (event: ResizeDragEvent) => {
const { nodeInternals, triggerNodeChanges } = store.getState();
@@ -135,16 +140,18 @@ function ResizeControl({
prevValues.current.height = height;
}
onResize?.(event, { ...prevValues.current });
triggerNodeChanges(changes);
}
})
.on('end', () => {
.on('end', (event: ResizeDragEvent) => {
const dimensionChange: NodeDimensionChange = {
id: id,
type: 'dimensions',
resizing: true,
resizing: false,
};
onResizeEnd?.(event, { ...prevValues.current });
store.getState().triggerNodeChanges([dimensionChange]);
});

View File

@@ -1,6 +1,13 @@
import type { CSSProperties, ReactNode } from 'react';
import type { D3DragEvent, SubjectPosition } from 'd3-drag';
export type ResizeEventParams = {
x: number;
y: number;
width: number;
height: number;
};
export type NodeResizerProps = {
nodeId?: string;
color?: string;
@@ -11,6 +18,9 @@ export type NodeResizerProps = {
isVisible?: boolean;
minWidth?: number;
minHeight?: number;
onResizeStart?: (event: ResizeDragEvent, params: ResizeEventParams) => void;
onResize?: (event: ResizeDragEvent, params: ResizeEventParams) => void;
onResizeEnd?: (event: ResizeDragEvent, params: ResizeEventParams) => void;
};
export type ControlLinePosition = 'top' | 'bottom' | 'left' | 'right';
@@ -22,16 +32,15 @@ export enum ResizeControlVariant {
Handle = 'handle',
}
export type ResizeControlProps = {
nodeId?: string;
export type ResizeControlProps = Pick<
NodeResizerProps,
'nodeId' | 'color' | 'minWidth' | 'minHeight' | 'onResizeStart' | 'onResize' | 'onResizeEnd'
> & {
position?: ControlPosition;
variant?: ResizeControlVariant;
color?: string;
className?: string;
style?: CSSProperties;
children?: ReactNode;
minWidth?: number;
minHeight?: number;
};
export type ResizeControlLineProps = ResizeControlProps & {