lbry-desktop/ui/component/common/credit-amount.jsx

123 lines
3.2 KiB
React
Raw Normal View History

2018-03-26 23:32:43 +02:00
// @flow
import 'scss/component/_superchat.scss';
import { formatCredits, formatFullPrice } from 'util/format-credits';
2018-03-26 23:32:43 +02:00
import classnames from 'classnames';
2020-09-02 22:08:37 +02:00
import LbcSymbol from 'component/common/lbc-symbol';
import React from 'react';
2018-03-26 23:32:43 +02:00
type Props = {
amount?: number,
className?: string,
customAmounts?: { amountFiat: number, amountLBC: number },
fee?: boolean,
hideTitle?: boolean,
isEstimate?: boolean,
isFiat?: boolean,
noFormat?: boolean,
2018-03-26 23:32:43 +02:00
precision: number,
showFree: boolean,
showFullPrice: boolean,
showLBC?: boolean,
showPlus: boolean,
2021-04-23 21:59:48 +02:00
size?: number,
superChat?: boolean,
superChatLight?: boolean,
2018-03-26 23:32:43 +02:00
};
class CreditAmount extends React.PureComponent<Props> {
static defaultProps = {
noFormat: false,
2018-03-26 23:32:43 +02:00
precision: 2,
showFree: false,
showFullPrice: false,
showLBC: true,
showPlus: false,
2018-03-26 23:32:43 +02:00
};
render() {
const {
amount,
className,
customAmounts,
fee,
hideTitle,
isEstimate,
isFiat,
noFormat,
precision,
showFree,
showFullPrice,
showLBC,
showPlus,
2021-04-23 21:59:48 +02:00
size,
superChat,
superChatLight,
} = this.props;
2018-03-26 23:32:43 +02:00
const minimumRenderableAmount = 10 ** (-1 * precision);
2021-08-18 20:06:12 +02:00
// return null, otherwise it will try and convert undefined to a string
if (amount === undefined && customAmounts === undefined) return null;
2018-03-26 23:32:43 +02:00
function getAmountText(amount: number, isFiat?: boolean) {
const fullPrice = formatFullPrice(amount, 2);
const isFree = parseFloat(amount) === 0;
let formattedAmount;
2018-03-26 23:32:43 +02:00
if (showFullPrice) {
formattedAmount = fullPrice;
} else {
formattedAmount =
amount > 0 && amount < minimumRenderableAmount
? `<${minimumRenderableAmount}`
: formatCredits(amount, precision, true);
2018-03-26 23:32:43 +02:00
}
if (showFree && isFree) {
return __('Free');
} else {
let amountText = noFormat ? amount : formattedAmount;
if (showPlus && amount > 0) {
amountText = `+${amountText}`;
}
if (showLBC && !isFiat) {
amountText = <LbcSymbol postfix={amountText} size={size} />;
} else if (showLBC && isFiat) {
amountText = <p style={{ display: 'inline' }}> ${(Math.round(Number(amountText) * 100) / 100).toFixed(2)}</p>;
}
if (fee) {
amountText = __('%amount% fee', { amount: amountText });
}
2018-03-26 23:32:43 +02:00
return amountText;
2018-03-26 23:32:43 +02:00
}
}
return (
2021-04-23 21:59:48 +02:00
<span
title={amount && !hideTitle ? formatFullPrice(amount, 2) : ''}
className={classnames(className, { superChat: superChat, 'superChat--light': superChatLight })}
2021-04-23 21:59:48 +02:00
>
{customAmounts
? Object.values(customAmounts).map((amount, index) => (
<span key={String(amount)} className="credit-amount">
{getAmountText(Number(amount), !index)}
</span>
))
: amount && <span className="credit-amount">{getAmountText(amount, isFiat)}</span>}
2018-03-26 23:32:43 +02:00
{isEstimate ? (
2019-05-07 23:38:29 +02:00
<span className="credit-amount__estimate" title={__('This is an estimate and does not include data fees')}>
2018-03-26 23:32:43 +02:00
*
</span>
) : null}
</span>
);
}
}
export default CreditAmount;