lbry-desktop/ui/component/common/icon.jsx
2021-07-14 13:44:22 -05:00

85 lines
2.1 KiB
JavaScript

// @flow
import * as ICONS from 'constants/icons';
import React from 'react';
import classnames from 'classnames';
import { icons } from './icon-custom';
// It would be nice to standardize this somehow
// These are copied from `scss/vars`, can they both come from the same source?
const RED_COLOR = '#e2495e';
const GREEN_COLOR = '#44b098';
const BLUE_COLOR = '#49b2e2';
type Props = {
icon: string,
tooltip?: boolean,
customTooltipText?: string,
iconColor?: string,
size?: number,
className?: string,
sectionIcon?: boolean,
};
class IconComponent extends React.PureComponent<Props> {
getTooltip = (icon: string) => {
switch (icon) {
case ICONS.REWARDS:
return __('Featured content. Earn rewards for watching.');
case ICONS.DOWNLOAD:
return __('This file is in your library.');
case ICONS.SUBSCRIBE:
return __('You are subscribed to this channel.');
case ICONS.SETTINGS:
return __('Your settings.');
default:
return null;
}
};
getIconColor = (color: string) => {
switch (color) {
case 'red':
return RED_COLOR;
case 'green':
return GREEN_COLOR;
case 'blue':
return BLUE_COLOR;
default:
return color;
}
};
render() {
const { icon, tooltip, customTooltipText, iconColor, size, className, sectionIcon = false, ...rest } = this.props;
const Icon = icons[this.props.icon];
if (!Icon) {
return null;
}
let color;
if (iconColor) {
color = this.getIconColor(iconColor);
}
let tooltipText;
if (tooltip) {
tooltipText = customTooltipText || this.getTooltip(icon);
}
const component = (
<Icon
title={tooltipText}
size={size || (sectionIcon ? 20 : 16)}
className={classnames(`icon icon--${icon}`, className, { 'color-override': iconColor })}
color={color}
aria-hidden
{...rest}
/>
);
return sectionIcon ? <span className={`icon__wrapper icon__wrapper--${icon}`}>{component}</span> : component;
}
}
export default IconComponent;