import { Types } from '@syllepsis/adapter';
import { TOOL_TYPE } from '@syllepsis/editor';
import { isMatchObject } from '@syllepsis/plugin-basic';
import cls from 'classnames';
import React from 'react';
import { Icons, ListItem } from '../../../component';
import { ToolDisplay } from '../utils';
import { IProp } from '.';
import { SelectBase } from './base';
import { getConfigVal } from './button';
class SelectForToolbar extends SelectBase<{
name: IProp['name'];
toolbar: IProp['toolbar'];
type: string;
handler: IProp['handler'];
}> {
isActive = false;
activeIdx = -1;
componentDidMount() {
this.props.editor.configurator.on(`${this.props.groupKey}-close` as any, this.closeMenu);
}
componentWillUnmount() {
this.props.editor.configurator.off(`${this.props.groupKey}-close` as any, this.closeMenu);
}
checkActive = () => {
const {
toolbar: { value },
} = this.props;
this.activeIdx = value.findIndex(({ attrs }: any) => isMatchObject(attrs, this.attrs));
const needActive = value[this.activeIdx] && value[this.activeIdx].needActive;
if (!this.attrs) {
// needs highlight even the `attrs` is false
if (needActive) return true;
else {
this.activeIdx = -1;
return false;
}
}
// by default, the first value of values is the default value
if (!this.activeIdx && (needActive || this.props.type === TOOL_TYPE.DROPDOWN)) {
return true;
} else if (this.activeIdx > 0) {
return true;
}
return false;
};
get attrs() {
const {
toolbar: { getAttrs },
attrs,
editor,
} = this.props;
return getAttrs ? getAttrs(editor) : attrs;
}
get defaultIcon() {
const {
toolbar: { icon, value },
name,
type,
editor,
} = this.props;
if (icon) {
if (typeof icon === 'function') return icon(editor, this.attrs);
const defaultIdx = value.findIndex((item: { default: boolean }) => item.default);
if (value[defaultIdx] && value[defaultIdx].icon) return value[defaultIdx].icon;
return icon;
}
const Icon = Icons[name as keyof typeof Icons];
if (type === TOOL_TYPE.SELECT) {
return Icon && (Icon as JSX.Element[])[0];
}
return Icon;
}
get showName() {
return getConfigVal([this.props.showName, this.props.toolbar.showName]);
}
renderIcon = () => {
const { type, display, toolbar } = this.props;
const icon = type === TOOL_TYPE.SELECT ? this.renderSelectIcon() : this.renderDropDownIcon();
if (display === ToolDisplay.HORIZON && toolbar.showName) {
return (
<>
{icon}
{toolbar.showName}
>
);
}
return icon;
};
renderSelectIcon = () => {
const { toolbar, editor, toolbarType } = this.props;
if (typeof toolbar.icon === 'function') return toolbar.icon(editor, this.attrs, { toolbarType });
if (this.activeIdx < 0) return this.defaultIcon;
return this.renderMenuItem(toolbar.value[this.activeIdx], this.activeIdx) || this.defaultIcon;
};
renderDropDownIcon = () => this.defaultIcon;
renderMenuItem = (value: any, idx = 0) => {
const name = this.props.name as keyof typeof Icons;
if (value.render) {
return value.render({ toolbarType: this.props.toolbarType });
} else if (value.icon !== undefined) {
return (
<>
{value.icon}
{value.text}
>
);
} else if (value.text !== undefined) {
return {value.text};
} else if (Icons[name] && (Icons[name] as JSX.Element[])[idx]) {
return (Icons[name] as JSX.Element[])[idx];
}
};
menuItemClick = (attrs: Types.StringMap) => {
this.closeMenu();
this.props.handler(this.props.editor, this.props.name, attrs);
};
renderMenu = () => {
const {
toolbar: { value },
toolbarType = 'static',
} = this.props;
return value.map((v: any, index: number) => (
this.menuItemClick(v.attrs)}
>
{this.renderMenuItem(v, index)}
));
};
}
export { SelectForToolbar };