nitro-v36-with-renderer-v36
/
src /
components /
room /
widgets /
chat-input /
HabbiconPurchaseView.tsx
HabbiconPurchaseView.tsx 7.2 Ko
Télécharger le fichier
import { FC } from 'react';
import { localizeHabbiconName, localizeWithFallback, useHabbiconCatalog } from '../../../../api';
import { DraggableWindowPosition, LayoutCurrencyIcon, LayoutHabbiconImageView, OctaneCardHeaderView, OctaneCardView } from '../../../../common';
import { usePurse } from '../../../../hooks/purse/usePurse';
import { HabbiconPrice } from './HabbiconHubView';
import { BaseButton } from '../../../../common/BaseButton';
import { NativeTextTree } from '../../../../common/native-text/NativeTextTree';
export const HabbiconPurchaseView: FC = () => {
const catalog = useHabbiconCatalog();
const { getCurrencyAmount } = usePurse();
const { purchase, pending } = catalog;
const item = purchase.collection ? catalog.sets.find((set) => set.collectionId === purchase.id) : catalog.entries.find((entry) => entry.id === purchase.id);
if (!item) return null;
const title = 'title' in item ? item.title : localizeHabbiconName(item);
const set = catalog.sets.find((set) => set.collectionId === item.collectionId);
const missing = 'entries' in item ? item.entries.filter((entry) => !entry.owned && !entry.claimable) : [item];
const creditsOnly = item.priceCredits > 0 && item.priceActivityPoints === 0;
const pointsOnly = item.priceCredits === 0 && item.priceActivityPoints > 0;
const comparablePrices =
purchase.collection &&
missing.every((entry) =>
creditsOnly
? entry.priceCredits > 0 && entry.priceActivityPoints === 0
: pointsOnly && entry.priceCredits === 0 && entry.priceActivityPoints > 0 && entry.activityPointType === item.activityPointType
);
const individualPrice = comparablePrices ? missing.reduce((total, entry) => total + entry.priceCredits + entry.priceActivityPoints, 0) : 0;
const discount = Math.max(0, individualPrice - item.priceCredits - item.priceActivityPoints);
const currencyType = creditsOnly ? -1 : item.activityPointType;
const affordable = getCurrencyAmount(-1) >= item.priceCredits && getCurrencyAmount(item.activityPointType) >= item.priceActivityPoints;
const close = () => {
if (!pending) catalog.setPurchase(null);
};
const ownedCount = set?.entries.filter((entry) => entry.owned).length || 0;
const progress = Math.min(set?.total || 0, ownedCount + 1);
return (
<NativeTextTree>
<OctaneCardView
classNames={['habbicon-purchase-window']}
frameStyle={3}
isResizable={false}
uniqueKey="habbicon-purchase"
windowPosition={DraggableWindowPosition.CENTER}
>
<OctaneCardHeaderView headerText={localizeWithFallback('habbicon_purchase.confirm.title', 'Confirm purchase')} onCloseClick={close} />
<div className="habbicon-purchase-body">
<div className="habbicon-purchase-top">
<div className="habbicon-purchase-preview">
<LayoutHabbiconImageView id={purchase.id} collection={purchase.collection} />
<strong>{purchase.collection ? localizeWithFallback('habbicon_purchase.confirm.set.preview', 'Habicon set') : set?.title}</strong>
</div>
<div>
<h3>{title}</h3>
<p>
{localizeWithFallback(
purchase.collection ? 'habbicon_purchase.confirm.set.desc' : 'habbicon_purchase.confirm.habbicon.desc',
purchase.collection ? `Buy the ${title} set?` : 'Buy this Habicon?',
['set_name'],
[title]
)}
</p>
<p className="habbicon-purchase-receive">
{purchase.collection
? localizeWithFallback(
'habbicon_purchase.confirm.set.receive',
`You'll receive ${missing.length} Habicons`,
['count'],
[String(missing.length)]
)
: localizeWithFallback(
'habbicon_purchase.confirm.habbicon.progress',
`Progress after buy: ${progress} / ${set?.total || 0}`,
['progress', 'total'],
[String(progress), String(set?.total || 0)]
)}
</p>
</div>
</div>
{discount > 0 && (
<>
<div className="habbicon-purchase-total">
<span>{localizeWithFallback('catalog.purchase.confirmation.dialog.normal_price', 'Normal price')}</span>
<del className="habbicon-price">
{individualPrice}
<LayoutCurrencyIcon type={currencyType} />
</del>
</div>
<div className="habbicon-purchase-total">
<span>{localizeWithFallback('catalog.purchase.confirmation.dialog.discount', 'Discount')}</span>
<strong className="habbicon-price">
{discount}
<LayoutCurrencyIcon type={currencyType} />
</strong>
</div>
</>
)}
<div className="habbicon-purchase-total">
<span>{localizeWithFallback('catalog.purchase.confirmation.dialog.cost', 'Cost')}</span>
<HabbiconPrice {...item} />
</div>
{!affordable && (
<p role="alert">
{localizeWithFallback('habbicon.purchase.insufficient_balance', 'You do not have enough currency for this purchase.')}
</p>
)}
{catalog.error && <p role="alert">{catalog.error}</p>}
<div className="habbicon-purchase-actions">
<BaseButton type="button" className="habbicon-action" disabled={!affordable || !!pending || missing.length === 0} onClick={catalog.buy}>
{localizeWithFallback(pending ? 'generic.loading' : 'generic.buy', pending ? 'Buying…' : 'Buy')}
</BaseButton>
<BaseButton type="button" className="habbicon-cancel" disabled={!!pending} onClick={close}>
{localizeWithFallback('generic.cancel', 'Cancel')}
</BaseButton>
</div>
</div>
</OctaneCardView>
</NativeTextTree>
);
};
