diff options
| author | Adam Soltys <[email protected]> | 2026-09-03 19:13:53 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-09-03 19:13:53 -0700 |
| commit | 4982c2bbf01d39fd4cb6775327b1c9bf614f4735 (patch) | |
| tree | 799a480058c44111e517031a510f75d6cd68e9d6 /src | |
| parent | 0a60cce02569607296de4fb4811e50d6dc8c3f57 (diff) | |
| download | coinosv3-4982c2bbf01d39fd4cb6775327b1c9bf614f4735.tar.gz coinosv3-4982c2bbf01d39fd4cb6775327b1c9bf614f4735.zip | |
'Spent on another device' stops sounding like an accusation: the reconcile row is now a plain Sent wearing a quiet 'synced' tag, and tapping it unfolds the reassurance — the coins left your wallet in a session this device didn't see (another device, a restore that dropped history, or a server-side renewal), and the balance is correct; the row just keeps the history adding up
Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
Diffstat (limited to 'src')
| -rw-r--r-- | src/features/ark.js | 18 | ||||
| -rw-r--r-- | src/i18n.js | 6 |
2 files changed, 18 insertions, 6 deletions
diff --git a/src/features/ark.js b/src/features/ark.js index fc5fc9f..d730ea6 100644 --- a/src/features/ark.js +++ b/src/features/ark.js @@ -980,15 +980,25 @@ export function arkFeature(ctx) { // coins the server saw spent outside this device's story (another // device, a swept expiry, an adopted renewal) — the row that keeps the // history summing to the balance. Folded per reconcile pass upstream. + // "Spent on another device" read as an accusation; it's now a plain Sent + // wearing a quiet "synced" tag, and a tap unfolds the reassurance. if (m.type === 'reconcile') { - return h('div', { class: 'item' }, + const open = ui.arkReconOpen === m.id; + return h('div', { + class: 'item', style: 'cursor:pointer;flex-wrap:wrap', + onClick: () => { ui.arkReconOpen = open ? null : m.id; render(); }, + }, h('div', { class: 'ico out', html: ARK_MARK(15) }), h('div', { class: 'grow' }, - h('div', {}, t('arkSpentElsewhere')), + h('div', { class: 'row gap6', style: 'align-items:center' }, + t('arkReconSent'), h('span', { class: 'tag' }, t('arkReconTag'))), h('div', { class: 'small faint' }, - timeAgo(m.ts / 1000) + (m.count > 1 ? ` · ${t('arkSpentElsewhereN', { n: m.count })}` : ''))), + timeAgo(m.ts / 1000) + (m.count > 1 ? ` · ${t('arkReconCoins', { n: m.count })}` : ''))), h('div', { style: 'text-align:right' }, - h('div', { class: 'amount-neg' }, '-' + fmtAmount(m.amountSat)))); + h('div', { class: 'amount-neg' }, '-' + fmtAmount(m.amountSat))), + open + ? h('div', { class: 'small muted', style: 'flex-basis:100%;margin-top:6px' }, t('arkReconExplain')) + : null); } // a renewal moves nothing anywhere — its history amount is what it COST if (m.type === 'refresh') { diff --git a/src/i18n.js b/src/i18n.js index 0dbd06e..75095cf 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -212,8 +212,10 @@ const STR = { arkDepthBtn: 'Manage', arkDepthRenewed: 'Renewal requested', arkDepthRenewBtn: 'Renew now', - arkSpentElsewhere: 'Spent on another device', - arkSpentElsewhereN: '{n} coins', + arkReconSent: 'Sent', + arkReconTag: 'synced', + arkReconCoins: '{n} coins', + arkReconExplain: 'This device has no record of this payment — the coins left your wallet in a session this device didn’t see. That usually means another device or browser you use, or history that didn’t survive a restore; it can also be a renewal the server handled for you. Your balance is correct — this entry keeps the history adding up to it.', arkCoinsTitle: 'Spending coins', arkCoinsIntro: 'Your Spending balance lives in {n} coins totalling {total}. Each can be pulled on-chain without the server’s help — at a cost that grows with the coin’s history.', arkCoinsIntroOne: 'Your Spending balance lives in a single coin of {total}. It can be pulled on-chain without the server’s help — at a cost that grows with the coin’s history.', |
