client/components/mma/accountoverview/PersonalisedHeader.tsx (80 lines of code) (raw):

import { css } from '@emotion/react'; import { from, headlineBold24, headlineBold34, headlineMedium17, space, } from '@guardian/source/foundations'; import { min } from 'date-fns'; import { dateString } from '@/shared/dates'; import type { MPAPIResponse } from '@/shared/mpapiResponse'; import type { MembersDataApiResponse } from '@/shared/productResponse'; import { isObserverProduct } from '@/shared/productResponse'; import { isProduct } from '@/shared/productResponse'; interface PersonalisedHeaderProps { mdapiResponse: MembersDataApiResponse; mpapiResponse: MPAPIResponse; } function calculateTimeOfDay() { const currentHour = new Date().getHours(); if (currentHour < 12) { return 'Good morning'; } if (currentHour < 18) { return 'Good afternoon'; } return 'Good evening'; } export const PersonalisedHeader = ({ mdapiResponse, mpapiResponse, }: PersonalisedHeaderProps) => { const userDetails = mdapiResponse.user; if ( !userDetails || (mdapiResponse.products.length === 0 && mpapiResponse.subscriptions.length === 0) ) { return null; } const productDetails = mdapiResponse.products.filter(isProduct); const oldestDate = min([ ...productDetails.map((p) => new Date(p.joinDate)), ...mpapiResponse.subscriptions.map((s) => new Date(s.from)), ]); const supportStartYear = dateString(oldestDate, 'MMMM yyyy'); const onlyHasObserverProducts = mpapiResponse.subscriptions.length === 0 && productDetails.every(isObserverProduct); return ( <hgroup css={css` margin-top: ${space[6]}px; ${from.tablet} { margin-top: ${space[8]}px; } `} > <h2 css={css` ${headlineBold24}; ${from.tablet} { ${headlineBold34}; } margin-bottom: 0; `} data-qm-masking="blocklist" > {calculateTimeOfDay()}, {userDetails.firstName ?? 'supporter'} </h2> {!onlyHasObserverProducts && ( <p css={css` ${headlineMedium17}; `} > Thank you for funding the Guardian since {supportStartYear} </p> )} </hgroup> ); };