Show membership quote before tx and localize membership status states

This commit is contained in:
Joshua 2026-02-17 11:48:38 -08:00
parent 434a97a184
commit df02b106eb
13 changed files with 91 additions and 5 deletions

View File

@ -36,10 +36,8 @@ Implemented now:
Remaining in this repo: Remaining in this repo:
1. Add explicit UI rendering of quote price/currency before wallet tx submit. 1. Add static marketplace skeleton page showing membership-gated checkout states.
2. Add localization keys for membership-stage status strings in all non-English bundles. 2. Add deployment-ready docs for contract addresses and chain/network configuration.
3. Add static marketplace skeleton page showing membership-gated checkout states.
4. Add deployment-ready docs for contract addresses and chain/network configuration.
Cross-repo dependencies (kernel/backend/contracts): Cross-repo dependencies (kernel/backend/contracts):

View File

@ -570,12 +570,50 @@ function setFlowStatus(key, fallback, isError) {
showElement(flowStatus); showElement(flowStatus);
} }
function setFlowStatusMessage(message, isError) {
flowStatus.textContent = message;
flowStatus.classList.toggle('error', !!isError);
showElement(flowStatus);
}
function clearFlowStatus() { function clearFlowStatus() {
flowStatus.textContent = ''; flowStatus.textContent = '';
flowStatus.classList.remove('error'); flowStatus.classList.remove('error');
hideElement(flowStatus); 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) { async function postJSON(url, payload) {
const res = await fetch(url, { const res = await fetch(url, {
method: 'POST', method: 'POST',
@ -761,7 +799,13 @@ async function startWalletFlow() {
throw new Error('Membership quote is missing destination contract.'); throw new Error('Membership quote is missing destination contract.');
} }
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); setFlowStatus('membership_minting', 'Confirm membership mint in your wallet...', false);
}
const txHash = await window.ethereum.request({ const txHash = await window.ethereum.request({
method: 'eth_sendTransaction', method: 'eth_sendTransaction',
params: [txParams], params: [txParams],

View File

@ -41,6 +41,10 @@
"wallet_signing": "بانتظار التوقيع...", "wallet_signing": "بانتظار التوقيع...",
"wallet_verifying": "جارٍ التحقق من التوقيع...", "wallet_verifying": "جارٍ التحقق من التوقيع...",
"wallet_success": "تم تأكيد التعيين.", "wallet_success": "تم تأكيد التعيين.",
"membership_quoting": "جارٍ إعداد سك العضوية...",
"membership_minting": "أكد سك العضوية في محفظتك...",
"membership_confirming": "جارٍ تأكيد العضوية على السلسلة...",
"membership_active": "العضوية نشطة. تم تأكيد التعيين.",
"wallet_failed": "فشل مسار المحفظة.", "wallet_failed": "فشل مسار المحفظة.",
"wallet_missing": "لم يتم العثور على محفظة على هذا الجهاز.", "wallet_missing": "لم يتم العثور على محفظة على هذا الجهاز.",
"notify_me": "أبلغني", "notify_me": "أبلغني",

View File

@ -41,6 +41,10 @@
"wallet_signing": "Warte auf Signatur...", "wallet_signing": "Warte auf Signatur...",
"wallet_verifying": "Signatur wird verifiziert...", "wallet_verifying": "Signatur wird verifiziert...",
"wallet_success": "Designation bestätigt.", "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_failed": "Wallet-Ablauf fehlgeschlagen.",
"wallet_missing": "Kein Wallet auf diesem Gerät erkannt.", "wallet_missing": "Kein Wallet auf diesem Gerät erkannt.",
"notify_me": "benachrichtige mich", "notify_me": "benachrichtige mich",

View File

@ -41,6 +41,10 @@
"wallet_signing": "Esperando firma...", "wallet_signing": "Esperando firma...",
"wallet_verifying": "Verificando firma...", "wallet_verifying": "Verificando firma...",
"wallet_success": "Designación reconocida.", "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_failed": "Falló el flujo de wallet.",
"wallet_missing": "No se detectó wallet en este dispositivo.", "wallet_missing": "No se detectó wallet en este dispositivo.",
"notify_me": "notifícame", "notify_me": "notifícame",

View File

@ -41,6 +41,10 @@
"wallet_signing": "Signature en attente...", "wallet_signing": "Signature en attente...",
"wallet_verifying": "Verification de la signature...", "wallet_verifying": "Verification de la signature...",
"wallet_success": "Designation confirmee.", "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_failed": "Le flux wallet a echoue.",
"wallet_missing": "Aucun wallet detecte sur cet appareil.", "wallet_missing": "Aucun wallet detecte sur cet appareil.",
"notify_me": "me notifier", "notify_me": "me notifier",

View File

@ -41,6 +41,10 @@
"wallet_signing": "ממתין לחתימה...", "wallet_signing": "ממתין לחתימה...",
"wallet_verifying": "מאמת חתימה...", "wallet_verifying": "מאמת חתימה...",
"wallet_success": "הייעוד אושר.", "wallet_success": "הייעוד אושר.",
"membership_quoting": "מכין הטבעת חברות...",
"membership_minting": "אשר הטבעת חברות בארנק שלך...",
"membership_confirming": "מאשר חברות על השרשרת...",
"membership_active": "החברות פעילה. הייעוד אושר.",
"wallet_failed": "תהליך הארנק נכשל.", "wallet_failed": "תהליך הארנק נכשל.",
"wallet_missing": "לא זוהה ארנק במכשיר זה.", "wallet_missing": "לא זוהה ארנק במכשיר זה.",
"notify_me": "עדכנו אותי", "notify_me": "עדכנו אותי",

View File

@ -41,6 +41,10 @@
"wallet_signing": "सिग्नेचर की प्रतीक्षा...", "wallet_signing": "सिग्नेचर की प्रतीक्षा...",
"wallet_verifying": "सिग्नेचर सत्यापित किया जा रहा है...", "wallet_verifying": "सिग्नेचर सत्यापित किया जा रहा है...",
"wallet_success": "नामांकन स्वीकार किया गया।", "wallet_success": "नामांकन स्वीकार किया गया।",
"membership_quoting": "सदस्यता मिंट तैयार की जा रही है...",
"membership_minting": "अपने वॉलेट में सदस्यता मिंट की पुष्टि करें...",
"membership_confirming": "ऑन-चेन सदस्यता की पुष्टि की जा रही है...",
"membership_active": "सदस्यता सक्रिय है। नामांकन स्वीकार किया गया।",
"wallet_failed": "वॉलेट फ़्लो विफल रहा।", "wallet_failed": "वॉलेट फ़्लो विफल रहा।",
"wallet_missing": "इस डिवाइस पर कोई वॉलेट नहीं मिला।", "wallet_missing": "इस डिवाइस पर कोई वॉलेट नहीं मिला।",
"notify_me": "मुझे सूचित करें", "notify_me": "मुझे सूचित करें",

View File

@ -41,6 +41,10 @@
"wallet_signing": "署名を待機中...", "wallet_signing": "署名を待機中...",
"wallet_verifying": "署名を検証しています...", "wallet_verifying": "署名を検証しています...",
"wallet_success": "指定が確認されました。", "wallet_success": "指定が確認されました。",
"membership_quoting": "メンバーシップのミントを準備中...",
"membership_minting": "ウォレットでメンバーシップのミントを確認してください...",
"membership_confirming": "オンチェーンでメンバーシップを確認中...",
"membership_active": "メンバーシップが有効です。指定が確認されました。",
"wallet_failed": "ウォレットフローに失敗しました。", "wallet_failed": "ウォレットフローに失敗しました。",
"wallet_missing": "この端末でウォレットが見つかりません。", "wallet_missing": "この端末でウォレットが見つかりません。",
"notify_me": "通知を受け取る", "notify_me": "通知を受け取る",

View File

@ -41,6 +41,10 @@
"wallet_signing": "서명 대기 중...", "wallet_signing": "서명 대기 중...",
"wallet_verifying": "서명 검증 중...", "wallet_verifying": "서명 검증 중...",
"wallet_success": "지정이 확인되었습니다.", "wallet_success": "지정이 확인되었습니다.",
"membership_quoting": "멤버십 민팅을 준비하는 중...",
"membership_minting": "지갑에서 멤버십 민팅을 확인하세요...",
"membership_confirming": "온체인 멤버십을 확인하는 중...",
"membership_active": "멤버십이 활성화되었습니다. 지정이 확인되었습니다.",
"wallet_failed": "지갑 흐름에 실패했습니다.", "wallet_failed": "지갑 흐름에 실패했습니다.",
"wallet_missing": "이 기기에서 지갑을 찾을 수 없습니다.", "wallet_missing": "이 기기에서 지갑을 찾을 수 없습니다.",
"notify_me": "알림 받기", "notify_me": "알림 받기",

View File

@ -41,6 +41,10 @@
"wallet_signing": "Aguardando assinatura...", "wallet_signing": "Aguardando assinatura...",
"wallet_verifying": "Verificando assinatura...", "wallet_verifying": "Verificando assinatura...",
"wallet_success": "Designação confirmada.", "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_failed": "Falha no fluxo de wallet.",
"wallet_missing": "Nenhuma wallet detectada neste dispositivo.", "wallet_missing": "Nenhuma wallet detectada neste dispositivo.",
"notify_me": "me avise", "notify_me": "me avise",

View File

@ -41,6 +41,10 @@
"wallet_signing": "Ожидание подписи...", "wallet_signing": "Ожидание подписи...",
"wallet_verifying": "Проверка подписи...", "wallet_verifying": "Проверка подписи...",
"wallet_success": "Назначение подтверждено.", "wallet_success": "Назначение подтверждено.",
"membership_quoting": "Подготовка минта членства...",
"membership_minting": "Подтвердите минт членства в вашем кошельке...",
"membership_confirming": "Подтверждение членства в сети...",
"membership_active": "Членство активно. Назначение подтверждено.",
"wallet_failed": "Сбой процесса кошелька.", "wallet_failed": "Сбой процесса кошелька.",
"wallet_missing": "Кошелек на этом устройстве не обнаружен.", "wallet_missing": "Кошелек на этом устройстве не обнаружен.",
"notify_me": "уведомить меня", "notify_me": "уведомить меня",

View File

@ -41,6 +41,10 @@
"wallet_signing": "等待签名...", "wallet_signing": "等待签名...",
"wallet_verifying": "正在验证签名...", "wallet_verifying": "正在验证签名...",
"wallet_success": "指定已确认。", "wallet_success": "指定已确认。",
"membership_quoting": "正在准备会员铸造...",
"membership_minting": "请在钱包中确认会员铸造...",
"membership_confirming": "正在链上确认会员资格...",
"membership_active": "会员已激活。指定已确认。",
"wallet_failed": "钱包流程失败。", "wallet_failed": "钱包流程失败。",
"wallet_missing": "此设备未检测到钱包。", "wallet_missing": "此设备未检测到钱包。",
"notify_me": "通知我", "notify_me": "通知我",