Use single price value instead of range in product list (#2386)
* Render single value when amount of money is matching * Use Intl.NumberFormat in money formatting * Extract messages
This commit is contained in:
parent
da8e4e5a9c
commit
7387019288
3 changed files with 56 additions and 45 deletions
|
@ -7863,10 +7863,6 @@
|
|||
"zSOvI0": {
|
||||
"string": "Filters"
|
||||
},
|
||||
"zTdwWM": {
|
||||
"context": "money",
|
||||
"string": "{fromMoney} - {toMoney}"
|
||||
},
|
||||
"zWM89r": {
|
||||
"context": "numeric attribute units of",
|
||||
"string": "Units of"
|
||||
|
|
|
@ -18,12 +18,32 @@ export function subtractMoney(init: IMoney, ...args: IMoney[]): IMoney {
|
|||
|
||||
export const formatMoney = (money: IMoney, locale: string) => {
|
||||
try {
|
||||
const formattedMoney = money.amount.toLocaleString(locale, {
|
||||
currency: money.currency,
|
||||
const formattedMoney = Intl.NumberFormat(locale, {
|
||||
style: "currency",
|
||||
});
|
||||
currency: money.currency,
|
||||
}).format(money.amount);
|
||||
return formattedMoney;
|
||||
} catch (error) {
|
||||
return `${money.amount} ${money.currency}`;
|
||||
}
|
||||
};
|
||||
|
||||
export const formatMoneyRange = (
|
||||
moneyFrom: IMoney,
|
||||
moneyTo: IMoney,
|
||||
locale: string,
|
||||
) => {
|
||||
try {
|
||||
const formattedMoneyRange = (Intl.NumberFormat(locale, {
|
||||
style: "currency",
|
||||
currency: moneyFrom.currency,
|
||||
}) as any).formatRange(moneyFrom.amount, moneyTo.amount);
|
||||
// TODO: remove casting from formatRange when typescript
|
||||
// is updated to 4.7 or higher
|
||||
return formattedMoneyRange;
|
||||
} catch (error) {
|
||||
const formattedMoneyFrom = formatMoney(moneyFrom, locale);
|
||||
const formattedMoneyTo = formatMoney(moneyTo, locale);
|
||||
return `${formattedMoneyFrom} - ${formattedMoneyTo}`;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -2,7 +2,7 @@ import React from "react";
|
|||
import { useIntl } from "react-intl";
|
||||
|
||||
import { LocaleConsumer } from "../Locale";
|
||||
import { formatMoney, IMoney } from "../Money";
|
||||
import { formatMoney, formatMoneyRange, IMoney } from "../Money";
|
||||
|
||||
export interface MoneyRangeProps {
|
||||
from?: IMoney;
|
||||
|
@ -14,21 +14,14 @@ export const MoneyRange: React.FC<MoneyRangeProps> = ({ from, to }) => {
|
|||
|
||||
return (
|
||||
<LocaleConsumer>
|
||||
{({ locale }) =>
|
||||
from && to
|
||||
? intl.formatMessage(
|
||||
{
|
||||
id: "zTdwWM",
|
||||
defaultMessage: "{fromMoney} - {toMoney}",
|
||||
description: "money",
|
||||
},
|
||||
{
|
||||
fromMoney: formatMoney(from, locale),
|
||||
toMoney: formatMoney(to, locale),
|
||||
},
|
||||
)
|
||||
: from && !to
|
||||
? intl.formatMessage(
|
||||
{({ locale }) => {
|
||||
if (from && to) {
|
||||
return from.amount === to.amount
|
||||
? formatMoney(from, locale)
|
||||
: formatMoneyRange(from, to, locale);
|
||||
}
|
||||
if (from && !to) {
|
||||
return intl.formatMessage(
|
||||
{
|
||||
id: "lW5uJO",
|
||||
defaultMessage: "from {money}",
|
||||
|
@ -37,9 +30,10 @@ export const MoneyRange: React.FC<MoneyRangeProps> = ({ from, to }) => {
|
|||
{
|
||||
money: formatMoney(from, locale),
|
||||
},
|
||||
)
|
||||
: !from && to
|
||||
? intl.formatMessage(
|
||||
);
|
||||
}
|
||||
if (!from && to) {
|
||||
return intl.formatMessage(
|
||||
{
|
||||
id: "hptDxW",
|
||||
defaultMessage: "to {money}",
|
||||
|
@ -48,9 +42,10 @@ export const MoneyRange: React.FC<MoneyRangeProps> = ({ from, to }) => {
|
|||
{
|
||||
money: formatMoney(to, locale),
|
||||
},
|
||||
)
|
||||
: "-"
|
||||
);
|
||||
}
|
||||
return "-";
|
||||
}}
|
||||
</LocaleConsumer>
|
||||
);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue