diff --git a/src/components/Debug.tsx b/src/components/Debug.tsx index 809a63d4..47bd3a51 100644 --- a/src/components/Debug.tsx +++ b/src/components/Debug.tsx @@ -19,6 +19,7 @@ import { useSettings } from '../hooks/useSettings' import { fetchHighlights, fetchHighlightsFromAuthors } from '../services/highlightService' import { contactsController } from '../services/contactsController' import { writingsController } from '../services/writingsController' +import { readingProgressController } from '../services/readingProgressController' import { fetchBlogPostsFromAuthors, BlogPostPreview } from '../services/exploreService' const defaultPayload = 'The quick brown fox jumps over the lazy dog.' @@ -114,6 +115,9 @@ const Debug: React.FC = ({ const [tLoadMarkAsRead, setTLoadMarkAsRead] = useState(null) const [tFirstMarkAsRead, setTFirstMarkAsRead] = useState(null) + // Deduplicated reading progress from controller + const [deduplicatedProgressMap, setDeduplicatedProgressMap] = useState>(new Map()) + // Live timing state const [liveTiming, setLiveTiming] = useState<{ nip44?: { type: 'encrypt' | 'decrypt'; startTime: number } @@ -739,7 +743,7 @@ const Debug: React.FC = ({ } const handleLoadReadingProgress = async () => { - if (!relayPool || !activeAccount?.pubkey) { + if (!relayPool || !eventStore || !activeAccount?.pubkey) { DebugBus.warn('debug', 'Please log in to load reading progress') return } @@ -749,25 +753,27 @@ const Debug: React.FC = ({ setReadingProgressEvents([]) setTLoadReadingProgress(null) setTFirstReadingProgress(null) - DebugBus.info('debug', 'Loading reading progress events...') + setDeduplicatedProgressMap(new Map()) + DebugBus.info('debug', 'Loading reading progress events via controller...') const start = performance.now() let firstEventTime: number | null = null setLiveTiming(prev => ({ ...prev, loadReadingProgress: { startTime: start } })) - const { queryEvents } = await import('../services/dataFetch') - const { KINDS } = await import('../config/kinds') - - const events = await queryEvents(relayPool, { kinds: [KINDS.ReadingProgress], authors: [activeAccount.pubkey] }, { - onEvent: (evt) => { - if (firstEventTime === null) { - firstEventTime = performance.now() - start - setTFirstReadingProgress(Math.round(firstEventTime)) - } - setReadingProgressEvents(prev => [...prev, evt]) + // Subscribe to controller to get streamed events + const unsubProgress = readingProgressController.onProgress((progressMap) => { + if (firstEventTime === null) { + firstEventTime = performance.now() - start + setTFirstReadingProgress(Math.round(firstEventTime)) } + setDeduplicatedProgressMap(new Map(progressMap)) }) + // Start the controller (triggers loading and deduplication) + await readingProgressController.start({ relayPool, eventStore, pubkey: activeAccount.pubkey, force: true }) + + unsubProgress() + const elapsed = Math.round(performance.now() - start) setTLoadReadingProgress(elapsed) setLiveTiming(prev => { @@ -776,7 +782,8 @@ const Debug: React.FC = ({ return rest }) - DebugBus.info('debug', `Loaded ${events.length} reading progress events in ${elapsed}ms`) + const finalMap = readingProgressController.getProgressMap() + DebugBus.info('debug', `Loaded reading progress: ${finalMap.size} unique articles in ${elapsed}ms`) } catch (err) { console.error('Failed to load reading progress:', err) DebugBus.error('debug', `Failed to load reading progress: ${err instanceof Error ? err.message : String(err)}`) @@ -789,6 +796,7 @@ const Debug: React.FC = ({ setReadingProgressEvents([]) setTLoadReadingProgress(null) setTFirstReadingProgress(null) + setDeduplicatedProgressMap(new Map()) DebugBus.info('debug', 'Cleared reading progress data') } @@ -1546,6 +1554,33 @@ const Debug: React.FC = ({ )} + + {deduplicatedProgressMap.size > 0 && ( +
+
Deduplicated Reading Progress ({deduplicatedProgressMap.size} articles):
+
+ {Array.from(deduplicatedProgressMap.entries()).map(([articleId, progress], idx) => { + return ( +
+
Article #{idx + 1}
+
+
ID: {articleId}
+
+
Progress: {(progress * 100).toFixed(1)}%
+
+
+
+
+
+
+ ) + })} +
+
+ )}
{/* Mark-as-read Reactions Loading Section */}