From 37adfd0405998d50a0058caaea4f351cb550dcdf Mon Sep 17 00:00:00 2001 From: Oren Date: Mon, 21 Oct 2024 19:09:59 +0300 Subject: [PATCH 1/2] options page for bunker url --- extension/options.jsx | 192 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 169 insertions(+), 23 deletions(-) diff --git a/extension/options.jsx b/extension/options.jsx index 2b44d13..831f451 100644 --- a/extension/options.jsx +++ b/extension/options.jsx @@ -1,6 +1,7 @@ import { bytesToHex, hexToBytes } from '@noble/hashes/utils' import { getPublicKey } from 'nostr-tools' import * as nip19 from 'nostr-tools/nip19' +import * as nip46 from 'nostr-tools/nip46' import { decrypt, encrypt } from 'nostr-tools/nip49' import { generateSecretKey } from 'nostr-tools/pure' import qrcodeParser from 'qrcode-parser' @@ -11,6 +12,9 @@ import QrReader from 'react-qr-scanner' import browser from 'webextension-polyfill' import { removePermissions } from './common' +const bunkerValidityCheckDebounceMs = 400 +const bunkerConnectionTimeoutMs = 30000 + function Options() { let [privKey, setPrivKey] = useState(null) let [privKeyInput, setPrivKeyInput] = useState('') @@ -19,6 +23,10 @@ function Options() { let [errorMessage, setErrorMessage] = useState('') let [successMessage, setSuccessMessage] = useState('') let [relays, setRelays] = useState([]) + const [bunkerUrl, setBunkerUrl] = useState('') + const [bunkerUrlInput, setBunkerUrlInput] = useState('') + const [isSaving, setIsSaving] = useState(false) + const [connectionTestStage, setConnectionTestStage] = useState(null) let [newRelayURL, setNewRelayURL] = useState('') let [policies, setPermissions] = useState([]) let [protocolHandler, setProtocolHandler] = useState('https://njump.me/{raw}') @@ -46,7 +54,7 @@ function Options() { useEffect(() => { browser.storage.local - .get(['private_key', 'relays', 'protocol_handler', 'notifications']) + .get(['private_key', 'relays', 'protocol_handler', 'notifications', 'bunker_url']) .then(results => { if (results.private_key) { let prvKey = results.private_key @@ -72,6 +80,10 @@ function Options() { if (results.notifications) { setNotifications(true) } + if (results.bunker_url) { + setBunkerUrl(results.bunker_url) + setBunkerUrlInput(results.bunker_url) + } }) }, []) @@ -102,6 +114,28 @@ function Options() { setTimeout(() => setWarningMessage(''), 5000) }, [warningMessage]) + useEffect(() => { + if (bunkerUrl === bunkerUrlInput) { + return + } + const debounceTimeout = setTimeout(async () => { + try { + if (bunkerUrlInput !== '') { + const newBunkerPointer = await nip46.parseBunkerInput(bunkerUrlInput) + if (!newBunkerPointer) { + // Unpraseable url - do not allow saving + return + } + } + setBunkerUrl(bunkerUrlInput) + addUnsavedChanges('bunker_url') + } catch (err) { + /***/ + } + }, bunkerValidityCheckDebounceMs) + return () => clearTimeout(debounceTimeout) + }, [bunkerUrl, bunkerUrlInput, setBunkerUrl, addUnsavedChanges]) + async function loadQrCodeFromFile(type = 'image/*') { setScanning(false) const input = document.createElement('input') @@ -421,6 +455,46 @@ function Options() { +
+
bunker url (optional):
+
+
+ setBunkerUrlInput(e.target.value.trim())} + placeholder='bunker:// URL or name@domain.com NIP-05 identifier' + disabled={connectionTestStage} + /> + +
+ { connectionTestStage && connectionTestStage.result } +
+
+
+