UNPKG

@ant-design/x

Version:

Craft AI-driven interfaces effortlessly

109 lines (104 loc) 3.73 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import { LeftOutlined, RightOutlined } from '@ant-design/icons'; import CSSMotion from '@rc-component/motion'; import pickAttrs from '@rc-component/util/lib/pickAttrs'; import { clsx } from 'clsx'; import React from 'react'; import { useXProviderContext } from "../x-provider"; import Status from "./Status"; // ================= ThoughtChainContext ==================== export const ThoughtChainContext = /*#__PURE__*/React.createContext(null); const ThoughtChainNode = props => { // ================= info ==================== const id = React.useId(); const { info = {}, line, index, className, ...restProps } = props; const domProps = pickAttrs(restProps, { attr: true, aria: true, data: true }); const { prefixCls, expandedKeys, collapseMotion, onItemExpand, classNames = {}, styles = {} } = React.useContext(ThoughtChainContext) || {}; const { direction } = useXProviderContext(); const { collapsible, key = id, icon, blink, title, content, footer, status, description } = info; // ============================ Style ============================ const nodeCls = `${prefixCls}-node`; // ============================ Content Open ============================ const contentOpen = expandedKeys?.includes(key) ?? false; let iconNode = /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-index-icon`) }, index + 1); iconNode = icon === false ? null : icon || iconNode; // ============================ Render ============================ return /*#__PURE__*/React.createElement("div", _extends({}, domProps, { className: clsx(nodeCls, className, classNames.item), style: props.style }), iconNode && /*#__PURE__*/React.createElement(Status, { className: clsx(`${nodeCls}-icon`, classNames.itemIcon, { [`${nodeCls}-icon-${line}`]: typeof line !== 'boolean' }), style: styles.itemIcon, prefixCls: prefixCls, icon: iconNode, status: status }), /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-box`) }, /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-header`, classNames.itemHeader), style: styles.itemHeader }, /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-title`, { [`${nodeCls}-collapsible`]: collapsible, [`${prefixCls}-motion-blink`]: blink }), onClick: collapsible ? () => onItemExpand?.(key) : undefined }, title, collapsible && content && (direction === 'rtl' ? /*#__PURE__*/React.createElement(LeftOutlined, { className: `${nodeCls}-collapse-icon`, rotate: contentOpen ? -90 : 0 }) : /*#__PURE__*/React.createElement(RightOutlined, { className: `${nodeCls}-collapse-icon`, rotate: contentOpen ? 90 : 0 }))), description && /*#__PURE__*/React.createElement("div", { className: `${nodeCls}-description` }, description)), content && /*#__PURE__*/React.createElement(CSSMotion, _extends({}, collapseMotion, { visible: collapsible ? contentOpen : true }), ({ className: motionClassName, style }, motionRef) => /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-content`, motionClassName), ref: motionRef, style: style }, /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-content-box`, classNames.itemContent), style: styles.itemContent }, content))), footer && /*#__PURE__*/React.createElement("div", { className: clsx(`${nodeCls}-footer`, classNames.itemFooter), style: styles.itemFooter }, footer))); }; export default ThoughtChainNode;