ant-design/components/timeline/Timeline.tsx

72 lines
2.1 KiB
TypeScript
Raw Normal View History

import * as React from 'react';
import classNames from 'classnames';
import { devUseWarning } from '../_util/warning';
import { ConfigContext } from '../config-provider';
// CSSINJS
import useStyle from './style';
import useCSSVar from './style/cssVar';
import useCSSVarCls from '../config-provider/hooks/useCSSVarCls';
2022-06-22 14:57:09 +08:00
import type { TimelineItemProps } from './TimelineItem';
import TimelineItem from './TimelineItem';
import TimelineItemList from './TimelineItemList';
import useItems from './useItems';
2016-07-09 10:53:40 +08:00
export interface TimelineProps {
2016-12-19 15:19:15 +08:00
prefixCls?: string;
className?: string;
rootClassName?: string;
2016-07-13 11:14:24 +08:00
/** 指定最后一个幽灵节点是否存在或内容 */
pending?: React.ReactNode;
pendingDot?: React.ReactNode;
2016-07-13 11:14:24 +08:00
style?: React.CSSProperties;
reverse?: boolean;
mode?: 'left' | 'alternate' | 'right';
items?: TimelineItemProps[];
children?: React.ReactNode;
2016-07-09 10:53:40 +08:00
}
2016-07-13 17:22:23 +08:00
type CompoundedComponent = React.FC<TimelineProps> & {
Item: React.FC<TimelineItemProps>;
};
2016-03-31 17:46:35 +08:00
const Timeline: CompoundedComponent = (props) => {
const { getPrefixCls, direction, timeline } = React.useContext(ConfigContext);
const { prefixCls: customizePrefixCls, children, items, className, style, ...restProps } = props;
const prefixCls = getPrefixCls('timeline', customizePrefixCls);
// =================== Warning =====================
if (process.env.NODE_ENV !== 'production') {
const warning = devUseWarning('Timeline');
warning.deprecated(!children, 'Timeline.Item', 'items');
}
// Style
const [, hashId] = useStyle(prefixCls);
const rootCls = useCSSVarCls(prefixCls);
const wrapCSSVar = useCSSVar(rootCls);
const mergedItems: TimelineItemProps[] = useItems(items, children);
return wrapCSSVar(
<TimelineItemList
{...restProps}
className={classNames(timeline?.className, className, rootCls)}
style={{ ...timeline?.style, ...style }}
prefixCls={prefixCls}
direction={direction}
items={mergedItems}
hashId={hashId}
/>,
);
};
Timeline.Item = TimelineItem;
if (process.env.NODE_ENV !== 'production') {
Timeline.displayName = 'Timeline';
}
export default Timeline;