mirror of
https://github.com/dergigi/boris.git
synced 2025-12-17 22:54:30 +01:00
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
This commit is contained in:
@@ -33,6 +33,11 @@ const BlogPostCard: React.FC<BlogPostCardProps> = ({ 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 (
|
||||
<Link
|
||||
|
||||
@@ -177,10 +177,15 @@ const Explore: React.FC<ExploreProps> = ({ 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<ExploreProps> = ({ 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<ExploreProps> = ({ 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])
|
||||
|
||||
@@ -27,19 +27,31 @@ export function processReadingProgress(
|
||||
events: NostrEvent[],
|
||||
readsMap: Map<string, ReadItem>
|
||||
): 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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,6 +42,7 @@ class ReadingProgressController {
|
||||
}
|
||||
|
||||
private emitProgress(progressMap: Map<string, number>): 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<string, ReadItem>()
|
||||
|
||||
// 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<string, number>()
|
||||
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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user