@ant-design/x
Version:
Craft AI-driven interfaces effortlessly
165 lines • 5.03 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { CloseCircleFilled, LeftOutlined, RightOutlined } from '@ant-design/icons';
import { CSSMotionList } from '@rc-component/motion';
import ResizeObserver from '@rc-component/resize-observer';
import { Button } from 'antd';
import { clsx } from 'clsx';
import React from 'react';
import { useXProviderContext } from "../x-provider";
import FileCard from "./FileCard";
import useStyle from "./style";
const List = props => {
const {
prefixCls: customizePrefixCls,
className,
rootClassName,
classNames = {},
style,
styles = {},
items,
size,
removable,
onRemove,
extension,
overflow
} = props;
const containerRef = React.useRef(null);
const [list, setList] = React.useState([]);
React.useEffect(() => {
const list = items.map((item, index) => ({
...item,
key: item.key || `${item.name}-${index}`
}));
setList(list);
}, [items]);
const {
direction,
getPrefixCls
} = useXProviderContext();
const prefixCls = getPrefixCls('file-card', customizePrefixCls);
const [hashId, cssVarCls] = useStyle(prefixCls);
const compCls = `${prefixCls}-list`;
const [pingStart, setPingStart] = React.useState(false);
const [pingEnd, setPingEnd] = React.useState(false);
const {
root: classNameRoot,
card: classNameCard,
...classNameOther
} = classNames;
const mergedCls = clsx(compCls, rootClassName, className, classNameRoot, hashId, cssVarCls, {
[`${prefixCls}-rtl`]: direction === 'rtl'
});
const checkPing = () => {
const containerEle = containerRef.current;
if (!containerEle) {
return;
}
if (overflow === 'scrollX') {
setPingStart(Math.abs(containerEle.scrollLeft) >= 1);
setPingEnd(containerEle.scrollWidth - containerEle.clientWidth - Math.abs(containerEle.scrollLeft) >= 1);
} else if (overflow === 'scrollY') {
setPingStart(containerEle.scrollTop !== 0);
setPingEnd(containerEle.scrollHeight - containerEle.clientHeight !== containerEle.scrollTop);
}
};
const onScrollOffset = offset => {
const containerEle = containerRef.current;
if (containerEle) {
containerEle.scrollTo({
left: containerEle.scrollLeft + offset * containerEle.clientWidth,
behavior: 'smooth'
});
}
};
const onScrollLeft = () => {
onScrollOffset(-1);
};
const onScrollRight = () => {
onScrollOffset(1);
};
const handleRemove = (item, key) => {
const newList = list?.filter(i => i.key !== key);
setList(newList);
onRemove?.(item);
};
const {
root,
card: _,
...other
} = styles;
return /*#__PURE__*/React.createElement("div", {
className: clsx(mergedCls)
}, /*#__PURE__*/React.createElement(ResizeObserver, {
disabled: !overflow || overflow === 'wrap',
onResize: () => {
checkPing();
}
}, /*#__PURE__*/React.createElement("div", {
className: clsx(`${compCls}-content`, {
[`${compCls}-overflow-${props.overflow}`]: overflow,
[`${compCls}-overflow-ping-start`]: pingStart,
[`${compCls}-overflow-ping-end`]: pingEnd,
[`${compCls}-small`]: size === 'small'
}),
dir: direction,
style: {
...style,
...styles?.root
},
ref: containerRef,
onScroll: checkPing
}, /*#__PURE__*/React.createElement(CSSMotionList, {
keys: list.map(item => ({
key: item.key,
item
})),
motionName: `${compCls}-motion`,
component: false,
motionAppear: false,
motionLeave: true,
motionEnter: true
}, ({
key,
item,
className: motionCls,
style: motionStyle
}) => {
return /*#__PURE__*/React.createElement("div", {
className: clsx(`${compCls}-item`, motionCls),
style: {
...motionStyle,
...root
},
key: key
}, /*#__PURE__*/React.createElement(FileCard, _extends({}, item, {
size: size,
key: key,
className: clsx(item.className, classNameCard),
classNames: {
...classNameOther,
...item.classNames
},
style: {
...item.style,
...styles?.card
},
styles: other
})), (typeof removable === 'function' ? removable(item) : removable) && /*#__PURE__*/React.createElement("div", {
className: `${compCls}-remove`,
onClick: () => handleRemove(item, key)
}, /*#__PURE__*/React.createElement(CloseCircleFilled, null)));
}), overflow === 'scrollX' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
size: "small",
shape: "circle",
className: `${compCls}-prev-btn`,
icon: /*#__PURE__*/React.createElement(LeftOutlined, null),
onClick: onScrollLeft
}), /*#__PURE__*/React.createElement(Button, {
size: "small",
shape: "circle",
className: `${compCls}-next-btn`,
icon: /*#__PURE__*/React.createElement(RightOutlined, null),
onClick: onScrollRight
})), extension)));
};
export default List;