Add popup confirm mode, make on-demand mean connect+get_public_key

This commit is contained in:
artur 2024-02-06 11:41:51 +03:00
parent fa4c5d3532
commit 14940a4345
5 changed files with 51 additions and 20 deletions

1
.env
View File

@ -4,5 +4,4 @@ REACT_APP_WEB_PUSH_PUBKEY=BNW_39YcKbV4KunFxFhvMW5JUs8AljfFnGUeZpaerO-gwCoWyQat5o
#REACT_APP_NOAUTHD_URL=http://localhost:8000 #REACT_APP_NOAUTHD_URL=http://localhost:8000
REACT_APP_NOAUTHD_URL=https://noauthd.nsec.app REACT_APP_NOAUTHD_URL=https://noauthd.nsec.app
REACT_APP_DOMAIN=nsec.app REACT_APP_DOMAIN=nsec.app
REACT_APP_APP_DOMAIN=use.nsec.app
REACT_APP_RELAY=wss://relay.nsec.app REACT_APP_RELAY=wss://relay.nsec.app

View File

@ -27,6 +27,7 @@ export const ModalConfirmConnect = () => {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const appNpub = searchParams.get('appNpub') || '' const appNpub = searchParams.get('appNpub') || ''
const pendingReqId = searchParams.get('reqId') || '' const pendingReqId = searchParams.get('reqId') || ''
const isPopup = searchParams.get('popup') === 'true'
const triggerApp = apps.find((app) => app.appNpub === appNpub) const triggerApp = apps.find((app) => app.appNpub === appNpub)
const { name, icon = '' } = triggerApp || {} const { name, icon = '' } = triggerApp || {}
@ -68,17 +69,36 @@ export const ModalConfirmConnect = () => {
console.log('confirmed', id, allow, remember, options) console.log('confirmed', id, allow, remember, options)
closeModalAfterRequest() closeModalAfterRequest()
}) })
if (isPopup) window.close();
} }
const allow = () => { const allow = () => {
const options: any = {}; const options: any = {};
if (selectedActionType === ACTION_TYPE.BASIC) if (selectedActionType === ACTION_TYPE.BASIC)
options.perm = ACTION_TYPE.BASIC; options.perms = [ACTION_TYPE.BASIC];
// else
// options.perms = ['connect','get_public_key'];
confirmPending(pendingReqId, true, true, options) confirmPending(pendingReqId, true, true, options)
} }
const disallow = () => {
confirmPending(pendingReqId, false, true)
}
if (isPopup) {
document.addEventListener('visibilitychange', function() {
if (document.visibilityState == 'hidden') {
disallow();
}
})
}
return ( return (
<Modal open={isModalOpened} onClose={handleCloseModal}> <Modal
open={isModalOpened}
withCloseButton={!isPopup}
onClose={!isPopup ? handleCloseModal : undefined}
>
<Stack gap={'1rem'} paddingTop={'1rem'}> <Stack gap={'1rem'} paddingTop={'1rem'}>
<Stack <Stack
direction={'row'} direction={'row'}
@ -128,7 +148,7 @@ export const ModalConfirmConnect = () => {
</StyledToggleButtonsGroup> </StyledToggleButtonsGroup>
<Stack direction={'row'} gap={'1rem'}> <Stack direction={'row'} gap={'1rem'}>
<StyledButton <StyledButton
onClick={() => confirmPending(pendingReqId, false, true)} onClick={disallow}
varianttype='secondary' varianttype='secondary'
> >
Disallow Disallow

View File

@ -55,6 +55,7 @@ export const ModalConfirmEvent: FC<ModalConfirmEventProps> = ({
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const appNpub = searchParams.get('appNpub') || '' const appNpub = searchParams.get('appNpub') || ''
const isPopup = searchParams.get('popup') === 'true'
const { npub = '' } = useParams<{ npub: string }>() const { npub = '' } = useParams<{ npub: string }>()
const apps = useAppSelector((state) => selectAppsByNpub(state, npub)) const apps = useAppSelector((state) => selectAppsByNpub(state, npub))
@ -118,6 +119,7 @@ export const ModalConfirmEvent: FC<ModalConfirmEventProps> = ({
}) })
}) })
closeModalAfterRequest() closeModalAfterRequest()
if (isPopup) window.close();
} }
const handleChangeCheckbox = (reqId: string) => () => { const handleChangeCheckbox = (reqId: string) => () => {
@ -137,8 +139,20 @@ export const ModalConfirmEvent: FC<ModalConfirmEventProps> = ({
return action return action
} }
if (isPopup) {
document.addEventListener('visibilitychange', () => {
if (document.visibilityState == 'hidden') {
confirmPending(false);
}
})
}
return ( return (
<Modal open={isModalOpened} onClose={handleCloseModal}> <Modal
open={isModalOpened}
withCloseButton={!isPopup}
onClose={!isPopup ? handleCloseModal : undefined}
>
<Stack gap={'1rem'} paddingTop={'1rem'}> <Stack gap={'1rem'} paddingTop={'1rem'}>
<Stack <Stack
direction={'row'} direction={'row'}

View File

@ -8,7 +8,7 @@ import NDK, {
NDKPrivateKeySigner, NDKPrivateKeySigner,
NDKSigner, NDKSigner,
} from '@nostr-dev-kit/ndk' } from '@nostr-dev-kit/ndk'
import { NOAUTHD_URL, WEB_PUSH_PUBKEY, NIP46_RELAYS, MIN_POW, MAX_POW, KIND_RPC, APP_DOMAIN } from '../utils/consts' import { NOAUTHD_URL, WEB_PUSH_PUBKEY, NIP46_RELAYS, MIN_POW, MAX_POW, KIND_RPC } from '../utils/consts'
import { Nip04 } from './nip04' import { Nip04 } from './nip04'
import { getReqPerm, getShortenNpub, isPackagePerm } from '@/utils/helpers/helpers' import { getReqPerm, getShortenNpub, isPackagePerm } from '@/utils/helpers/helpers'
import { NostrPowEvent, minePow } from './pow' import { NostrPowEvent, minePow } from './pow'
@ -647,7 +647,6 @@ export class NoauthBackend {
} }
} else { } else {
// just send to db w/o waiting for it // just send to db w/o waiting for it
// if (!PERF_TEST)
dbi.addConfirmed({ dbi.addConfirmed({
...req, ...req,
allowed: allow, allowed: allow,
@ -664,17 +663,18 @@ export class NoauthBackend {
if (index >= 0) self.confirmBuffer.splice(index, 1) if (index >= 0) self.confirmBuffer.splice(index, 1)
if (remember) { if (remember) {
let perm = getReqPerm(req) let newPerms = [getReqPerm(req)]
if (allow && options && options.perm) perm = options.perm if (allow && options && options.perms) newPerms = options.perms
await dbi.addPerm({ for (const p of newPerms)
id: req.id, await dbi.addPerm({
npub: req.npub, id: req.id,
appNpub: req.appNpub, npub: req.npub,
perm, appNpub: req.appNpub,
value: allow ? '1' : '0', perm: p,
timestamp: Date.now(), value: allow ? '1' : '0',
}) timestamp: Date.now(),
})
this.perms = await dbi.listPerms() this.perms = await dbi.listPerms()
@ -689,7 +689,6 @@ export class NoauthBackend {
) )
for (const r of otherReqs) { for (const r of otherReqs) {
const perm = this.getPerm(r.req) const perm = this.getPerm(r.req)
// if (r.req.method === req.method) {
if (perm) { if (perm) {
r.cb(perm === '1', false) r.cb(perm === '1', false)
} }
@ -728,7 +727,7 @@ export class NoauthBackend {
// OAuth flow // OAuth flow
const confirmMethod = method === 'connect' ? 'confirm-connect' : 'confirm-event' const confirmMethod = method === 'connect' ? 'confirm-connect' : 'confirm-event'
const authUrl = `https://${APP_DOMAIN}/key/${npub}?${confirmMethod}=true&appNpub=${appNpub}&reqId=${id}` const authUrl = `${self.swg.location.origin}/key/${npub}?${confirmMethod}=true&appNpub=${appNpub}&reqId=${id}&popup=true`
backend.rpc.sendResponse(id, remotePubkey, 'auth_url', KIND_RPC, authUrl) backend.rpc.sendResponse(id, remotePubkey, 'auth_url', KIND_RPC, authUrl)
// show notifs // show notifs

View File

@ -1,7 +1,6 @@
export const NOAUTHD_URL = process.env.REACT_APP_NOAUTHD_URL export const NOAUTHD_URL = process.env.REACT_APP_NOAUTHD_URL
export const WEB_PUSH_PUBKEY = process.env.REACT_APP_WEB_PUSH_PUBKEY export const WEB_PUSH_PUBKEY = process.env.REACT_APP_WEB_PUSH_PUBKEY
export const DOMAIN = process.env.REACT_APP_DOMAIN export const DOMAIN = process.env.REACT_APP_DOMAIN
export const APP_DOMAIN = process.env.REACT_APP_APP_DOMAIN
export const RELAY = process.env.REACT_APP_RELAY || 'wss://relay.nsec.app' export const RELAY = process.env.REACT_APP_RELAY || 'wss://relay.nsec.app'
export const NIP46_RELAYS = [RELAY] export const NIP46_RELAYS = [RELAY]