aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-10-08 16:34:06 -0700
committerAdam Soltys <[email protected]>2026-10-08 16:34:06 -0700
commite35764950b59bde6e36bdfad1ca671eef564a6d1 (patch)
treea72a950e6e8ffd21312b6e2610ee7c73092026bc /src
parentd3a0af140dabdd6b53c1be0532b37f28254633be (diff)
downloadcoinosv3-e35764950b59bde6e36bdfad1ca671eef564a6d1.tar.gz
coinosv3-e35764950b59bde6e36bdfad1ca671eef564a6d1.zip
Max fills the amount in the unit the field shows: in fiat that's money floored to the cent (so it never parses back above the maximum), not a BTC figure under a CAD label. One ctx.amountField helper for the ark send/LN Max, the gift Max and fixed-amount zap/BOLT 12 fills
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/app.js12
-rw-r--r--src/features/ark.js4
-rw-r--r--src/features/gifts.js2
-rw-r--r--src/features/zaps.js8
4 files changed, 18 insertions, 8 deletions
diff --git a/src/app.js b/src/app.js
index 1e77849..122ccfe 100644
--- a/src/app.js
+++ b/src/app.js
@@ -1151,6 +1151,16 @@ function toggleUnit() {
render();
}
+// A sats figure as the amount field types it in the current unit — what a
+// Max button or a fixed-amount invoice fills in. Fiat is floored to the
+// cent so a filled-in maximum never parses back to more than was offered.
+function amountField(sat) {
+ if (unit === 'sats') return String(sat);
+ const r = unit === 'fiat' && rateNow();
+ if (r) return (Math.floor((sat / 1e8) * r * 100) / 100).toFixed(2);
+ return (sat / 1e8).toFixed(8);
+}
+
const unitLabel = () => (unit === 'sats' ? 'sats' : unit === 'fiat' ? getCurrency() : 'BTC');
// "Worth X then · Y now" for a payment's detail page — the one place both
@@ -5951,7 +5961,7 @@ const ctx = {
openWalletSettings: (view) => openWalletSettings(view),
// one page of the Settings hub, from anywhere (Notifications' gear)
openSettingsPage: (page) => { clearFeatureNav(); ui.screen = 'wallet'; ui.tab = 'settings'; ui.settingsPage = page; render(); try { window.scrollTo(0, 0); } catch {} },
- fmtAmount, unitLabel, unitTag, getUnit: () => unit, toggleUnit, download,
+ fmtAmount, unitLabel, unitTag, getUnit: () => unit, toggleUnit, download, amountField,
// in fiat the typed figure is money, so it needs today's price to become sats
parseAmount: (v, u) => parseAmount(v, u, rateNow()),
worthLine,
diff --git a/src/features/ark.js b/src/features/ark.js
index 90b2a01..d5b6e7f 100644
--- a/src/features/ark.js
+++ b/src/features/ark.js
@@ -1223,7 +1223,7 @@ export function arkFeature(ctx) {
}
return Math.max(0, amt);
}
- const amountFill = (sat) => (ctx.getUnit() === 'sats' ? String(sat) : (sat / 1e8).toFixed(8));
+ const amountFill = (sat) => ctx.amountField(sat);
// Auto-pay progress + success as ONE structurally identical card, so the
// paying → paid step is a class flip (spinner ring settles into the green
@@ -3651,7 +3651,7 @@ export function arkFeature(ctx) {
? (arkBalance()?.spendableSat || 0)
: maxBoardSat();
if (!sat) return null;
- return ctx.getUnit() === 'sats' ? String(sat) : (sat / 1e8).toFixed(8);
+ return ctx.amountField(sat);
},
sendFormNote(a) {
if (!isArkAddress(a)) return null;
diff --git a/src/features/gifts.js b/src/features/gifts.js
index 052a107..4d68a50 100644
--- a/src/features/gifts.js
+++ b/src/features/gifts.js
@@ -675,7 +675,7 @@ export function giftsFeature(ctx) {
return h('div', { class: 'input-group' },
h('input', { type: 'number', step: getUnit() === 'sats' ? '1' : '0.00000001', min: '0', inputmode: 'decimal', placeholder: t('giftAmountLabel'),
disabled: ui.giftMax,
- value: ui.giftMax ? (getUnit() === 'sats' ? String(maxVal) : fmtBtc(maxVal)) : ui.giftAmount,
+ value: ui.giftMax ? ctx.amountField(maxVal) : ui.giftAmount,
onInput: (e) => (ui.giftAmount = e.target.value) }),
h('button', { type: 'button', class: ui.giftMax ? 'btn-primary' : '', onClick: () => { ui.giftMax = !ui.giftMax; ui.giftError = ''; render(); } }, t('max')),
h('div', { style: 'display:flex;align-items:center' }, unitTag())
diff --git a/src/features/zaps.js b/src/features/zaps.js
index a23ecdd..d327f9d 100644
--- a/src/features/zaps.js
+++ b/src/features/zaps.js
@@ -94,7 +94,7 @@ export function zapsFeature(ctx) {
const off = target.offer;
if (off.currency) throw new Error(t('bolt12Currency', { currency: off.currency }));
const fixedSat = off.amountMsat ? Number((off.amountMsat + 999n) / 1000n) : null;
- if (fixedSat) z.amount = getUnit() === 'sats' ? String(fixedSat) : (fixedSat / 1e8).toFixed(8);
+ if (fixedSat) z.amount = ctx.amountField(fixedSat);
z.params = { minSendable: 1000, maxSendable: 21e15, commentAllowed: 0, allowsNostr: false, fixedSat };
z.status = 'ready';
render();
@@ -118,7 +118,7 @@ export function zapsFeature(ctx) {
return;
}
const fixedSat = n.priceType === 0 && n.priceSats ? n.priceSats : null;
- if (fixedSat) z.amount = getUnit() === 'sats' ? String(fixedSat) : (fixedSat / 1e8).toFixed(8);
+ if (fixedSat) z.amount = ctx.amountField(fixedSat);
z.params = { minSendable: 1000, maxSendable: 21e15, commentAllowed: 100, allowsNostr: false, fixedSat };
z.status = 'ready';
render();
@@ -165,7 +165,7 @@ export function zapsFeature(ctx) {
// exactly like a fixed-amount BOLT 12 offer.
if (params.minSendable === params.maxSendable && params.minSendable >= 1000) {
params.fixedSat = Math.ceil(params.minSendable / 1000);
- z.amount = getUnit() === 'sats' ? String(params.fixedSat) : (params.fixedSat / 1e8).toFixed(8);
+ z.amount = ctx.amountField(params.fixedSat);
}
z.params = params;
z.status = 'ready';
@@ -363,7 +363,7 @@ export function zapsFeature(ctx) {
!p.fixedSat && (hook('lnMaxSendSat') || 0) > 0
? h('button', { type: 'button', onClick: () => {
const sat = hook('lnMaxSendSat');
- z.amount = getUnit() === 'sats' ? String(sat) : (sat / 1e8).toFixed(8);
+ z.amount = ctx.amountField(sat);
render();
} }, t('max'))
: null,