From 219e48f35196e54361dc17d6ca7de6e095c46eeb Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 28 Nov 2022 15:33:45 -0300 Subject: [PATCH] fix #7497 --- packages/taler-util/src/amounts.ts | 2 +- .../src/NavigationBar.tsx | 20 ++++++- .../src/components/AmountField.tsx | 58 ++++++++++++------- .../src/wallet/Settings.tsx | 1 + 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/packages/taler-util/src/amounts.ts b/packages/taler-util/src/amounts.ts index f59e325b0..991b13912 100644 --- a/packages/taler-util/src/amounts.ts +++ b/packages/taler-util/src/amounts.ts @@ -468,7 +468,7 @@ export class Amounts { const af = aJ.fraction % amountFractionalBase; let s = av.toString(); - if (af) { + if (af || minFractional) { s = s + "."; let n = af; for (let i = 0; i < amountFractionalLength; i++) { diff --git a/packages/taler-wallet-webextension/src/NavigationBar.tsx b/packages/taler-wallet-webextension/src/NavigationBar.tsx index b900fab9d..8fb289aa6 100644 --- a/packages/taler-wallet-webextension/src/NavigationBar.tsx +++ b/packages/taler-wallet-webextension/src/NavigationBar.tsx @@ -193,6 +193,16 @@ VNode { export function WalletNavBar({ path = "" }: { path?: string }): VNode { const { i18n } = useTranslationContext(); + + const api = wxApi; //FIXME: as parameter + const hook = useAsyncAsHook(async () => { + return await api.wallet.call( + WalletApiOperation.GetUserAttentionUnreadCount, + {}, + ); + }); + const attentionCount = !hook || hook.hasError ? 0 : hook.response.total; + return ( @@ -209,9 +219,13 @@ export function WalletNavBar({ path = "" }: { path?: string }): VNode { Backup - - Notifications - + {attentionCount > 0 ? ( + + Notifications + + ) : ( + + )} diff --git a/packages/taler-wallet-webextension/src/components/AmountField.tsx b/packages/taler-wallet-webextension/src/components/AmountField.tsx index 6081e70ff..2e8942f0d 100644 --- a/packages/taler-wallet-webextension/src/components/AmountField.tsx +++ b/packages/taler-wallet-webextension/src/components/AmountField.tsx @@ -44,7 +44,9 @@ export function AmountField({ handler: AmountFieldHandler; }): VNode { const [unit, setUnit] = useState(1); - const [dotAtTheEnd, setDotAtTheEnd] = useState(false); + const [decimalPlaces, setDecimalPlaces] = useState( + undefined, + ); const currency = handler.value.currency; let hd = Math.floor(Math.log10(highestDenom || 1) / 3); @@ -72,10 +74,18 @@ export function AmountField({ ld--; } - const prev = Amounts.stringifyValue(handler.value); + const previousValue = Amounts.stringifyValue(handler.value, decimalPlaces); + + const normal = denormalize(handler.value, unit) ?? handler.value; + + let textValue = Amounts.stringifyValue(normal, decimalPlaces); + if (decimalPlaces === 0) { + textValue += "."; + } function positiveAmount(value: string): string { - setDotAtTheEnd(value.endsWith(".")); + // setDotAtTheEnd(value.endsWith(".")); + // const dotAtTheEnd = value.endsWith("."); if (!value) { if (handler.onInput) { handler.onInput(Amounts.zeroOfCurrency(currency)); @@ -85,28 +95,30 @@ export function AmountField({ try { //remove all but last dot const parsed = value.replace(/(\.)(?=.*\1)/g, ""); + const parts = parsed.split("."); + setDecimalPlaces(parts.length === 1 ? undefined : parts[1].length); + + //FIXME: should normalize before parsing + //parsing first add some restriction on the rage of the values const real = parseValue(currency, parsed); if (!real || real.value < 0) { - return prev; + return previousValue; } - const normal = normalize(real, unit); + const realNormalized = normalize(real, unit); - console.log(real, unit, normal); - if (normal && handler.onInput) { - handler.onInput(normal); + // console.log(real, unit, normal); + if (realNormalized && handler.onInput) { + handler.onInput(realNormalized); } return parsed; } catch (e) { // do nothing } - return prev; + return previousValue; } - const normal = denormalize(handler.value, unit) ?? handler.value; - - const textValue = Amounts.stringifyValue(normal) + (dotAtTheEnd ? "." : ""); return ( amountFractionalLength + 1) { - return undefined; - } + const tailPart = !fractPart + ? "0" + : fractPart.substring(0, amountFractionalLength); + const value = Number.parseInt(intPart, 10); - if (Number.isNaN(value) || value > amountMaxValue) { + const parsedTail = Number.parseFloat(`.${tailPart}`); + if (Number.isNaN(value) || Number.isNaN(parsedTail)) { return undefined; } - return { - currency, - fraction: Math.round(amountFractionalBase * Number.parseFloat(tail)), - value, - }; + if (value > amountMaxValue) { + return undefined; + } + + const fraction = Math.round(amountFractionalBase * parsedTail); + return { currency, fraction, value }; } function normalize(amount: AmountJson, unit: number): AmountJson | undefined { diff --git a/packages/taler-wallet-webextension/src/wallet/Settings.tsx b/packages/taler-wallet-webextension/src/wallet/Settings.tsx index a4f51de29..c0268a1ae 100644 --- a/packages/taler-wallet-webextension/src/wallet/Settings.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Settings.tsx @@ -203,6 +203,7 @@ export function SettingsView({ ); case ExchangeTosStatus.Unknown: + default: return (