refactor(handle): forward ref closes #1458 closes #1385

This commit is contained in:
moklick
2021-09-01 23:04:24 +02:00
parent e744c41821
commit 4a5ceb3fd7
+85 -77
View File
@@ -1,4 +1,4 @@
import React, { memo, useContext, useCallback, FC, HTMLAttributes } from 'react'; import React, { memo, useContext, useCallback, HTMLAttributes, forwardRef } from 'react';
import cc from 'classcat'; import cc from 'classcat';
import { useStoreActions, useStoreState } from '../../store/hooks'; import { useStoreActions, useStoreState } from '../../store/hooks';
@@ -9,95 +9,103 @@ import { onMouseDown, SetSourceIdFunc, SetPosition } from './handler';
const alwaysValid = () => true; const alwaysValid = () => true;
const Handle: FC<HandleProps & Omit<HTMLAttributes<HTMLDivElement>, 'id'>> = ({ export type HandleComponentProps = HandleProps & Omit<HTMLAttributes<HTMLDivElement>, 'id'>;
type = 'source',
position = Position.Top,
isValidConnection = alwaysValid,
isConnectable = true,
id,
onConnect,
children,
className,
...rest
}) => {
const nodeId = useContext(NodeIdContext) as ElementId;
const setPosition = useStoreActions((actions) => actions.setConnectionPosition);
const setConnectionNodeId = useStoreActions((actions) => actions.setConnectionNodeId);
const onConnectAction = useStoreState((state) => state.onConnect);
const onConnectStart = useStoreState((state) => state.onConnectStart);
const onConnectStop = useStoreState((state) => state.onConnectStop);
const onConnectEnd = useStoreState((state) => state.onConnectEnd);
const connectionMode = useStoreState((state) => state.connectionMode);
const handleId = id || null;
const isTarget = type === 'target';
const onConnectExtended = useCallback( const Handle = forwardRef<HTMLDivElement, HandleComponentProps>(
(params: Connection) => { (
onConnectAction?.(params); {
onConnect?.(params); type = 'source',
position = Position.Top,
isValidConnection = alwaysValid,
isConnectable = true,
id,
onConnect,
children,
className,
...rest
}, },
[onConnectAction, onConnect] ref
); ) => {
const nodeId = useContext(NodeIdContext) as ElementId;
const setPosition = useStoreActions((actions) => actions.setConnectionPosition);
const setConnectionNodeId = useStoreActions((actions) => actions.setConnectionNodeId);
const onConnectAction = useStoreState((state) => state.onConnect);
const onConnectStart = useStoreState((state) => state.onConnectStart);
const onConnectStop = useStoreState((state) => state.onConnectStop);
const onConnectEnd = useStoreState((state) => state.onConnectEnd);
const connectionMode = useStoreState((state) => state.connectionMode);
const handleId = id || null;
const isTarget = type === 'target';
const onMouseDownHandler = useCallback( const onConnectExtended = useCallback(
(event: React.MouseEvent) => { (params: Connection) => {
onMouseDown( onConnectAction?.(params);
event, onConnect?.(params);
},
[onConnectAction, onConnect]
);
const onMouseDownHandler = useCallback(
(event: React.MouseEvent) => {
onMouseDown(
event,
handleId,
nodeId,
setConnectionNodeId as unknown as SetSourceIdFunc,
setPosition as unknown as SetPosition,
onConnectExtended,
isTarget,
isValidConnection,
connectionMode,
undefined,
undefined,
onConnectStart,
onConnectStop,
onConnectEnd
);
},
[
handleId, handleId,
nodeId, nodeId,
setConnectionNodeId as unknown as SetSourceIdFunc, setConnectionNodeId,
setPosition as unknown as SetPosition, setPosition,
onConnectExtended, onConnectExtended,
isTarget, isTarget,
isValidConnection, isValidConnection,
connectionMode, connectionMode,
undefined,
undefined,
onConnectStart, onConnectStart,
onConnectStop, onConnectStop,
onConnectEnd onConnectEnd,
); ]
}, );
[
handleId,
nodeId,
setConnectionNodeId,
setPosition,
onConnectExtended,
isTarget,
isValidConnection,
connectionMode,
onConnectStart,
onConnectStop,
onConnectEnd,
]
);
const handleClasses = cc([ const handleClasses = cc([
'react-flow__handle', 'react-flow__handle',
`react-flow__handle-${position}`, `react-flow__handle-${position}`,
'nodrag', 'nodrag',
className, className,
{ {
source: !isTarget, source: !isTarget,
target: isTarget, target: isTarget,
connectable: isConnectable, connectable: isConnectable,
}, },
]); ]);
return ( return (
<div <div
data-handleid={handleId} data-handleid={handleId}
data-nodeid={nodeId} data-nodeid={nodeId}
data-handlepos={position} data-handlepos={position}
className={handleClasses} className={handleClasses}
onMouseDown={onMouseDownHandler} onMouseDown={onMouseDownHandler}
{...rest} ref={ref}
> {...rest}
{children} >
</div> {children}
); </div>
}; );
}
);
Handle.displayName = 'Handle'; Handle.displayName = 'Handle';