fix: wait for extension

This commit is contained in:
codytseng
2025-01-21 09:37:43 +08:00
parent 81218054a0
commit 59f126e960
2 changed files with 25 additions and 9 deletions

View File

@@ -192,6 +192,7 @@ export function NostrProvider({ children }: { children: React.ReactNode }) {
const nip07Login = async () => {
try {
const nip07Signer = new Nip07Signer()
await nip07Signer.init()
const pubkey = await nip07Signer.getPublicKey()
if (!pubkey) {
throw new Error('You did not allow to access your pubkey')
@@ -253,6 +254,7 @@ export function NostrProvider({ children }: { children: React.ReactNode }) {
}
} else if (account.signerType === 'nip-07') {
const nip07Signer = new Nip07Signer()
await nip07Signer.init()
return login(nip07Signer, account)
} else if (account.signerType === 'bunker') {
if (account.bunker && account.bunkerClientSecretKey) {

View File

@@ -1,19 +1,30 @@
import { ISigner, TDraftEvent, TNip07 } from '@/types'
export class Nip07Signer implements ISigner {
private signer: TNip07
private signer: TNip07 | undefined
private pubkey: string | null = null
constructor() {
if (!window.nostr) {
throw new Error(
'You need to install a nostr signer extension to login. Such as alby, nostr-keyx or nos2x.'
)
async init() {
const checkInterval = 100
const maxAttempts = 50
for (let attempt = 0; attempt < maxAttempts; attempt++) {
if (window.nostr) {
this.signer = window.nostr
return
}
await new Promise((resolve) => setTimeout(resolve, checkInterval))
}
this.signer = window.nostr
throw new Error(
'You need to install a nostr signer extension to login. Such as alby, nostr-keyx or nos2x.'
)
}
async getPublicKey() {
if (!this.signer) {
throw new Error('Should call init() first')
}
if (!this.pubkey) {
this.pubkey = await this.signer.getPublicKey()
}
@@ -21,12 +32,15 @@ export class Nip07Signer implements ISigner {
}
async signEvent(draftEvent: TDraftEvent) {
if (!this.signer) {
throw new Error('Should call init() first')
}
return await this.signer.signEvent(draftEvent)
}
async nip04Encrypt(pubkey: string, plainText: string) {
if (!this.signer) {
throw new Error('Not logged in')
throw new Error('Should call init() first')
}
if (!this.signer.nip04?.encrypt) {
throw new Error('The extension you are using does not support nip04 encryption')
@@ -36,7 +50,7 @@ export class Nip07Signer implements ISigner {
async nip04Decrypt(pubkey: string, cipherText: string) {
if (!this.signer) {
throw new Error('Not logged in')
throw new Error('Should call init() first')
}
if (!this.signer.nip04?.decrypt) {
throw new Error('The extension you are using does not support nip04 decryption')