nitro-v36-with-renderer-v36
/
src /
components /
catalog /
views /
page /
layout /
CatalogClubPurchaseConfirmView.tsx
CatalogClubPurchaseConfirmView.tsx 4.9 Ko
Télécharger le fichier
import { ClubOfferData } from '@octane/renderer';
import { FC, MutableRefObject, useEffect, useMemo, useState } from 'react';
import { GetConfigurationValue, LocalizeText } from '../../../../../api';
import { LayoutCurrencyIcon, OctaneCardContentView, OctaneCardHeaderView, OctaneCardView } from '../../../../../common';
import { Checkbox } from '../../../../../common/Checkbox';
import { InlineDialog } from '../../../../../common/InlineDialog';
import { BaseButton } from '../../../../../common/BaseButton';
import { NativeTextTree } from '../../../../../common/native-text/NativeTextTree';
interface CatalogClubPurchaseConfirmViewProps {
offer: ClubOfferData;
productText: string;
validUntilText: string;
onCancel: () => void;
onConfirm: () => void;
}
export const CatalogClubPurchaseConfirmView: FC<CatalogClubPurchaseConfirmViewProps> = (props) => {
const { offer, productText, validUntilText, onCancel, onConfirm } = props;
const disclaimerEnabled = useMemo(() => GetConfigurationValue<boolean>('disclaimer.credit_spending.enabled', false), []);
const [disclaimerAccepted, setDisclaimerAccepted] = useState(!disclaimerEnabled);
const showCredits = offer.priceCredits > 0 || offer.priceActivityPoints <= 0;
useEffect(() => setDisclaimerAccepted(!disclaimerEnabled), [disclaimerEnabled, offer.offerId]);
const title = LocalizeText('catalog.club.buy.confirm');
return (
<NativeTextTree>
<InlineDialog
aria-label={title}
aria-modal="true"
modal="trap-focus"
render={({ ref, ...popupProps }) => (
<OctaneCardView {...popupProps} innerRef={ref as MutableRefObject<HTMLDivElement>} classNames={['octane-club-purchase-confirm']} frameStyle={3} isResizable={false} theme="primary-slim" />
)}
onClose={onCancel}
>
<OctaneCardHeaderView headerText={title} onCloseClick={onCancel} />
<OctaneCardContentView
classNames={['octane-club-purchase-confirm-content', disclaimerEnabled ? 'has-disclaimer' : ''].filter(Boolean)}
overflow="hidden"
>
<div className="octane-club-purchase-confirm-product">
<span aria-hidden="true" className="octane-club-purchase-confirm-icon" />
<div className="octane-club-purchase-confirm-copy">
<strong>{productText}</strong>
<span>{validUntilText}</span>
<div className="octane-club-purchase-confirm-cost-row">
<span>{LocalizeText('catalog.purchase.confirmation.dialog.cost')}</span>
<span className="octane-club-purchase-confirm-price">
{showCredits && (
<span className="octane-club-purchase-confirm-price-part" data-currency-type="-1">
<strong>{offer.priceCredits}</strong>
<LayoutCurrencyIcon type={-1} />
</span>
)}
{offer.priceActivityPoints > 0 && (
<span className="octane-club-purchase-confirm-price-part" data-currency-type={offer.priceActivityPointsType}>
<strong>{`${offer.priceCredits > 0 ? '+ ' : ''}${offer.priceActivityPoints}`}</strong>
<LayoutCurrencyIcon type={offer.priceActivityPointsType} />
</span>
)}
</span>
</div>
</div>
</div>
{disclaimerEnabled && (
<label className="octane-club-purchase-confirm-disclaimer">
<Checkbox checked={disclaimerAccepted} onCheckedChange={(nextChecked) => setDisclaimerAccepted(nextChecked)} />
<span>{LocalizeText('disclaimer.credit_spending')}</span>
</label>
)}
<div className="octane-club-purchase-confirm-actions">
<BaseButton className="octane-club-purchase-confirm-cancel" type="button" onClick={onCancel}>
{LocalizeText('cancel')}
</BaseButton>
<BaseButton className="octane-club-purchase-confirm-submit" disabled={!disclaimerAccepted} type="button" onClick={onConfirm}>
{LocalizeText('catalog.club.buy.subscribe')}
</BaseButton>
</div>
</OctaneCardContentView>
</InlineDialog>
</NativeTextTree>
);
};
