diff --git a/src/components/ContentPanel.tsx b/src/components/ContentPanel.tsx index 75283293..88116437 100644 --- a/src/components/ContentPanel.tsx +++ b/src/components/ContentPanel.tsx @@ -153,20 +153,11 @@ const ContentPanel: React.FC = ({ // Reading position tracking - only for text content that's loaded and long enough // Wait for content to load, check it's not a video, and verify it's long enough to track const isTextContent = useMemo(() => { - const result = { - loading, - hasMarkdown: !!markdown, - hasHtml: !!html, - isVideo: selectedUrl?.includes('youtube') || selectedUrl?.includes('vimeo'), - longEnough: shouldTrackReadingProgress(html, markdown) - } - if (loading) return false if (!markdown && !html) return false if (selectedUrl?.includes('youtube') || selectedUrl?.includes('vimeo')) return false if (!shouldTrackReadingProgress(html, markdown)) return false - console.log('[reading-position] πŸ“Š isTextContent check:', result, 'β†’', true) return true }, [loading, markdown, html, selectedUrl]) @@ -187,24 +178,20 @@ const ContentPanel: React.FC = ({ // Callback to save reading position const handleSavePosition = useCallback(async (position: number) => { if (!activeAccount || !relayPool || !eventStore || !articleIdentifier) { - console.log('[reading-position] ❌ Cannot save: missing dependencies') return } if (!settings?.syncReadingPosition) { - console.log('[reading-position] ⚠️ Save skipped: sync disabled in settings') return } // Check if content is long enough to track reading progress if (!shouldTrackReadingProgress(htmlRef.current, markdownRef.current)) { - console.log('[reading-position] ⚠️ Save skipped: content too short') return } const scrollTop = window.pageYOffset || document.documentElement.scrollTop try { - console.log(`[reading-position] [${new Date().toISOString()}] πŸš€ Publishing position ${Math.round(position * 100)}% to relays...`) const factory = new EventFactory({ signer: activeAccount }) await saveReadingPosition( relayPool, @@ -217,9 +204,8 @@ const ContentPanel: React.FC = ({ scrollTop } ) - console.log(`[reading-position] [${new Date().toISOString()}] βœ… Position published successfully`) } catch (error) { - console.error(`[reading-position] [${new Date().toISOString()}] ❌ Failed to save reading position:`, error) + console.error('[reading-position] Failed to save reading position:', error) } }, [activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition]) @@ -236,7 +222,6 @@ const ContentPanel: React.FC = ({ if (!isTextContent) { // Disable tracking if content is not suitable if (isTrackingEnabled) { - console.log('[reading-position] ⏸️ Disabling tracking (not text content)') setIsTrackingEnabled(false) } return @@ -245,7 +230,6 @@ const ContentPanel: React.FC = ({ if (!isTrackingEnabled) { // Wait 500ms after content loads before enabling tracking const timer = setTimeout(() => { - console.log('[reading-position] βœ… Enabling tracking after stability delay') setIsTrackingEnabled(true) }, 500) return () => clearTimeout(timer) @@ -285,35 +269,21 @@ const ContentPanel: React.FC = ({ const hasAttemptedRestoreRef = useRef(null) useEffect(() => { - console.log('[reading-position] πŸ” Restore effect running:', { - isTextContent, - isTrackingEnabled, - hasAccount: !!activeAccount, - articleIdentifier, - restoreKey, - hasAttempted: hasAttemptedRestoreRef.current - }) - if (!isTextContent || !activeAccount || !articleIdentifier) { - console.log('[reading-position] ⏭️ Restore skipped: missing dependencies or not text content') return } if (settings?.syncReadingPosition === false) { - console.log('[reading-position] ⏭️ Restore skipped: sync disabled in settings') return } if (!isTrackingEnabled) { - console.log('[reading-position] ⏭️ Restore skipped: tracking not yet enabled (waiting for content stability)') return } // Only attempt restore once per article (after tracking is enabled) if (hasAttemptedRestoreRef.current === restoreKey) { - console.log('[reading-position] ⏭️ Restore skipped: already attempted for this article') return } - console.log('[reading-position] πŸ”„ Initiating restore for article:', articleIdentifier) // Mark as attempted using composite key hasAttemptedRestoreRef.current = restoreKey @@ -321,12 +291,9 @@ const ContentPanel: React.FC = ({ const savedProgress = readingProgressController.getProgress(articleIdentifier) if (!savedProgress || savedProgress <= 0.05 || savedProgress >= 1) { - console.log('[reading-position] ℹ️ No position to restore (progress:', savedProgress, ')') return } - console.log('[reading-position] 🎯 Found saved position:', Math.round(savedProgress * 100) + '%') - // Suppress saves during restore (500ms render + 1000ms smooth scroll = 1500ms) if (suppressSavesForRef.current) { suppressSavesForRef.current(1500) @@ -340,20 +307,10 @@ const ContentPanel: React.FC = ({ const currentTop = window.pageYOffset || document.documentElement.scrollTop const targetTop = savedProgress * maxScroll - console.log('[reading-position] πŸ“ Restore calculation:', { - docHeight: docH, - winHeight: winH, - maxScroll, - currentTop, - targetTop, - targetPercent: Math.round(savedProgress * 100) + '%' - }) - // Skip if delta is too small (< 48px or < 5%) const deltaPx = Math.abs(targetTop - currentTop) const deltaPct = maxScroll > 0 ? Math.abs((targetTop - currentTop) / maxScroll) : 0 if (deltaPx < 48 || deltaPct < 0.05) { - console.log('[reading-position] ⏭️ Restore skipped: delta too small (', deltaPx, 'px,', Math.round(deltaPct * 100) + '%)') // Allow saves immediately since no scroll happened if (suppressSavesForRef.current) { suppressSavesForRef.current(0) @@ -361,14 +318,11 @@ const ContentPanel: React.FC = ({ return } - console.log('[reading-position] πŸ“œ Restoring scroll position (delta:', deltaPx, 'px,', Math.round(deltaPct * 100) + '%)') - // Perform smooth animated restore window.scrollTo({ top: targetTop, behavior: 'smooth' }) - console.log('[reading-position] βœ… Scroll restored to', Math.round(savedProgress * 100) + '%') }, 500) // Give content time to render }, [isTextContent, activeAccount, articleIdentifier, settings?.syncReadingPosition, selectedUrl, isTrackingEnabled, restoreKey]) diff --git a/src/hooks/useReadingPosition.ts b/src/hooks/useReadingPosition.ts index 527b7297..5ee38690 100644 --- a/src/hooks/useReadingPosition.ts +++ b/src/hooks/useReadingPosition.ts @@ -33,15 +33,11 @@ export const useReadingPosition = ({ const suppressSavesFor = useCallback((ms: number) => { const until = Date.now() + ms suppressUntilRef.current = until - console.log(`[reading-position] [${new Date().toISOString()}] πŸ›‘οΈ Suppressing saves for ${ms}ms until ${new Date(until).toISOString()}`) }, []) // Throttled save function - saves at 3s intervals during scrolling const scheduleSave = useCallback((currentPosition: number) => { - console.log(`[reading-position] [${new Date().toISOString()}] πŸ“ž scheduleSave called at ${Math.round(currentPosition * 100)}%, syncEnabled=${syncEnabled}, hasOnSave=${!!onSave}`) - if (!syncEnabled || !onSave) { - console.log(`[reading-position] [${new Date().toISOString()}] ⏭️ Save skipped: syncEnabled=${syncEnabled}, hasOnSave=${!!onSave}`) return } @@ -51,7 +47,6 @@ export const useReadingPosition = ({ clearTimeout(saveTimerRef.current) saveTimerRef.current = null } - console.log(`[reading-position] [${new Date().toISOString()}] πŸ’Ύ Instant save at 100% completion`) lastSaved100Ref.current = true onSave(1) return @@ -63,16 +58,13 @@ export const useReadingPosition = ({ // Throttle: only schedule a save if one isn't already pending // This ensures saves happen at regular 3s intervals during continuous scrolling if (saveTimerRef.current) { - console.log(`[reading-position] [${new Date().toISOString()}] ⏳ Timer already pending, updated pending position to ${Math.round(currentPosition * 100)}%`) return // Already have a save scheduled, don't reset the timer } const THROTTLE_MS = 3000 - console.log(`[reading-position] [${new Date().toISOString()}] ⏰ Scheduling save in ${THROTTLE_MS}ms`) saveTimerRef.current = setTimeout(() => { // Save the latest position, not the one from when timer was scheduled const positionToSave = pendingPositionRef.current - console.log(`[reading-position] [${new Date().toISOString()}] πŸ’Ύ Auto-save at ${Math.round(positionToSave * 100)}%`) onSave(positionToSave) saveTimerRef.current = null }, THROTTLE_MS)