From df02b106eb63c0b2844ba46dc4164fcddc3ca7e5 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 17 Feb 2026 11:48:38 -0800 Subject: [PATCH] Show membership quote before tx and localize membership status states --- docs/roadmap-status.md | 6 ++---- public/index.html | 46 +++++++++++++++++++++++++++++++++++++++++- translations/ar.json | 4 ++++ translations/de.json | 4 ++++ translations/es.json | 4 ++++ translations/fr.json | 4 ++++ translations/he.json | 4 ++++ translations/hi.json | 4 ++++ translations/ja.json | 4 ++++ translations/ko.json | 4 ++++ translations/pt.json | 4 ++++ translations/ru.json | 4 ++++ translations/zh.json | 4 ++++ 13 files changed, 91 insertions(+), 5 deletions(-) diff --git a/docs/roadmap-status.md b/docs/roadmap-status.md index f58622e..7f5505f 100644 --- a/docs/roadmap-status.md +++ b/docs/roadmap-status.md @@ -36,10 +36,8 @@ Implemented now: Remaining in this repo: -1. Add explicit UI rendering of quote price/currency before wallet tx submit. -2. Add localization keys for membership-stage status strings in all non-English bundles. -3. Add static marketplace skeleton page showing membership-gated checkout states. -4. Add deployment-ready docs for contract addresses and chain/network configuration. +1. Add static marketplace skeleton page showing membership-gated checkout states. +2. Add deployment-ready docs for contract addresses and chain/network configuration. Cross-repo dependencies (kernel/backend/contracts): diff --git a/public/index.html b/public/index.html index 6034c12..02af9f0 100644 --- a/public/index.html +++ b/public/index.html @@ -570,12 +570,50 @@ function setFlowStatus(key, fallback, isError) { showElement(flowStatus); } +function setFlowStatusMessage(message, isError) { + flowStatus.textContent = message; + flowStatus.classList.toggle('error', !!isError); + showElement(flowStatus); +} + function clearFlowStatus() { flowStatus.textContent = ''; flowStatus.classList.remove('error'); hideElement(flowStatus); } +function formatAtomicAmount(atomicRaw, decimalsRaw) { + if (atomicRaw === undefined || atomicRaw === null) return null; + if (decimalsRaw === undefined || decimalsRaw === null) return String(atomicRaw); + const atomic = String(atomicRaw); + const decimals = Number(decimalsRaw); + if (!/^[0-9]+$/.test(atomic) || Number.isNaN(decimals) || decimals < 0) { + return null; + } + if (decimals === 0) return atomic; + const padded = atomic.padStart(decimals + 1, '0'); + const intPart = padded.slice(0, -decimals); + const fracPart = padded.slice(-decimals).replace(/0+$/, ''); + return fracPart ? (intPart + '.' + fracPart) : intPart; +} + +function formatQuoteDisplay(quote) { + if (!quote || typeof quote !== 'object') return null; + const currency = quote.currency ? String(quote.currency) : ''; + let amount = null; + if (quote.amount !== undefined && quote.amount !== null) { + amount = String(quote.amount); + } else if (quote.display_amount !== undefined && quote.display_amount !== null) { + amount = String(quote.display_amount); + } else if (quote.amount_atomic !== undefined && quote.amount_atomic !== null) { + amount = formatAtomicAmount(quote.amount_atomic, quote.decimals); + } + if (amount && currency) return amount + ' ' + currency; + if (amount) return amount; + if (currency) return currency; + return null; +} + async function postJSON(url, payload) { const res = await fetch(url, { method: 'POST', @@ -761,7 +799,13 @@ async function startWalletFlow() { throw new Error('Membership quote is missing destination contract.'); } - setFlowStatus('membership_minting', 'Confirm membership mint in your wallet...', false); + const quoteDisplay = formatQuoteDisplay(quote); + const mintPrompt = t('membership_minting', 'Confirm membership mint in your wallet...'); + if (quoteDisplay) { + setFlowStatusMessage(mintPrompt + ' (' + quoteDisplay + ')', false); + } else { + setFlowStatus('membership_minting', 'Confirm membership mint in your wallet...', false); + } const txHash = await window.ethereum.request({ method: 'eth_sendTransaction', params: [txParams], diff --git a/translations/ar.json b/translations/ar.json index 5894c29..35f9514 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -41,6 +41,10 @@ "wallet_signing": "بانتظار التوقيع...", "wallet_verifying": "جارٍ التحقق من التوقيع...", "wallet_success": "تم تأكيد التعيين.", + "membership_quoting": "جارٍ إعداد سك العضوية...", + "membership_minting": "أكد سك العضوية في محفظتك...", + "membership_confirming": "جارٍ تأكيد العضوية على السلسلة...", + "membership_active": "العضوية نشطة. تم تأكيد التعيين.", "wallet_failed": "فشل مسار المحفظة.", "wallet_missing": "لم يتم العثور على محفظة على هذا الجهاز.", "notify_me": "أبلغني", diff --git a/translations/de.json b/translations/de.json index 0edc925..00074f0 100644 --- a/translations/de.json +++ b/translations/de.json @@ -41,6 +41,10 @@ "wallet_signing": "Warte auf Signatur...", "wallet_verifying": "Signatur wird verifiziert...", "wallet_success": "Designation bestätigt.", + "membership_quoting": "Membership-Praegung wird vorbereitet...", + "membership_minting": "Bestaetige die Membership-Praegung in deiner Wallet...", + "membership_confirming": "Membership wird on-chain bestaetigt...", + "membership_active": "Membership aktiv. Designation bestaetigt.", "wallet_failed": "Wallet-Ablauf fehlgeschlagen.", "wallet_missing": "Kein Wallet auf diesem Gerät erkannt.", "notify_me": "benachrichtige mich", diff --git a/translations/es.json b/translations/es.json index 72bfbf8..086b2dc 100644 --- a/translations/es.json +++ b/translations/es.json @@ -41,6 +41,10 @@ "wallet_signing": "Esperando firma...", "wallet_verifying": "Verificando firma...", "wallet_success": "Designación reconocida.", + "membership_quoting": "Preparando acuñación de membresía...", + "membership_minting": "Confirma la acuñación de membresía en tu wallet...", + "membership_confirming": "Confirmando membresía en la cadena...", + "membership_active": "Membresía activa. Designación reconocida.", "wallet_failed": "Falló el flujo de wallet.", "wallet_missing": "No se detectó wallet en este dispositivo.", "notify_me": "notifícame", diff --git a/translations/fr.json b/translations/fr.json index 3996351..b71d28f 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -41,6 +41,10 @@ "wallet_signing": "Signature en attente...", "wallet_verifying": "Verification de la signature...", "wallet_success": "Designation confirmee.", + "membership_quoting": "Preparation du mint dadhesion...", + "membership_minting": "Confirmez le mint dadhesion dans votre wallet...", + "membership_confirming": "Confirmation de ladhesion on-chain...", + "membership_active": "Adhesion active. Designation confirmee.", "wallet_failed": "Le flux wallet a echoue.", "wallet_missing": "Aucun wallet detecte sur cet appareil.", "notify_me": "me notifier", diff --git a/translations/he.json b/translations/he.json index cbfa86b..44f1c7f 100644 --- a/translations/he.json +++ b/translations/he.json @@ -41,6 +41,10 @@ "wallet_signing": "ממתין לחתימה...", "wallet_verifying": "מאמת חתימה...", "wallet_success": "הייעוד אושר.", + "membership_quoting": "מכין הטבעת חברות...", + "membership_minting": "אשר הטבעת חברות בארנק שלך...", + "membership_confirming": "מאשר חברות על השרשרת...", + "membership_active": "החברות פעילה. הייעוד אושר.", "wallet_failed": "תהליך הארנק נכשל.", "wallet_missing": "לא זוהה ארנק במכשיר זה.", "notify_me": "עדכנו אותי", diff --git a/translations/hi.json b/translations/hi.json index 1489bcc..5970971 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -41,6 +41,10 @@ "wallet_signing": "सिग्नेचर की प्रतीक्षा...", "wallet_verifying": "सिग्नेचर सत्यापित किया जा रहा है...", "wallet_success": "नामांकन स्वीकार किया गया।", + "membership_quoting": "सदस्यता मिंट तैयार की जा रही है...", + "membership_minting": "अपने वॉलेट में सदस्यता मिंट की पुष्टि करें...", + "membership_confirming": "ऑन-चेन सदस्यता की पुष्टि की जा रही है...", + "membership_active": "सदस्यता सक्रिय है। नामांकन स्वीकार किया गया।", "wallet_failed": "वॉलेट फ़्लो विफल रहा।", "wallet_missing": "इस डिवाइस पर कोई वॉलेट नहीं मिला।", "notify_me": "मुझे सूचित करें", diff --git a/translations/ja.json b/translations/ja.json index 5c8299b..a8765d5 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -41,6 +41,10 @@ "wallet_signing": "署名を待機中...", "wallet_verifying": "署名を検証しています...", "wallet_success": "指定が確認されました。", + "membership_quoting": "メンバーシップのミントを準備中...", + "membership_minting": "ウォレットでメンバーシップのミントを確認してください...", + "membership_confirming": "オンチェーンでメンバーシップを確認中...", + "membership_active": "メンバーシップが有効です。指定が確認されました。", "wallet_failed": "ウォレットフローに失敗しました。", "wallet_missing": "この端末でウォレットが見つかりません。", "notify_me": "通知を受け取る", diff --git a/translations/ko.json b/translations/ko.json index 8905a89..896aa05 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -41,6 +41,10 @@ "wallet_signing": "서명 대기 중...", "wallet_verifying": "서명 검증 중...", "wallet_success": "지정이 확인되었습니다.", + "membership_quoting": "멤버십 민팅을 준비하는 중...", + "membership_minting": "지갑에서 멤버십 민팅을 확인하세요...", + "membership_confirming": "온체인 멤버십을 확인하는 중...", + "membership_active": "멤버십이 활성화되었습니다. 지정이 확인되었습니다.", "wallet_failed": "지갑 흐름에 실패했습니다.", "wallet_missing": "이 기기에서 지갑을 찾을 수 없습니다.", "notify_me": "알림 받기", diff --git a/translations/pt.json b/translations/pt.json index efdfe17..08d1941 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -41,6 +41,10 @@ "wallet_signing": "Aguardando assinatura...", "wallet_verifying": "Verificando assinatura...", "wallet_success": "Designação confirmada.", + "membership_quoting": "Preparando mint de associação...", + "membership_minting": "Confirme o mint de associação na sua wallet...", + "membership_confirming": "Confirmando associação on-chain...", + "membership_active": "Associação ativa. Designação confirmada.", "wallet_failed": "Falha no fluxo de wallet.", "wallet_missing": "Nenhuma wallet detectada neste dispositivo.", "notify_me": "me avise", diff --git a/translations/ru.json b/translations/ru.json index fa4661c..dc9f8d0 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -41,6 +41,10 @@ "wallet_signing": "Ожидание подписи...", "wallet_verifying": "Проверка подписи...", "wallet_success": "Назначение подтверждено.", + "membership_quoting": "Подготовка минта членства...", + "membership_minting": "Подтвердите минт членства в вашем кошельке...", + "membership_confirming": "Подтверждение членства в сети...", + "membership_active": "Членство активно. Назначение подтверждено.", "wallet_failed": "Сбой процесса кошелька.", "wallet_missing": "Кошелек на этом устройстве не обнаружен.", "notify_me": "уведомить меня", diff --git a/translations/zh.json b/translations/zh.json index ea1c16c..52243b3 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -41,6 +41,10 @@ "wallet_signing": "等待签名...", "wallet_verifying": "正在验证签名...", "wallet_success": "指定已确认。", + "membership_quoting": "正在准备会员铸造...", + "membership_minting": "请在钱包中确认会员铸造...", + "membership_confirming": "正在链上确认会员资格...", + "membership_active": "会员已激活。指定已确认。", "wallet_failed": "钱包流程失败。", "wallet_missing": "此设备未检测到钱包。", "notify_me": "通知我",