From bff43f4a288a4b83c5b590f1584f100602e6c78c Mon Sep 17 00:00:00 2001 From: Gigi Date: Sun, 19 Oct 2025 11:30:57 +0200 Subject: [PATCH] debug: add comprehensive [progress] logging throughout reading progress flow - Add logs in readingProgressController: processing events, emitting to listeners - Add logs in Explore component: receiving updates, looking up progress - Add logs in BlogPostCard: rendering with progress - Add detailed logs in processReadingProgress: event parsing, naddr conversion - All logs prefixed with [progress] for easy filtering --- src/components/BlogPostCard.tsx | 5 ++++ src/components/Explore.tsx | 19 ++++++++++--- src/services/readingDataProcessor.ts | 34 ++++++++++++++++++----- src/services/readingProgressController.ts | 10 +++++++ 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/components/BlogPostCard.tsx b/src/components/BlogPostCard.tsx index d40d496a..bf317522 100644 --- a/src/components/BlogPostCard.tsx +++ b/src/components/BlogPostCard.tsx @@ -33,6 +33,11 @@ const BlogPostCard: React.FC = ({ post, href, level, readingP } else if (readingProgress && readingProgress > 0 && readingProgress <= 0.10) { progressColor = 'var(--color-text)' // Neutral text color (started) } + + // Debug log + if (readingProgress !== undefined) { + console.log('[progress] 🎴 Card render:', post.title.slice(0, 30), '=> progress:', progressPercent + '%', 'color:', progressColor) + } return ( = ({ relayPool, eventStore, settings, acti // Subscribe to reading progress controller useEffect(() => { // Get initial state immediately - setReadingProgressMap(readingProgressController.getProgressMap()) + const initialMap = readingProgressController.getProgressMap() + console.log('[progress] 🎯 Explore: Initial progress map size:', initialMap.size) + setReadingProgressMap(initialMap) // Subscribe to updates - const unsubProgress = readingProgressController.onProgress(setReadingProgressMap) + const unsubProgress = readingProgressController.onProgress((newMap) => { + console.log('[progress] 🎯 Explore: Received progress update, size:', newMap.size) + setReadingProgressMap(newMap) + }) return () => { unsubProgress() @@ -606,7 +611,10 @@ const Explore: React.FC = ({ relayPool, eventStore, settings, acti // Helper to get reading progress for a post const getReadingProgress = useCallback((post: BlogPostPreview): number | undefined => { const dTag = post.event.tags.find(t => t[0] === 'd')?.[1] - if (!dTag) return undefined + if (!dTag) { + console.log('[progress] ⚠️ No d-tag for post:', post.title) + return undefined + } try { const naddr = nip19.naddrEncode({ @@ -614,8 +622,11 @@ const Explore: React.FC = ({ relayPool, eventStore, settings, acti pubkey: post.author, identifier: dTag }) - return readingProgressMap.get(naddr) + const progress = readingProgressMap.get(naddr) + console.log('[progress] 🔍 Looking up:', naddr.slice(0, 50) + '... =>', progress ? Math.round(progress * 100) + '%' : 'not found') + return progress } catch (err) { + console.error('[progress] ❌ Error encoding naddr:', err) return undefined } }, [readingProgressMap]) diff --git a/src/services/readingDataProcessor.ts b/src/services/readingDataProcessor.ts index 9dfbcc8a..7d1e3c8d 100644 --- a/src/services/readingDataProcessor.ts +++ b/src/services/readingDataProcessor.ts @@ -27,19 +27,31 @@ export function processReadingProgress( events: NostrEvent[], readsMap: Map ): void { + console.log('[progress] 🔧 processReadingProgress called with', events.length, 'events') + for (const event of events) { - if (event.kind !== READING_PROGRESS_KIND) continue + if (event.kind !== READING_PROGRESS_KIND) { + console.log('[progress] ⏭️ Skipping event with wrong kind:', event.kind) + continue + } const dTag = event.tags.find(t => t[0] === 'd')?.[1] - if (!dTag) continue + if (!dTag) { + console.log('[progress] ⚠️ Event missing d-tag:', event.id.slice(0, 8)) + continue + } + + console.log('[progress] 📝 Processing event:', event.id.slice(0, 8), 'd-tag:', dTag.slice(0, 50)) try { const content = JSON.parse(event.content) const position = content.progress || 0 + console.log('[progress] 📊 Progress value:', position, '(' + Math.round(position * 100) + '%)') + // Validate progress is between 0 and 1 (NIP-85 requirement) if (position < 0 || position > 1) { - console.warn('Invalid progress value (must be 0-1):', position, 'event:', event.id.slice(0, 8)) + console.warn('[progress] ❌ Invalid progress value (must be 0-1):', position, 'event:', event.id.slice(0, 8)) continue } @@ -64,11 +76,13 @@ export function processReadingProgress( }) itemId = naddr itemType = 'article' + console.log('[progress] ✅ Converted coordinate to naddr:', naddr.slice(0, 50)) } catch (e) { - console.warn('Failed to encode naddr from coordinate:', dTag) + console.warn('[progress] ❌ Failed to encode naddr from coordinate:', dTag) continue } } else { + console.warn('[progress] ⚠️ Invalid coordinate format:', dTag) continue } } else if (dTag.startsWith('url:')) { @@ -78,12 +92,13 @@ export function processReadingProgress( itemUrl = atob(encoded.replace(/-/g, '+').replace(/_/g, '/')) itemId = itemUrl itemType = 'external' + console.log('[progress] ✅ Decoded URL:', itemUrl.slice(0, 50)) } catch (e) { - console.warn('Failed to decode URL from d tag:', dTag) + console.warn('[progress] ❌ Failed to decode URL from d tag:', dTag) continue } } else { - // Unknown format, skip + console.warn('[progress] ⚠️ Unknown d-tag format:', dTag) continue } @@ -99,11 +114,16 @@ export function processReadingProgress( readingProgress: position, readingTimestamp: timestamp }) + console.log('[progress] ✅ Added/updated item in readsMap:', itemId.slice(0, 50), '=', Math.round(position * 100) + '%') + } else { + console.log('[progress] ⏭️ Skipping older event for:', itemId.slice(0, 50)) } } catch (error) { - console.warn('Failed to parse reading progress event:', error) + console.warn('[progress] ❌ Failed to parse reading progress event:', error) } } + + console.log('[progress] 🏁 processReadingProgress finished, readsMap size:', readsMap.size) } /** diff --git a/src/services/readingProgressController.ts b/src/services/readingProgressController.ts index 5569aa39..85c12f4a 100644 --- a/src/services/readingProgressController.ts +++ b/src/services/readingProgressController.ts @@ -42,6 +42,7 @@ class ReadingProgressController { } private emitProgress(progressMap: Map): void { + console.log('[progress] 📡 Emitting to', this.progressListeners.length, 'listeners with', progressMap.size, 'items') this.progressListeners.forEach(cb => cb(new Map(progressMap))) } @@ -174,6 +175,8 @@ class ReadingProgressController { * Process events and update progress map */ private processEvents(events: any[]): void { + console.log('[progress] 🔄 Processing', events.length, 'events') + const readsMap = new Map() // Merge with existing progress @@ -186,17 +189,24 @@ class ReadingProgressController { }) } + console.log('[progress] 📦 Starting with', readsMap.size, 'existing items') + // Process new events processReadingProgress(events, readsMap) + console.log('[progress] 📦 After processing:', readsMap.size, 'items') + // Convert back to progress map (naddr -> progress) const newProgressMap = new Map() for (const [id, item] of readsMap.entries()) { if (item.readingProgress !== undefined && item.type === 'article') { newProgressMap.set(id, item.readingProgress) + console.log('[progress] ✅ Added:', id.slice(0, 50) + '...', '=', Math.round(item.readingProgress * 100) + '%') } } + console.log('[progress] 📊 Final progress map size:', newProgressMap.size) + this.currentProgressMap = newProgressMap this.emitProgress(this.currentProgressMap) }