client/components/mma/accountoverview/CancelledProductCard.tsx (126 lines of code) (raw):
import { css } from '@emotion/react';
import { LinkButton, Stack } from '@guardian/source/react-components';
import { InfoSummary } from '@guardian/source-development-kitchen/react-components';
import { parseDate } from '@/shared/dates';
import type { CancelledProductDetail } from '@/shared/productResponse';
import { getSpecificProductType } from '@/shared/productResponse';
import { GROUPED_PRODUCT_TYPES } from '@/shared/productTypes';
import { wideButtonLayoutCss } from '../../../styles/ButtonStyles';
import { trackEvent } from '../../../utilities/analytics';
import { Card } from '../shared/Card';
import { productCardConfiguration } from './ProductCardConfiguration';
import {
keyValueCss,
productCardTitleCss,
productDetailLayoutCss,
sectionHeadingCss,
} from './ProductCardStyles';
export const CancelledProductCard = ({
productDetail,
hasOtherActiveSubs,
}: {
productDetail: CancelledProductDetail;
hasOtherActiveSubs: boolean;
}) => {
const specificProductType = getSpecificProductType(productDetail.tier);
const groupedProductType =
GROUPED_PRODUCT_TYPES[specificProductType.groupedProductType];
const cardConfig =
productCardConfiguration[specificProductType.productType];
const showSubscribeAgainButton =
!!specificProductType.checkoutUrlPart && !hasOtherActiveSubs;
return (
<Stack space={4}>
<InfoSummary
message={`Your ${groupedProductType.friendlyName} has been cancelled`}
/>
<Card>
<Card.Header backgroundColor={cardConfig.colour}>
<h3 css={productCardTitleCss(cardConfig.invertText)}>
{specificProductType.productTitle()}
</h3>
</Card.Header>
<Card.Section>
<div css={productDetailLayoutCss}>
<div>
<h4 css={sectionHeadingCss}>Billing and payment</h4>
<dl css={keyValueCss}>
<div>
<dt>
{groupedProductType.showSupporterId
? 'Supporter ID'
: 'Subscription ID'}
</dt>
<dd data-qm-masking="blocklist">
{
productDetail.subscription
.subscriptionId
}
</dd>
</div>
{groupedProductType.tierLabel && (
<div>
<dt>{groupedProductType.tierLabel}</dt>
<dd>{productDetail.tier}</dd>
</div>
)}
{productDetail.subscription.start && (
<div>
<dt>
{groupedProductType.shouldShowJoinDateNotStartDate
? 'Join'
: 'Start'}{' '}
date
</dt>
<dd>
{parseDate(
productDetail.subscription
.start,
).dateStr()}
</dd>
</div>
)}
<div>
<dt>End date</dt>
<dd>
{parseDate(
productDetail.subscription.end,
).dateStr()}
</dd>
</div>
</dl>
</div>
<div css={wideButtonLayoutCss}>
{showSubscribeAgainButton && (
<LinkButton
href={`https://support.theguardian.com/${specificProductType.checkoutUrlPart}`}
size="small"
cssOverrides={css`
justify-content: center;
`}
priority="primary"
onClick={() => {
trackEvent({
eventCategory: 'href',
eventAction: 'click',
eventLabel: `${
groupedProductType.showSupporterId
? 'support'
: 'subscribe'
}_again`,
});
}}
>
{groupedProductType.showSupporterId
? 'Support'
: 'Subscribe'}{' '}
again
</LinkButton>
)}
</div>
</div>
</Card.Section>
</Card>
</Stack>
);
};