src/amo/components/PromotedBadge/index.js (81 lines of code) (raw):

/* @flow */ import makeClassName from 'classnames'; import * as React from 'react'; import { compose } from 'redux'; import { getPromotedBadgesLinkUrl } from 'amo/utils'; import translate from 'amo/i18n/translate'; import IconPromotedBadge from 'amo/components/IconPromotedBadge'; import type { PromotedBadgeCategory, PromotedBadgeSize, } from 'amo/components/IconPromotedBadge'; import type { I18nType } from 'amo/types/i18n'; import './styles.scss'; export type Props = {| category: PromotedBadgeCategory, onClick?: Function | null, size: PromotedBadgeSize, |}; export type InternalProps = {| ...Props, i18n: I18nType, |}; export const PromotedBadgeBase = ({ category, i18n, onClick = null, size, }: InternalProps): React.Node => { let label; let linkTitle; const linkUrl = getPromotedBadgesLinkUrl({ utm_content: 'promoted-addon-badge', }); switch (category) { case 'line': label = i18n.gettext('By Firefox'); linkTitle = i18n.gettext( 'Official add-on built by Mozilla Firefox. Meets security and performance standards.', ); break; // This is the recommended badge default: label = i18n.gettext('Recommended'); linkTitle = i18n.gettext( 'Firefox only recommends add-ons that meet our standards for security and performance.', ); break; } return ( <div className={makeClassName('PromotedBadge', `PromotedBadge--${category}`, { 'PromotedBadge-large': size === 'large', 'PromotedBadge-small': size === 'small', })} > <a className={makeClassName( 'PromotedBadge-link', `PromotedBadge-link--${category}`, )} href={linkUrl} onClick={onClick} rel="noopener noreferrer" target="_blank" title={linkTitle} > <IconPromotedBadge category={category} size={size} /> <span className={makeClassName( 'PromotedBadge-label', `PromotedBadge-label--${category}`, )} > {label} </span> </a> </div> ); }; const PromotedBadge: React.ComponentType<Props> = compose(translate())( PromotedBadgeBase, ); export default PromotedBadge;