lbry-desktop/src/ui/component/common/icon.jsx

103 lines
2.3 KiB
React
Raw Normal View History

2018-03-26 23:32:43 +02:00
// @flow
2018-11-26 02:21:25 +01:00
import * as ICONS from 'constants/icons';
2018-03-26 23:32:43 +02:00
import React from 'react';
import Tooltip from 'component/common/tooltip';
import { customIcons } from './icon-custom';
2018-03-26 23:32:43 +02:00
2019-03-27 05:40:02 +01:00
let featherIcons = false;
const featherIconsPromise = import(/* webpackChunkName: "react-feather" */
/* webpackPrefetch: true */
'react-feather').then(result => (featherIcons = result));
const LazyFeatherIcons = new Proxy(
{},
{
get(target, name) {
if (featherIcons) {
return featherIcons[name];
}
return React.lazy(() =>
featherIconsPromise.then(featherIcons => ({ default: featherIcons[name] }))
);
},
}
);
// It would be nice to standardize this somehow
// These are copied from `scss/vars`, can they both come from the same source?
2018-03-26 23:32:43 +02:00
const RED_COLOR = '#e2495e';
const GREEN_COLOR = '#44b098';
2018-09-12 18:42:15 +02:00
const BLUE_COLOR = '#49b2e2';
2018-03-26 23:32:43 +02:00
type Props = {
icon: string,
tooltip?: string, // tooltip direction
iconColor?: string,
2018-10-09 17:01:54 +02:00
size?: number,
2018-03-26 23:32:43 +02:00
};
class IconComponent extends React.PureComponent<Props> {
getTooltip = (icon: string) => {
switch (icon) {
2018-11-26 02:21:25 +01:00
case ICONS.FEATURED:
return __('Featured content. Earn rewards for watching.');
2018-11-26 02:21:25 +01:00
case ICONS.LOCAL:
return __('This file is downloaded.');
default:
return null;
}
};
getIconColor = (color: string) => {
switch (color) {
case 'red':
return RED_COLOR;
case 'green':
return GREEN_COLOR;
2018-09-12 18:42:15 +02:00
case 'blue':
return BLUE_COLOR;
default:
return undefined;
}
};
2018-03-26 23:32:43 +02:00
render() {
2018-10-09 17:01:54 +02:00
const { icon, tooltip, iconColor, size } = this.props;
2019-03-27 05:40:02 +01:00
const Icon = customIcons[this.props.icon] || LazyFeatherIcons[this.props.icon];
if (!Icon) {
return null;
}
2018-03-26 23:32:43 +02:00
let color;
if (iconColor) {
color = this.getIconColor(iconColor);
2018-03-26 23:32:43 +02:00
}
const iconSize = size || 14;
2018-03-26 23:32:43 +02:00
let tooltipText;
if (tooltip) {
tooltipText = this.getTooltip(icon);
}
2019-03-27 05:40:02 +01:00
const inner = (
<React.Suspense
fallback={<svg height={iconSize} width={iconSize} className="icon" color={color} />}
>
<Icon size={iconSize} className="icon" color={color} />
</React.Suspense>
);
2018-06-21 00:15:57 +02:00
return tooltipText ? (
<Tooltip icon body={tooltipText} direction={tooltip}>
{inner}
</Tooltip>
) : (
inner
);
2018-03-26 23:32:43 +02:00
}
}
export default IconComponent;