1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-27 10:32:58 +02:00
joplin/packages/app-desktop/gui/ToolbarButton/ToolbarButton.tsx

64 lines
1.8 KiB
TypeScript
Raw Normal View History

2020-09-15 15:01:07 +02:00
import * as React from 'react';
import { ToolbarButtonInfo } from '@joplin/lib/services/commands/ToolbarButtonUtils';
2020-09-15 15:01:07 +02:00
import { StyledRoot, StyledIconSpan, StyledIconI } from './styles';
interface Props {
readonly themeId: number;
readonly toolbarButtonInfo?: ToolbarButtonInfo;
readonly title?: string;
readonly tooltip?: string;
readonly iconName?: string;
readonly disabled?: boolean;
readonly backgroundHover?: boolean;
2020-09-15 15:01:07 +02:00
}
function isFontAwesomeIcon(iconName: string) {
2020-09-15 15:01:07 +02:00
const s = iconName.split(' ');
return s.length === 2 && ['fa', 'fas'].includes(s[0]);
}
function getProp(props: Props, name: string, defaultValue: any = null) {
2020-09-15 15:01:07 +02:00
if (props.toolbarButtonInfo && (name in props.toolbarButtonInfo)) return (props.toolbarButtonInfo as any)[name];
if (!(name in props)) return defaultValue;
return (props as any)[name];
}
export default function ToolbarButton(props: Props) {
2020-09-15 15:01:07 +02:00
const title = getProp(props, 'title', '');
const tooltip = getProp(props, 'tooltip', title);
let icon = null;
const iconName = getProp(props, 'iconName');
if (iconName) {
const IconClass = isFontAwesomeIcon(iconName) ? StyledIconI : StyledIconSpan;
icon = <IconClass className={iconName} title={title}/>;
}
// Keep this for legacy compatibility but for consistency we should use "disabled" prop
let isEnabled = getProp(props, 'enabled', null);
if (isEnabled === null) isEnabled = true;
if (props.disabled) isEnabled = false;
const classes = ['button'];
if (!isEnabled) classes.push('disabled');
const onClick = getProp(props, 'onClick');
return (
<StyledRoot
className={classes.join(' ')}
disabled={!isEnabled}
title={tooltip}
href="#"
hasTitle={!!title}
onClick={() => {
if (isEnabled && onClick) onClick();
}}
>
{icon}
{title}
</StyledRoot>
);
}