src/components/PrimaryCtaButton.tsx (72 lines of code) (raw):

import React from 'react'; import { css, ThemeProvider } from '@emotion/react'; import { space } from '@guardian/source/foundations'; import { LinkButton } from '@guardian/source/react-components'; import { PaymentIcons } from './PaymentIcons'; import { TrackClick } from '../utils/tracking'; import { contributionsTheme, PrimaryButtonColorStyles } from '../styles/colorData'; export const defaultPrimaryCtaButtonColors: PrimaryButtonColorStyles = { styleButton: '#ffffff', styleButtonBackground: '#052962', styleButtonHover: '#234b8a', }; const getButtonStyles = (styles: PrimaryButtonColorStyles) => { return { buttonWrapperStyles: css` margin: ${space[1]}px ${space[2]}px ${space[1]}px 0; display: flex; flex-direction: column; flex-wrap: wrap; justify-content: flex-start; align-items: flex-start; max-width: 50%; `, buttonMargins: css` margin: ${space[1]}px ${space[2]}px ${space[1]}px 0; `, contributionButtonOverrides: css` background-color: ${styles.styleButtonBackground} !important; color: ${styles.styleButton} !important; :hover { background-color: ${styles.styleButtonHover} !important; } `, }; }; interface PrimaryCtaButtonProps { buttonText: string; buttonUrl: string; showPaymentIcons: boolean; ophanComponentId: string; trackClick: TrackClick; colors?: PrimaryButtonColorStyles; } export const PrimaryCtaButton = ({ buttonUrl, buttonText, showPaymentIcons, ophanComponentId, trackClick, colors = defaultPrimaryCtaButtonColors, }: PrimaryCtaButtonProps) => { const internalButtonId = 0; const styles = getButtonStyles(colors); const onClick = () => trackClick({ internalButtonId, ophanComponentId }); return ( <div css={styles.buttonWrapperStyles}> <div css={styles.buttonMargins}> <ThemeProvider theme={contributionsTheme}> <LinkButton href={buttonUrl} target="_blank" rel="noopener noreferrer" priority={'primary'} cssOverrides={styles.contributionButtonOverrides} onClick={onClick} > {buttonText} </LinkButton> </ThemeProvider> </div> {showPaymentIcons && <PaymentIcons />} </div> ); };