ant-design/components/button/LoadingIcon.tsx
二货机器人 410de6112f
fix: Button loading switch animation (#23102)
* init

* motion it

* update snapshot

* adjust speed

* update snapshot

* Update index.less

* fix opacity mask

Co-authored-by: 偏右 <afc163@gmail.com>
2020-04-10 15:39:07 +08:00

53 lines
1.4 KiB
TypeScript

import * as React from 'react';
import classNames from 'classnames';
import CSSMotion from 'rc-animate/lib/CSSMotion';
import LoadingOutlined from '@ant-design/icons/LoadingOutlined';
export interface LoadingIconProps {
prefixCls: string;
existIcon: boolean;
loading?: boolean | object;
}
const getCollapsedWidth = () => ({ width: 0, opacity: 0, transform: 'scale(0)' });
const getRealWidth = (node: HTMLElement) => ({
width: node.scrollWidth,
opacity: 1,
transform: 'scale(1)',
});
export default function LoadingIcon({ prefixCls, loading, existIcon }: LoadingIconProps) {
const visible = !!loading;
if (existIcon) {
return (
<span className={`${prefixCls}-loading-icon`}>
<LoadingOutlined />
</span>
);
}
return (
<CSSMotion
visible={visible}
// We do not really use this motionName
motionName={`${prefixCls}-loading-icon-motion`}
removeOnLeave
onAppearStart={getCollapsedWidth}
onAppearActive={getRealWidth}
onEnterStart={getCollapsedWidth}
onEnterActive={getRealWidth}
onLeaveStart={getRealWidth}
onLeaveActive={getCollapsedWidth}
>
{({ className, style }: { className: string; style: React.CSSProperties }, ref: any) => {
return (
<span className={`${prefixCls}-loading-icon`} style={style} ref={ref}>
<LoadingOutlined className={classNames(className)} />
</span>
);
}}
</CSSMotion>
);
}