import React, { PureComponent, Fragment } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import AppContext from '@ali/iceluna-sdk/lib/context/appContext'; import { Balloon, Dialog, Icon, Badge } from '@alife/next'; import './index.scss'; export default class LeftAddon extends PureComponent { static displayName = 'LunaLeftAddon'; static propTypes = { active: PropTypes.bool, config: PropTypes.shape({ addonKey: PropTypes.string, addonProps: PropTypes.object, props: PropTypes.object, type: PropTypes.oneOf([ 'DialogIcon', 'BalloonIcon', 'PanelIcon', 'LinkIcon', 'Icon', 'Custom', ]), }), disabled: PropTypes.bool, dotted: PropTypes.bool, locked: PropTypes.bool, onClick: PropTypes.func, }; static defaultProps = { active: false, config: {}, disabled: false, dotted: false, locked: false, onClick: () => {}, }; static contextType = AppContext; constructor(props, context) { super(props, context); this.state = { dialogVisible: false, }; this.appHelper = context.appHelper; this.utils = this.appHelper.utils; this.constants = this.appHelper.constants; } componentDidMount() { const { config } = this.props; const addonKey = config && config.addonKey; const appHelper = this.appHelper; if (appHelper && addonKey) { appHelper.on(`${addonKey}.dialog.show`, this.handleShow); appHelper.on(`${addonKey}.dialog.close`, this.handleClose); } } componentWillUnmount() { const { config } = this.props; const appHelper = this.appHelper; const addonKey = config && config.addonKey; if (appHelper && addonKey) { appHelper.off(`${addonKey}.dialog.show`, this.handleShow); appHelper.off(`${addonKey}.dialog.close`, this.handleClose); } } handleClose = () => { const addonKey = this.props.config && this.props.config.addonKey; const currentAddon = this.appHelper.addons && this.appHelper.addons[addonKey]; if (currentAddon) { this.utils.transformToPromise(currentAddon.close()).then(() => { this.setState({ dialogVisible: false, }); }); } }; handleOpen = () => { // todo 对话框类型的插件初始时拿不到插件实例 this.setState({ dialogVisible: true, }); }; handleShow = () => { const { disabled, config, onClick } = this.props; const addonKey = config && config.addonKey; if (disabled || !addonKey) return; //考虑到弹窗情况,延时发送消息 setTimeout(() => this.appHelper.emit(`${addonKey}.addon.activate`), 0); this.handleOpen(); onClick && onClick(); }; renderIcon = clickCallback => { const { active, disabled, dotted, locked, onClick, config } = this.props; const { addonKey, props } = config || {}; const { icon, title } = props || {}; return (