import { Switch as OldSwicth, SwitchProps, ConfigProvider } from 'antd'; import React, { useContext, useEffect, useState } from 'react'; import './index.less'; import classNames from 'classnames'; import { Icon } from '../Icon'; import { AOP } from '../utils/AOP'; import { SwitchChangeEventHandler } from 'antd/lib/switch'; interface ExtraProps { type?: 'round' | 'rect' | 'line'; } const Switch = (props: SwitchProps & ExtraProps) => { // 为了与 antd 的生态保持兼容性,我们要求必须要使用 `.@{ant-prefix}` 变量来生成类名 const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const prefixCls = getPrefixCls('btri-switch'); const { type = 'round', defaultChecked = false, loading, ...res } = props; const [check, setCheck] = useState(defaultChecked); //@ts-ignore const newOnChange: SwitchChangeEventHandler = new AOP(props.onChange) .before((checkVal) => { if (props.checked === undefined && !props.loading) { setCheck(checkVal as boolean); } }) .getFunction(); useEffect(() => { setCheck(defaultChecked); }, [defaultChecked]); useEffect(() => { if (typeof props.checked === 'boolean') { setCheck(props.checked); } }, [props.checked]); return ( <> {type === 'line' && ( { if (props.checked === undefined) { setCheck((preCheck) => !preCheck); props.onChange?.(!check, e as any); } }} className={classNames( `${prefixCls}-check-box`, check ? `${prefixCls}-check` : `${prefixCls}-unCheck`, )} spin={loading} iconName={loading ? 'Loading' : check ? 'CheckSmall' : 'CloseSmall'} > )} {loading && type !== 'line' && ( )} ); }; export { Switch };