From 414c0ea3373d1f50b22a29872bd29ff8eb729791 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 15 Feb 2022 16:09:33 -0300 Subject: [PATCH] add list of "preferred" relays with policies. --- extension/options.jsx | 178 +++++++++++++++++++++++++++++++++--------- package.json | 2 + yarn.lock | 10 +++ 3 files changed, 151 insertions(+), 39 deletions(-) diff --git a/extension/options.jsx b/extension/options.jsx index d77924a..9e6ee36 100644 --- a/extension/options.jsx +++ b/extension/options.jsx @@ -1,17 +1,51 @@ import browser from 'webextension-polyfill' -import React, {useState, useEffect} from 'react' +import React, {useState, useCallback, useEffect} from 'react' import {render} from 'react-dom' +import {normalizeRelayURL} from 'nostr-tools/relay' +import {useDebouncedCallback} from 'use-debounce' import {getPermissionsString, readPermissions} from './common' function Options() { let [key, setKey] = useState('') + let [relays, setRelays] = useState([]) + let [newRelayURL, setNewRelayURL] = useState('') let [permissions, setPermissions] = useState() let [message, setMessage] = useState('') + const showMessage = useCallback(msg => { + setMessage(msg) + setTimeout(setMessage, 3000) + }) + + const saveRelays = useDebouncedCallback(async () => { + await browser.storage.local.set({ + relays: Object.fromEntries( + relays + .filter(({url}) => url.trim() !== '') + .map(({url, policy}) => [url.trim(), policy]) + ) + }) + showMessage('saved relays!') + }, 700) + useEffect(() => { - browser.storage.local.get(['private_key']).then(results => { + saveRelays() + }, [relays]) + + useEffect(() => { + browser.storage.local.get(['private_key', 'relays']).then(results => { if (results.private_key) setKey(results.private_key) + if (results.relays) { + let relaysList = [] + for (let url in results.relays) { + relaysList.push({ + url, + policy: results.relays[url] + }) + } + setRelays(relaysList) + } }) }, []) @@ -35,42 +69,81 @@ function Options() {

nos2x

nostr signer extension

options

- - {permissions?.length > 0 && ( - <> -

permissions

- - - - - - - - - - - {permissions.map(({host, level, condition, created_at}) => ( - - - - - +
+
preferred relays:
+
+ {relays.map(({url, policy}, i) => ( +
+ + + +
+ ))} +
+ setNewRelayURL(e.target.value)} + onBlur={addNewRelay} + /> +
+
+
+
+ + {permissions?.length > 0 && ( + <> +

permissions

+
domainpermissionsconditionsince
{host}{getPermissionsString(level)}{condition} - {new Date(created_at * 1000) - .toISOString() - .split('.')[0] - .split('T') - .join(' ')} -
+ + + + + + - ))} - -
domainpermissionsconditionsince
- - )} -
{message}
+ + + {permissions.map(({host, level, condition, created_at}) => ( + + {host} + {getPermissionsString(level)} + {condition} + + {new Date(created_at * 1000) + .toISOString() + .split('.')[0] + .split('T') + .join(' ')} + + + ))} + + + + )} + +
{message}
) @@ -82,10 +155,37 @@ function Options() { await browser.storage.local.set({ private_key: key }) - setMessage('saved!') - setTimeout(setMessage, 3000) + showMessage('saved private key!') } } + + function changeRelayURL(i, ev) { + setRelays([ + ...relays.slice(0, i), + {url: ev.target.value, policy: relays[i].policy}, + ...relays.slice(i + 1) + ]) + } + + function toggleRelayPolicy(i, cat) { + setRelays([ + ...relays.slice(0, i), + { + url: relays[i].url, + policy: {...relays[i].policy, [cat]: !relays[i].policy[cat]} + }, + ...relays.slice(i + 1) + ]) + } + + function addNewRelay() { + relays.push({ + url: normalizeRelayURL(newRelayURL), + policy: {read: true, write: true} + }) + setRelays(relays) + setNewRelayURL('') + } } render(, document.getElementById('main')) diff --git a/package.json b/package.json index f890447..c0afab9 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ "prettier": "^2.5.1", "react": "^17.0.2", "react-dom": "^17.0.2", + "use-boolean-state": "^1.0.2", + "use-debounce": "^7.0.1", "webextension-polyfill": "^0.8.0" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index e46e016..e0b8ffb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1450,6 +1450,16 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +use-boolean-state@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/use-boolean-state/-/use-boolean-state-1.0.2.tgz#4583f570a5f650741e808b5fa8a274f01adf764a" + integrity sha512-2qjR94L8GSbBKr7/qZrf14DH0PEREbtVMGeJ9kxAbpdgFp2xDux7rShCcHdnya5ca8jG+5fiRdX/aJqXi56BxA== + +use-debounce@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-7.0.1.tgz#380e6191cc13ad29f8e2149a12b5c37cc2891190" + integrity sha512-fOrzIw2wstbAJuv8PC9Vg4XgwyTLEOdq4y/Z3IhVl8DAE4svRcgyEUvrEXu+BMNgMoc3YND6qLT61kkgEKXh7Q== + utf-8-validate@^5.0.2: version "5.0.8" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58"