diff --git a/modules/rcart/components/folk-payment-request.ts b/modules/rcart/components/folk-payment-request.ts index f840148..f267de9 100644 --- a/modules/rcart/components/folk-payment-request.ts +++ b/modules/rcart/components/folk-payment-request.ts @@ -16,6 +16,7 @@ class FolkPaymentRequest extends HTMLElement { private authenticated = false; private walletAddress = ''; private did = ''; + private username = ''; private authError = ''; private authenticating = false; @@ -80,14 +81,18 @@ class FolkPaymentRequest extends HTMLElement { const hasSession = sm.isValid() || !!rstackSession; if (!hasSession) return; - // Get DID from either source - this.did = sm.getDID() || rstackSession?.claims?.did || rstackSession?.claims?.sub || ''; - - // Get wallet address from session claims + // Get identity from either source const smState = sm.getSession(); + this.did = sm.getDID() || rstackSession?.claims?.did || rstackSession?.claims?.sub || ''; + this.username = smState?.claims?.username || rstackSession?.claims?.username || ''; + + // Valid session = authenticated, regardless of wallet derivation + this.authenticated = true; + + // Try to get wallet address from session claims this.walletAddress = smState?.claims?.eid?.walletAddress || rstackSession?.claims?.eid?.walletAddress || ''; - // If session exists but no wallet address, try deriving from key manager + // If no wallet in claims, try deriving from key manager if (!this.walletAddress) { try { const { getKeyManager } = await import('../../../src/encryptid/key-derivation'); @@ -99,10 +104,7 @@ class FolkPaymentRequest extends HTMLElement { } catch { /* key manager not ready */ } } - if (this.walletAddress) { - this.authenticated = true; - this.render(); - } + this.render(); } catch { /* session module not available */ } } @@ -167,12 +169,37 @@ class FolkPaymentRequest extends HTMLElement { // ── Generate payment request ── private async generatePayment() { - if (!this.walletAddress || !this.description) return; + if (!this.description) return; if (!this.amountEditable && !this.amount) return; this.generating = true; + this.authError = ''; this.render(); + // Derive wallet on-demand if not yet available + if (!this.walletAddress) { + try { + const { getKeyManager } = await import('../../../src/encryptid/key-derivation'); + const km = getKeyManager(); + if (!km.isInitialized()) { + // Trigger passkey to initialize key manager + const identity = document.querySelector('rstack-identity') as any; + if (identity?.deriveKeys) await identity.deriveKeys(); + } + if (km.isInitialized()) { + const keys = await km.getKeys(); + if (keys.eoaAddress) this.walletAddress = keys.eoaAddress; + } + } catch { /* derivation failed */ } + + if (!this.walletAddress) { + this.authError = 'Could not derive wallet address. Please try signing in again.'; + this.generating = false; + this.render(); + return; + } + } + try { const { getSessionManager } = await import('../../../src/encryptid/session'); const { getSession: getRstackSession } = await import('../../../shared/components/rstack-identity'); @@ -283,13 +310,24 @@ class FolkPaymentRequest extends HTMLElement { `; } + private get displayName(): string { + return this.username || (this.did.length > 24 ? this.did.slice(0, 16) + '...' + this.did.slice(-6) : this.did); + } + private renderForm(): string { - return ` -