diff --git a/src/components/ContentPanel.tsx b/src/components/ContentPanel.tsx index c932fd92..78728397 100644 --- a/src/components/ContentPanel.tsx +++ b/src/components/ContentPanel.tsx @@ -150,8 +150,21 @@ const ContentPanel: React.FC = ({ // Callback to save reading position const handleSavePosition = useCallback(async (position: number) => { - if (!activeAccount || !relayPool || !eventStore || !articleIdentifier) return - if (!settings?.syncReadingPosition) return + if (!activeAccount || !relayPool || !eventStore || !articleIdentifier) { + console.log('⏭️ [ContentPanel] Skipping save - missing requirements:', { + hasAccount: !!activeAccount, + hasRelayPool: !!relayPool, + hasEventStore: !!eventStore, + hasIdentifier: !!articleIdentifier + }) + return + } + if (!settings?.syncReadingPosition) { + console.log('⏭️ [ContentPanel] Sync disabled in settings') + return + } + + console.log('💾 [ContentPanel] Saving position:', Math.round(position * 100) + '%', 'for article:', selectedUrl?.slice(0, 50)) try { const factory = new EventFactory({ signer: activeAccount }) @@ -167,9 +180,9 @@ const ContentPanel: React.FC = ({ } ) } catch (error) { - console.error('Failed to save reading position:', error) + console.error('❌ [ContentPanel] Failed to save reading position:', error) } - }, [activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition]) + }, [activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition, selectedUrl]) const { isReadingComplete, progressPercentage, saveNow } = useReadingPosition({ enabled: isTextContent, @@ -185,8 +198,22 @@ const ContentPanel: React.FC = ({ // Load saved reading position when article loads useEffect(() => { - if (!isTextContent || !activeAccount || !relayPool || !eventStore || !articleIdentifier) return - if (!settings?.syncReadingPosition) return + if (!isTextContent || !activeAccount || !relayPool || !eventStore || !articleIdentifier) { + console.log('⏭️ [ContentPanel] Skipping position restore - missing requirements:', { + isTextContent, + hasAccount: !!activeAccount, + hasRelayPool: !!relayPool, + hasEventStore: !!eventStore, + hasIdentifier: !!articleIdentifier + }) + return + } + if (!settings?.syncReadingPosition) { + console.log('⏭️ [ContentPanel] Sync disabled - not restoring position') + return + } + + console.log('📖 [ContentPanel] Loading position for article:', selectedUrl?.slice(0, 50)) const loadPosition = async () => { try { @@ -198,6 +225,7 @@ const ContentPanel: React.FC = ({ ) if (savedPosition && savedPosition.position > 0.05 && savedPosition.position < 0.95) { + console.log('🎯 [ContentPanel] Restoring position:', Math.round(savedPosition.position * 100) + '%') // Wait for content to be fully rendered before scrolling setTimeout(() => { const documentHeight = document.documentElement.scrollHeight @@ -209,16 +237,18 @@ const ContentPanel: React.FC = ({ behavior: 'smooth' }) - console.log('📖 Restored reading position:', Math.round(savedPosition.position * 100) + '%') + console.log('✅ [ContentPanel] Restored to position:', Math.round(savedPosition.position * 100) + '%', 'scrollTop:', scrollTop) }, 500) // Give content time to render + } else if (savedPosition) { + console.log('⏭️ [ContentPanel] Position out of range (5-95%):', Math.round(savedPosition.position * 100) + '%') } } catch (error) { - console.error('Failed to load reading position:', error) + console.error('❌ [ContentPanel] Failed to load reading position:', error) } } loadPosition() - }, [isTextContent, activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition]) + }, [isTextContent, activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition, selectedUrl]) // Save position before unmounting or changing article useEffect(() => { diff --git a/src/components/Me.tsx b/src/components/Me.tsx index 169e18e2..0c08409b 100644 --- a/src/components/Me.tsx +++ b/src/components/Me.tsx @@ -129,9 +129,18 @@ const Me: React.FC = ({ relayPool, activeTab: propActiveTab, pubkey: pr useEffect(() => { const loadPositions = async () => { if (!isOwnProfile || !activeAccount || !relayPool || !eventStore || readArticles.length === 0) { + console.log('🔍 [Archive] Skipping position load:', { + isOwnProfile, + hasAccount: !!activeAccount, + hasRelayPool: !!relayPool, + hasEventStore: !!eventStore, + articlesCount: readArticles.length + }) return } + console.log('📊 [Archive] Loading reading positions for', readArticles.length, 'articles') + const positions = new Map() // Load positions for all read articles @@ -147,6 +156,8 @@ const Me: React.FC = ({ relayPool, activeTab: propActiveTab, pubkey: pr const articleUrl = `nostr:${naddr}` const identifier = generateArticleIdentifier(articleUrl) + console.log('🔍 [Archive] Loading position for:', post.title?.slice(0, 50), 'identifier:', identifier.slice(0, 32)) + const savedPosition = await loadReadingPosition( relayPool, eventStore, @@ -155,14 +166,18 @@ const Me: React.FC = ({ relayPool, activeTab: propActiveTab, pubkey: pr ) if (savedPosition && savedPosition.position > 0) { + console.log('✅ [Archive] Found position:', Math.round(savedPosition.position * 100) + '%', 'for', post.title?.slice(0, 50)) positions.set(post.event.id, savedPosition.position) + } else { + console.log('❌ [Archive] No position found for:', post.title?.slice(0, 50)) } } catch (error) { - console.warn('Failed to load reading position for article:', error) + console.warn('⚠️ [Archive] Failed to load reading position for article:', error) } }) ) + console.log('📊 [Archive] Loaded positions for', positions.size, '/', readArticles.length, 'articles') setReadingPositions(positions) } diff --git a/src/services/readingPositionService.ts b/src/services/readingPositionService.ts index 95154a35..1d645c13 100644 --- a/src/services/readingPositionService.ts +++ b/src/services/readingPositionService.ts @@ -52,10 +52,12 @@ export async function saveReadingPosition( articleIdentifier: string, position: ReadingPosition ): Promise { - console.log('💾 Saving reading position:', { + console.log('💾 [ReadingPosition] Saving position:', { identifier: articleIdentifier.slice(0, 32) + '...', position: position.position, - timestamp: position.timestamp + positionPercent: Math.round(position.position * 100) + '%', + timestamp: position.timestamp, + scrollTop: position.scrollTop }) const dTag = `${READING_POSITION_PREFIX}${articleIdentifier}` @@ -75,7 +77,7 @@ export async function saveReadingPosition( // Use unified write service await publishEvent(relayPool, eventStore, signed) - console.log('✅ Reading position saved successfully') + console.log('✅ [ReadingPosition] Position saved successfully, event ID:', signed.id.slice(0, 8)) } /** @@ -89,9 +91,10 @@ export async function loadReadingPosition( ): Promise { const dTag = `${READING_POSITION_PREFIX}${articleIdentifier}` - console.log('📖 Loading reading position:', { + console.log('📖 [ReadingPosition] Loading position:', { pubkey: pubkey.slice(0, 8) + '...', - identifier: articleIdentifier.slice(0, 32) + '...' + identifier: articleIdentifier.slice(0, 32) + '...', + dTag: dTag.slice(0, 50) + '...' }) // First, check if we already have the position in the local event store @@ -102,7 +105,11 @@ export async function loadReadingPosition( if (localEvent) { const content = getReadingPositionContent(localEvent) if (content) { - console.log('✅ Reading position loaded from local store:', content.position) + console.log('✅ [ReadingPosition] Loaded from local store:', { + position: content.position, + positionPercent: Math.round(content.position * 100) + '%', + timestamp: content.timestamp + }) // Still fetch from relays in the background to get any updates relayPool @@ -151,13 +158,18 @@ export async function loadReadingPosition( if (event) { const content = getReadingPositionContent(event) if (content) { - console.log('✅ Reading position loaded from relays:', content.position) + console.log('✅ [ReadingPosition] Loaded from relays:', { + position: content.position, + positionPercent: Math.round(content.position * 100) + '%', + timestamp: content.timestamp + }) resolve(content) } else { + console.log('⚠️ [ReadingPosition] Event found but no valid content') resolve(null) } } else { - console.log('📭 No reading position found') + console.log('📭 [ReadingPosition] No position found on relays') resolve(null) } } catch (err) {