blob: e7b21867081378baeac77ff10293d16b023c9dd9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { FC, useContext, useEffect } from 'react';
import { Dropdown, Button } from 'react-bootstrap';
import { EditorContext } from './EditorContext';
import { IEditorContext } from './types';
interface IProps {
keyMap?: string[];
onClick?: ({
editor,
wrapText,
replaceLines,
appendBlock,
}: IEditorContext) => void;
tip?: string;
className?: string;
as?: any;
children?;
label?: string;
disable?: boolean;
isShow?: boolean;
onBlur?: ({
editor,
wrapText,
replaceLines,
appendBlock,
}: IEditorContext) => void;
}
const ToolItem: FC<IProps> = (props) => {
const editor = useContext(EditorContext);
const {
label,
tip,
disable = false,
isShow,
keyMap,
onClick,
className,
as,
children,
onBlur,
} = props;
useEffect(() => {
if (!editor) {
return;
}
if (!keyMap) {
return;
}
keyMap.forEach((key) => {
editor?.addKeyMap({
[key]: () => {
onClick?.({
editor,
wrapText: editor?.wrapText,
replaceLines: editor?.replaceLines,
appendBlock: editor?.appendBlock,
});
},
});
});
}, [editor]);
const btnRender = () => (
<Button
variant="link"
title={tip}
className={`p-0 b-0 btn-no-border toolbar text-body ${
disable ? 'disabled' : ''
}`}
disabled={disable}
tabIndex={-1}
onClick={(e) => {
console.log('onClick', e);
e.preventDefault();
onClick?.({
editor,
wrapText: editor?.wrapText,
replaceLines: editor?.replaceLines,
appendBlock: editor?.appendBlock,
});
}}
onBlur={(e) => {
e.preventDefault();
onBlur?.({
editor,
wrapText: editor?.wrapText,
replaceLines: editor?.replaceLines,
appendBlock: editor?.appendBlock,
});
}}>
<i className={`bi bi-${label}`} />
</Button>
);
if (!editor) {
return null;
}
return (
<div className={`toolbar-item-wrap ${className || ''}`}>
{as === 'dropdown' ? (
<Dropdown className="h-100 w-100" show={isShow}>
<Dropdown.Toggle as="div" className="h-100">
{btnRender()}
</Dropdown.Toggle>
{children}
</Dropdown>
) : (
<>
{btnRender()}
{children}
</>
)}
</div>
);
};
export default ToolItem;