All files / src/pages/VisProgPage/visualProgrammingUI/components RuleBasedHandle.tsx

0% Statements 0/18
0% Branches 0/10
0% Functions 0/4
0% Lines 0/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89                                                                                                                                                                                 
import {
  Handle,
  type HandleProps,
  type Connection,
  useNodeId, useNodeConnections
} from '@xyflow/react';
import {useState} from 'react';
import { type HandleRule, useHandleRules} from "../HandleRuleLogic.ts";
import "./RuleBasedHandle.module.css";
 
 
 
export function MultiConnectionHandle({
  id,
  type,
  rules = [],
  ...otherProps
} : HandleProps & { rules?: HandleRule[]}) {
  let nodeId = useNodeId();
  // this check is used to make sure that the handle code doesn't break when used inside a test,
  // since useNodeId would be undefined if the handle is not used inside a node
  nodeId = nodeId ? nodeId : "mockId";
  const validate = useHandleRules(nodeId, id!, type!, rules);
 
 
  const connections = useNodeConnections({
    id: nodeId,
    handleType: type,
    handleId: id!
  })
 
  // initialise the handles state with { isValid: true } to show that connections are possible
  const [handleState, setHandleState] = useState<{ isSatisfied: boolean, message?: string }>({ isSatisfied: true });
 
  return (
    <Handle
      {...otherProps}
      id={id}
      type={type}
      className={"multiConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected")}
      isValidConnection={(connection) => {
        const result = validate(connection as Connection);
        setHandleState(result);
        return result.isSatisfied;
      }}
      title={handleState.message}
    />
  );
}
 
export function SingleConnectionHandle({
  id,
  type,
  rules = [],
  ...otherProps
} : HandleProps & { rules?: HandleRule[]}) {
  let nodeId = useNodeId();
  // this check is used to make sure that the handle code doesn't break when used inside a test,
  // since useNodeId would be undefined if the handle is not used inside a node
  nodeId = nodeId ? nodeId : "mockId";
  const validate = useHandleRules(nodeId, id!, type!, rules);
 
  const connections = useNodeConnections({
    id: nodeId,
    handleType: type,
    handleId: id!
  })
 
  // initialise the handles state with { isValid: true } to show that connections are possible
  const [handleState, setHandleState] = useState<{ isSatisfied: boolean, message?: string }>({ isSatisfied: true });
 
  return (
    <Handle
      {...otherProps}
      id={id}
      type={type}
      className={"singleConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected")}
      isConnectable={connections.length === 0}
      isValidConnection={(connection) => {
        const result = validate(connection as Connection);
        setHandleState(result);
        return result.isSatisfied;
      }}
      title={handleState.message}
    />
  );
}