import * as React from "react"; import classNames from "classnames"; // @ts-ignore import Animated from "rc-animate/lib/CSSMotion"; import TreeNode, { TreeNodeProps } from "./tree-node"; import { FlattenNode } from "./interface"; import { getTreeNodeProps, TreeNodeRequiredProps } from "./utils/tree-util"; import { TreeContext } from "./context-types"; interface MotionTreeNodeProps extends Omit { active: boolean; motion?: any; motionNodes?: FlattenNode[]; onMotionEnd: () => void; motionType?: "show" | "hide"; treeNodeRequiredProps: TreeNodeRequiredProps; } //Motion Tree Node component const MotionTreeNode: React.FC = ( { className, style, motion, motionNodes, motionType, onMotionEnd: onOriginMotionEnd, active, treeNodeRequiredProps, ...props }, ref ) => { const [visible, setVisible] = React.useState(true); const { prefixCls } = React.useContext(TreeContext); const motionedRef = React.useRef(false); const onMotionEnd = () => { if (!motionedRef.current) { onOriginMotionEnd(); } motionedRef.current = true; }; React.useEffect(() => { if (motionNodes && motionType === "hide" && visible) { setVisible(false); } }, [motionNodes]); React.useEffect( () => () => { if (motionNodes) { onMotionEnd(); } }, [] ); if (motionNodes) { return ( {({ className: motionClassName, style: motionStyle }, motionRef) => (
{motionNodes.map((treeNode: FlattenNode) => { const { data: { key, ...restProps }, isStart, isEnd, } = treeNode; delete restProps.children; const treeNodeProps = getTreeNodeProps( key, treeNodeRequiredProps ); return ( ); })}
)}
); } return ( ); }; MotionTreeNode.displayName = "MotionTreeNode"; const RefMotionTreeNode = React.forwardRef(MotionTreeNode); export { RefMotionTreeNode };