diff --git a/src/hooks/useOfflineSync.ts b/src/hooks/useOfflineSync.ts index 03dcafa6..44f99cf6 100644 --- a/src/hooks/useOfflineSync.ts +++ b/src/hooks/useOfflineSync.ts @@ -48,7 +48,17 @@ export function useOfflineSync({ if (wasLocalOnly && isNowOnline) { console.log('✈️ Detected transition: Flight Mode → Online') - syncLocalEventsToRemote(relayPool, account) + console.log('📊 Relay state:', { + connectedRelays: connectedRelays.length, + remoteRelays: connectedRelays.filter(r => !isLocalRelay(r.url)).length, + localRelays: connectedRelays.filter(r => isLocalRelay(r.url)).length + }) + + // Wait a moment for relays to fully establish connections + setTimeout(() => { + console.log('🚀 Starting sync after delay...') + syncLocalEventsToRemote(relayPool, account) + }, 2000) } previousStateRef.current.hasRemoteRelays = hasRemoteRelays diff --git a/src/services/highlightCreationService.ts b/src/services/highlightCreationService.ts index 663e072e..5ba69b1b 100644 --- a/src/services/highlightCreationService.ts +++ b/src/services/highlightCreationService.ts @@ -8,6 +8,7 @@ import { RELAYS } from '../config/relays' import { Highlight } from '../types/highlights' import { UserSettings } from './settingsService' import { areAllRelaysLocal } from '../utils/helpers' +import { markEventAsOfflineCreated } from './offlineSyncService' // Boris pubkey for zap splits const BORIS_PUBKEY = '6e468422dfb74a5738702a8823b9b28168fc6cfb119d613e49ca0ec5a0bbd0c3' @@ -142,6 +143,11 @@ export async function createHighlight( eventId: signedEvent.id }) + // If we're in local-only mode, mark this event for later sync + if (isLocalOnly) { + markEventAsOfflineCreated(signedEvent.id) + } + // Convert to Highlight with relay tracking info const highlight = eventToHighlight(signedEvent) highlight.publishedRelays = actualPublishedRelays diff --git a/src/services/offlineSyncService.ts b/src/services/offlineSyncService.ts index 7b282efb..191b6970 100644 --- a/src/services/offlineSyncService.ts +++ b/src/services/offlineSyncService.ts @@ -6,6 +6,17 @@ import { isLocalRelay } from '../utils/helpers' let isSyncing = false +// Track events created during offline period +const offlineCreatedEvents = new Set() + +/** + * Marks an event as created during offline period + */ +export function markEventAsOfflineCreated(eventId: string): void { + offlineCreatedEvents.add(eventId) + console.log(`📝 Marked event ${eventId.slice(0, 8)} as offline-created. Total: ${offlineCreatedEvents.size}`) +} + /** * Syncs local-only events to remote relays when coming back online */ @@ -19,14 +30,24 @@ export async function syncLocalEventsToRemote( } console.log('🔄 Coming back online - syncing local events to remote relays...') + console.log(`📦 Offline events tracked: ${offlineCreatedEvents.size}`) isSyncing = true try { const localRelays = RELAYS.filter(isLocalRelay) const remoteRelays = RELAYS.filter(url => !isLocalRelay(url)) - if (localRelays.length === 0 || remoteRelays.length === 0) { - console.log('⚠️ No local or remote relays available for sync') + console.log(`📡 Local relays: ${localRelays.length}, Remote relays: ${remoteRelays.length}`) + + if (localRelays.length === 0) { + console.log('⚠️ No local relays available for sync') + isSyncing = false + return + } + + if (remoteRelays.length === 0) { + console.log('⚠️ No remote relays available for sync') + isSyncing = false return } @@ -34,6 +55,8 @@ export async function syncLocalEventsToRemote( const since = Math.floor(Date.now() / 1000) - (24 * 60 * 60) const eventsToSync: NostrEvent[] = [] + console.log(`🔍 Querying local relays for events since ${new Date(since * 1000).toISOString()}...`) + // Query for user's events from local relays const filters = [ { kinds: [9802], authors: [account.pubkey], since }, // Highlights @@ -41,31 +64,38 @@ export async function syncLocalEventsToRemote( ] for (const filter of filters) { + console.log(`🔎 Querying with filter:`, filter) const events = await new Promise((resolve) => { const collected: NostrEvent[] = [] const sub = relayPool.req(localRelays, filter, { onevent: (event: NostrEvent) => { + console.log(`📥 Received event ${event.id.slice(0, 8)} (kind ${event.kind}) from local relay`) collected.push(event) }, oneose: () => { + console.log(`✅ EOSE received, collected ${collected.length} events`) sub.close() resolve(collected) } }) - // Timeout after 5 seconds + // Timeout after 10 seconds (increased from 5) setTimeout(() => { + console.log(`⏱️ Query timeout, collected ${collected.length} events`) sub.close() resolve(collected) - }, 5000) + }, 10000) }) eventsToSync.push(...events) } + console.log(`📊 Total events collected: ${eventsToSync.length}`) + if (eventsToSync.length === 0) { console.log('✅ No local events to sync') isSyncing = false + offlineCreatedEvents.clear() return } @@ -88,6 +118,9 @@ export async function syncLocalEventsToRemote( } console.log(`✅ Synced ${successCount}/${uniqueEvents.length} events to remote relays`) + + // Clear offline events tracking after successful sync + offlineCreatedEvents.clear() } catch (error) { console.error('❌ Error during offline sync:', error) } finally {