@hitachivantara/uikit-react-lab
Version:
Contributed React components for the NEXT UI Kit.
158 lines (157 loc) • 4.85 kB
JavaScript
"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const jsxRuntime = require("react/jsx-runtime");
const react = require("react");
const uid = require("uid");
const uikitReactCore = require("@hitachivantara/uikit-react-core");
const uikitReactIcons = require("@hitachivantara/uikit-react-icons");
const uikitStyles = require("@hitachivantara/uikit-styles");
const NodeMetaContext = require("../FlowContext/NodeMetaContext.cjs");
const utils = require("../Node/utils.cjs");
const useFlowContext = require("./useFlowContext.cjs");
const useFlowInstance = require("./useFlowInstance.cjs");
const useFlowNode = require("./useFlowNode.cjs");
const DEFAULT_LABELS = {
deleteActionLabel: "Delete",
duplicateActionLabel: "Duplicate"
};
function useHvNode(props) {
const {
id,
title: titleProp,
icon: iconProp,
color: colorProp,
subtitle: subtitleProp,
nodeActions: nodeActionsProp,
inputs: inputsProp,
outputs: outputsProp,
groupId,
labels: labelsProps,
nodeToolbarProps
} = props;
const { registerNode, unregisterNode } = NodeMetaContext.useNodeMetaRegistry();
const labels = uikitReactCore.useLabels(DEFAULT_LABELS, labelsProps);
const inputs = react.useMemo(() => utils.identifyHandles(inputsProp), [inputsProp]);
const inputEdges = useFlowNode.useFlowNodeInputEdges();
const outputs = react.useMemo(() => utils.identifyHandles(outputsProp), [outputsProp]);
const outputEdges = useFlowNode.useFlowNodeOutputEdges();
const { nodeGroups } = useFlowContext.useFlowContext();
const intersections = useFlowNode.useFlowNodeIntersections();
const { setNodeParent, setNodeData } = useFlowNode.useFlowNodeUtils();
const node = useFlowNode.useFlowNode();
const reactFlowInstance = useFlowInstance.useFlowInstance();
const nodeGroup = groupId && nodeGroups && nodeGroups[groupId] || void 0;
const title = titleProp || nodeGroup?.label;
const icon = iconProp || nodeGroup?.icon;
const color = uikitStyles.getColor(colorProp || nodeGroup?.color);
const iconColor = react.isValidElement(icon) ? uikitStyles.getColor(icon.props.color || "base_dark") : uikitStyles.getColor("base_dark");
const subtitle = subtitleProp || node?.data.nodeLabel;
const [showActions, setShowActions] = react.useState(false);
const toggleShowActions = react.useCallback(() => {
setShowActions(!showActions);
}, [showActions]);
const getNodeToolbarProps = react.useCallback(
() => ({
offset: 0,
isVisible: showActions,
...nodeToolbarProps
}),
[nodeToolbarProps, showActions]
);
const nodeActions = react.useMemo(
() => nodeActionsProp || [
{ id: "delete", label: labels?.deleteActionLabel, icon: /* @__PURE__ */ jsxRuntime.jsx(uikitReactIcons.Delete, {}) },
{
id: "duplicate",
label: labels?.duplicateActionLabel,
icon: /* @__PURE__ */ jsxRuntime.jsx(uikitReactIcons.Duplicate, {})
}
],
[labels?.deleteActionLabel, labels?.duplicateActionLabel, nodeActionsProp]
);
react.useEffect(() => {
registerNode(id, {
label: title || "",
inputs,
outputs
});
return () => unregisterNode(id);
}, [id, title, inputs, outputs, registerNode, unregisterNode]);
const handleDefaultAction = react.useCallback(
(action) => {
if (!node) return;
if (action.callback) {
action.callback(node);
return;
}
switch (action.id) {
case "delete":
reactFlowInstance.deleteElements({ nodes: [node] });
break;
case "duplicate":
reactFlowInstance.addNodes([
{
...node,
id: uid.uid(),
position: {
x: node.position.x,
y: node.position.y + (node.height || 0) + 20
},
selected: false,
zIndex: Number(uikitStyles.theme.zIndices.overlay)
}
]);
break;
}
},
[node, reactFlowInstance]
);
return react.useMemo(
() => ({
// state
id,
title,
icon,
color,
iconColor,
subtitle,
inputs,
inputEdges,
outputs,
outputEdges,
node,
nodeActions,
showActions,
intersections,
// prop getters
getNodeToolbarProps,
// actions
toggleShowActions,
handleDefaultAction,
setNodeData,
setNodeParent
}),
[
id,
title,
icon,
color,
iconColor,
subtitle,
inputs,
inputEdges,
outputs,
outputEdges,
node,
nodeActions,
showActions,
intersections,
getNodeToolbarProps,
toggleShowActions,
handleDefaultAction,
setNodeData,
setNodeParent
]
);
}
exports.useHvNode = useHvNode;