refactor for better message handling

This commit is contained in:
padreug 2025-02-15 01:33:32 +01:00
parent 5eb46e96c3
commit d1ac7da1a6
7 changed files with 240 additions and 73 deletions

View file

@ -97,6 +97,30 @@ export const useNostrStore = defineStore('nostr', () => {
const relayPool = ref<any[]>([])
const processedMessageIds = ref(new Set<string>())
const currentSubscription = ref<any | null>(null)
const hasActiveSubscription = ref(false)
// Load stored messages and IDs on initialization
const initializeFromStorage = () => {
try {
const storedMessages = JSON.parse(localStorage.getItem('nostr_messages') || '[]')
const messageMap = new Map(storedMessages)
// Initialize processedMessageIds from stored messages
messageMap.forEach(msgs => {
msgs.forEach(msg => {
processedMessageIds.value.add(msg.id)
})
})
messages.value = messageMap
} catch (err) {
console.error('Failed to load stored messages:', err)
localStorage.removeItem('nostr_messages')
}
}
// Call initialization
initializeFromStorage()
// Watch account changes and persist to localStorage
watch(account, (newAccount) => {
@ -107,6 +131,17 @@ export const useNostrStore = defineStore('nostr', () => {
}
}, { deep: true })
// Watch messages for changes and persist
watch(messages, (newMessages) => {
try {
localStorage.setItem('nostr_messages',
JSON.stringify(Array.from(newMessages.entries()))
)
} catch (err) {
console.error('Failed to save messages:', err)
}
}, { deep: true })
// Initialize store if account exists in localStorage
if (account.value) {
console.log('Found existing account, initializing connection...')
@ -124,8 +159,7 @@ export const useNostrStore = defineStore('nostr', () => {
if (!account.value) return
try {
// Clear existing state
messages.value.clear()
// Only clear profiles and processed IDs
profiles.value.clear()
processedMessageIds.value.clear()
@ -186,7 +220,10 @@ export const useNostrStore = defineStore('nostr', () => {
relayPool.value = []
messages.value.clear()
profiles.value.clear()
processedMessageIds.value.clear()
activeChat.value = null
localStorage.removeItem('nostr_messages')
localStorage.removeItem('nostr_account')
}
const addMessage = async (pubkey: string, message: DirectMessage) => {
@ -200,12 +237,21 @@ export const useNostrStore = defineStore('nostr', () => {
// Add message to the map
const userMessages = messages.value.get(pubkey) || []
messages.value.set(pubkey, [...userMessages, message])
// Check for duplicates by content and timestamp (backup check)
const isDuplicate = userMessages.some(msg =>
msg.content === message.content &&
Math.abs(msg.created_at - message.created_at) < 1
)
// Sort messages by timestamp
const sortedMessages = messages.value.get(pubkey) || []
sortedMessages.sort((a, b) => a.created_at - b.created_at)
messages.value.set(pubkey, sortedMessages)
if (!isDuplicate) {
messages.value.set(pubkey, [...userMessages, message])
// Sort messages by timestamp
const sortedMessages = messages.value.get(pubkey) || []
sortedMessages.sort((a, b) => a.created_at - b.created_at)
messages.value.set(pubkey, sortedMessages)
}
}
async function sendMessage(to: string, content: string) {
@ -241,8 +287,9 @@ export const useNostrStore = defineStore('nostr', () => {
}
async function subscribeToMessages() {
if (!account.value) return
if (!account.value || hasActiveSubscription.value) return
hasActiveSubscription.value = true
// Cleanup existing subscription
unsubscribeFromMessages()
@ -395,6 +442,7 @@ export const useNostrStore = defineStore('nostr', () => {
}
currentSubscription.value = null
}
hasActiveSubscription.value = false
}
async function loadProfiles() {
@ -492,18 +540,28 @@ export const useNostrStore = defineStore('nostr', () => {
await subscribeToMessages()
}
// Add visibility change handler
// Update visibility handler
function setupVisibilityHandler() {
document.addEventListener('visibilitychange', async () => {
const handleVisibilityChange = async () => {
if (document.visibilityState === 'visible' && account.value) {
console.log('Page became visible, reconnecting...')
console.log('Page became visible, checking connection...')
try {
await reconnectToRelays()
// Only reconnect if we don't have active connections
if (relayPool.value.length === 0 || !hasActiveSubscription.value) {
await reconnectToRelays()
}
} catch (err) {
console.error('Failed to reconnect:', err)
}
}
})
}
// Remove any existing handler
document.removeEventListener('visibilitychange', handleVisibilityChange)
document.addEventListener('visibilitychange', handleVisibilityChange)
// Add focus handler for mobile
window.addEventListener('focus', handleVisibilityChange)
}
return {
@ -521,5 +579,6 @@ export const useNostrStore = defineStore('nostr', () => {
unsubscribeFromMessages,
loadProfiles,
connectionStatus,
hasActiveSubscription,
}
})