From c06176bfc98265a6ab51f3d228f207a3e9c5271d Mon Sep 17 00:00:00 2001 From: Gigi Date: Fri, 17 Oct 2025 12:31:31 +0200 Subject: [PATCH] feat(debug): add bunker login section as first section of debug page --- src/components/Debug.tsx | 102 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/src/components/Debug.tsx b/src/components/Debug.tsx index 4e569bb2..f0897b71 100644 --- a/src/components/Debug.tsx +++ b/src/components/Debug.tsx @@ -3,12 +3,16 @@ import React, { useEffect, useMemo, useState } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faClock } from '@fortawesome/free-solid-svg-icons' import { Hooks } from 'applesauce-react' +import { Accounts } from 'applesauce-accounts' +import { NostrConnectSigner } from 'applesauce-signers' +import { getDefaultBunkerPermissions } from '../services/nostrConnect' import { DebugBus, type DebugLogEntry } from '../utils/debugBus' const defaultPayload = 'The quick brown fox jumps over the lazy dog.' const Debug: React.FC = () => { const activeAccount = Hooks.useActiveAccount() + const accountManager = Hooks.useAccountManager() const [payload, setPayload] = useState(defaultPayload) const [cipher44, setCipher44] = useState('') const [cipher04, setCipher04] = useState('') @@ -20,6 +24,11 @@ const Debug: React.FC = () => { const [tDecrypt04, setTDecrypt04] = useState(null) const [logs, setLogs] = useState(DebugBus.snapshot()) const [debugEnabled, setDebugEnabled] = useState(() => localStorage.getItem('debug') === '*') + + // Bunker login state + const [bunkerUri, setBunkerUri] = useState('') + const [isBunkerLoading, setIsBunkerLoading] = useState(false) + const [bunkerError, setBunkerError] = useState(null) useEffect(() => { return DebugBus.subscribe((e) => setLogs(prev => [...prev, e].slice(-300))) @@ -79,6 +88,52 @@ const Debug: React.FC = () => { else localStorage.removeItem('debug') } + const handleBunkerLogin = async () => { + if (!bunkerUri.trim()) { + setBunkerError('Please enter a bunker URI') + return + } + + if (!bunkerUri.startsWith('bunker://')) { + setBunkerError('Invalid bunker URI. Must start with bunker://') + return + } + + try { + setIsBunkerLoading(true) + setBunkerError(null) + + // Create signer from bunker URI with default permissions + const permissions = getDefaultBunkerPermissions() + const signer = await NostrConnectSigner.fromBunkerURI(bunkerUri, { permissions }) + + // Get pubkey from signer + const pubkey = await signer.getPublicKey() + + // Create account from signer + const account = new Accounts.NostrConnectAccount(pubkey, signer) + + // Add to account manager and set active + accountManager.addAccount(account) + accountManager.setActive(account) + + // Clear input on success + setBunkerUri('') + } catch (err) { + console.error('[bunker] Login failed:', err) + const errorMessage = err instanceof Error ? err.message : 'Failed to connect to bunker' + + // Check for permission-related errors + if (errorMessage.toLowerCase().includes('permission') || errorMessage.toLowerCase().includes('unauthorized')) { + setBunkerError('Your bunker connection is missing signing permissions. Reconnect and approve signing.') + } else { + setBunkerError(errorMessage) + } + } finally { + setIsBunkerLoading(false) + } + } + const CodeBox = ({ value }: { value: string }) => (
 {
         
       
 
+      {/* Bunker Login Section */}
+      
+
+
+

Bunker Connection

+ {!activeAccount ? ( +
+
Connect to your bunker (Nostr Connect signer) to enable encryption/decryption testing
+
+ setBunkerUri(e.target.value)} + disabled={isBunkerLoading} + /> + +
+ {bunkerError && ( +
{bunkerError}
+ )} +
+ ) : ( +
+
+
Connected to bunker
+
{pubkey}
+
+ +
+ )} +
+
+
+