diff options
4 files changed, 54 insertions, 25 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 ( <NavigationHeaderHolder> <NavigationHeader> @@ -209,9 +219,13 @@ export function WalletNavBar({ path = "" }: { path?: string }): VNode { <i18n.Translate>Backup</i18n.Translate> </a> - <a href={Pages.notifications}> - <i18n.Translate>Notifications</i18n.Translate> - </a> + {attentionCount > 0 ? ( + <a href={Pages.notifications}> + <i18n.Translate>Notifications</i18n.Translate> + </a> + ) : ( + <Fragment /> + )} <JustInDevMode> <a href={Pages.dev} class={path.startsWith("/dev") ? "active" : ""}> 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<number | undefined>( + 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 ( <Fragment> <TextField @@ -161,19 +173,21 @@ export function AmountField({ function parseValue(currency: string, s: string): AmountJson | undefined { const [intPart, fractPart] = s.split("."); - const tail = "." + (fractPart || "0"); - if (tail.length > amountFractionalLength + 1) { + const tailPart = !fractPart + ? "0" + : fractPart.substring(0, amountFractionalLength); + + const value = Number.parseInt(intPart, 10); + const parsedTail = Number.parseFloat(`.${tailPart}`); + if (Number.isNaN(value) || Number.isNaN(parsedTail)) { return undefined; } - const value = Number.parseInt(intPart, 10); - if (Number.isNaN(value) || value > amountMaxValue) { + if (value > amountMaxValue) { return undefined; } - return { - currency, - fraction: Math.round(amountFractionalBase * Number.parseFloat(tail)), - value, - }; + + 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({ </DestructiveText> ); case ExchangeTosStatus.Unknown: + default: return ( <DestructiveText> <i18n.Translate> |