diff --git a/src/stores/nostr.ts b/src/stores/nostr.ts index 33bae6d..6fafc58 100644 --- a/src/stores/nostr.ts +++ b/src/stores/nostr.ts @@ -99,6 +99,12 @@ export const useNostrStore = defineStore('nostr', () => { } }, { deep: true }) + // Initialize store if account exists in localStorage + if (account.value) { + console.log('Found existing account, initializing connection...') + init() + } + // Computed const isLoggedIn = computed(() => !!account.value) const currentMessages = computed(() => @@ -252,72 +258,98 @@ export const useNostrStore = defineStore('nostr', () => { since: 0 // Get all historical messages } - relayPool.value.forEach(relay => { - // Subscribe to received messages - const receivedSub = relay.sub([receivedFilter]) - - receivedSub.on('event', async (event: NostrEvent) => { - try { - // Skip if we've already processed this message - if (processedMessageIds.value.has(event.id)) { - return + const subscribeToRelay = (relay: any) => { + return new Promise((resolve) => { + let receivedCount = 0 + let sentCount = 0 + let eoseCount = 0 + + // Subscribe to received messages + const receivedSub = relay.sub([receivedFilter]) + + receivedSub.on('event', async (event: NostrEvent) => { + try { + // Skip if we've already processed this message + if (processedMessageIds.value.has(event.id)) { + return + } + + receivedCount++ + const decrypted = await window.NostrTools.nip04.decrypt( + account.value!.privkey, + event.pubkey, + event.content + ) + + const dm: DirectMessage = { + id: event.id, + pubkey: event.pubkey, + content: decrypted, + created_at: event.created_at, + sent: false + } + + await addMessage(event.pubkey, dm) + + // Load profile if not already loaded + if (!profiles.value.has(event.pubkey)) { + await loadProfiles() + } + } catch (err) { + console.error('Failed to decrypt received message:', err) } + }) - const decrypted = await window.NostrTools.nip04.decrypt( - account.value!.privkey, - event.pubkey, - event.content - ) + // Subscribe to sent messages + const sentSub = relay.sub([sentFilter]) + + sentSub.on('event', async (event: NostrEvent) => { + try { + // Skip if we've already processed this message + if (processedMessageIds.value.has(event.id)) { + return + } - const dm: DirectMessage = { - id: event.id, - pubkey: event.pubkey, - content: decrypted, - created_at: event.created_at, - sent: false + sentCount++ + const decrypted = await window.NostrTools.nip04.decrypt( + account.value!.privkey, + SUPPORT_NPUB, + event.content + ) + + const dm: DirectMessage = { + id: event.id, + pubkey: SUPPORT_NPUB, + content: decrypted, + created_at: event.created_at, + sent: true + } + + await addMessage(SUPPORT_NPUB, dm) + } catch (err) { + console.error('Failed to decrypt sent message:', err) } + }) - await addMessage(event.pubkey, dm) - - // Load profile if not already loaded - if (!profiles.value.has(event.pubkey)) { - await loadProfiles() + // Listen for end of stored events + receivedSub.on('eose', () => { + eoseCount++ + if (eoseCount >= 2) { // Both subscriptions have finished + resolve(true) } - } catch (err) { - console.error('Failed to decrypt received message:', err) - } + }) + + sentSub.on('eose', () => { + eoseCount++ + if (eoseCount >= 2) { // Both subscriptions have finished + resolve(true) + } + }) }) + } - // Subscribe to sent messages - const sentSub = relay.sub([sentFilter]) - - sentSub.on('event', async (event: NostrEvent) => { - try { - // Skip if we've already processed this message - if (processedMessageIds.value.has(event.id)) { - return - } - - const decrypted = await window.NostrTools.nip04.decrypt( - account.value!.privkey, - SUPPORT_NPUB, - event.content - ) - - const dm: DirectMessage = { - id: event.id, - pubkey: SUPPORT_NPUB, - content: decrypted, - created_at: event.created_at, - sent: true - } - - await addMessage(SUPPORT_NPUB, dm) - } catch (err) { - console.error('Failed to decrypt sent message:', err) - } - }) - }) + // Wait for all relays to load their historical messages + await Promise.all(relayPool.value.map(relay => subscribeToRelay(relay))) } return {