aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/taler-util/src/amounts.ts2
-rw-r--r--packages/taler-wallet-webextension/src/NavigationBar.tsx20
-rw-r--r--packages/taler-wallet-webextension/src/components/AmountField.tsx56
-rw-r--r--packages/taler-wallet-webextension/src/wallet/Settings.tsx1
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>