mirror of
https://github.com/dergigi/boris.git
synced 2025-12-19 07:34:28 +01:00
debug: add comprehensive logging for reading position sync
- Add detailed console logs with emoji prefixes for easy filtering - Log save/load operations in readingPositionService - Log position restore in ContentPanel with requirements check - Log Archive tab position loading with article details - All logs prefixed with component/service name for clarity - Log shows position percentages, identifiers, and timestamps - Helps debug why positions may not be showing or syncing
This commit is contained in:
@@ -150,8 +150,21 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
|
|
||||||
// Callback to save reading position
|
// Callback to save reading position
|
||||||
const handleSavePosition = useCallback(async (position: number) => {
|
const handleSavePosition = useCallback(async (position: number) => {
|
||||||
if (!activeAccount || !relayPool || !eventStore || !articleIdentifier) return
|
if (!activeAccount || !relayPool || !eventStore || !articleIdentifier) {
|
||||||
if (!settings?.syncReadingPosition) return
|
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 {
|
try {
|
||||||
const factory = new EventFactory({ signer: activeAccount })
|
const factory = new EventFactory({ signer: activeAccount })
|
||||||
@@ -167,9 +180,9 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
} catch (error) {
|
} 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({
|
const { isReadingComplete, progressPercentage, saveNow } = useReadingPosition({
|
||||||
enabled: isTextContent,
|
enabled: isTextContent,
|
||||||
@@ -185,8 +198,22 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
|
|
||||||
// Load saved reading position when article loads
|
// Load saved reading position when article loads
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isTextContent || !activeAccount || !relayPool || !eventStore || !articleIdentifier) return
|
if (!isTextContent || !activeAccount || !relayPool || !eventStore || !articleIdentifier) {
|
||||||
if (!settings?.syncReadingPosition) return
|
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 () => {
|
const loadPosition = async () => {
|
||||||
try {
|
try {
|
||||||
@@ -198,6 +225,7 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (savedPosition && savedPosition.position > 0.05 && savedPosition.position < 0.95) {
|
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
|
// Wait for content to be fully rendered before scrolling
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const documentHeight = document.documentElement.scrollHeight
|
const documentHeight = document.documentElement.scrollHeight
|
||||||
@@ -209,16 +237,18 @@ const ContentPanel: React.FC<ContentPanelProps> = ({
|
|||||||
behavior: 'smooth'
|
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
|
}, 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) {
|
} catch (error) {
|
||||||
console.error('Failed to load reading position:', error)
|
console.error('❌ [ContentPanel] Failed to load reading position:', error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadPosition()
|
loadPosition()
|
||||||
}, [isTextContent, activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition])
|
}, [isTextContent, activeAccount, relayPool, eventStore, articleIdentifier, settings?.syncReadingPosition, selectedUrl])
|
||||||
|
|
||||||
// Save position before unmounting or changing article
|
// Save position before unmounting or changing article
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -129,9 +129,18 @@ const Me: React.FC<MeProps> = ({ relayPool, activeTab: propActiveTab, pubkey: pr
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const loadPositions = async () => {
|
const loadPositions = async () => {
|
||||||
if (!isOwnProfile || !activeAccount || !relayPool || !eventStore || readArticles.length === 0) {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('📊 [Archive] Loading reading positions for', readArticles.length, 'articles')
|
||||||
|
|
||||||
const positions = new Map<string, number>()
|
const positions = new Map<string, number>()
|
||||||
|
|
||||||
// Load positions for all read articles
|
// Load positions for all read articles
|
||||||
@@ -147,6 +156,8 @@ const Me: React.FC<MeProps> = ({ relayPool, activeTab: propActiveTab, pubkey: pr
|
|||||||
const articleUrl = `nostr:${naddr}`
|
const articleUrl = `nostr:${naddr}`
|
||||||
const identifier = generateArticleIdentifier(articleUrl)
|
const identifier = generateArticleIdentifier(articleUrl)
|
||||||
|
|
||||||
|
console.log('🔍 [Archive] Loading position for:', post.title?.slice(0, 50), 'identifier:', identifier.slice(0, 32))
|
||||||
|
|
||||||
const savedPosition = await loadReadingPosition(
|
const savedPosition = await loadReadingPosition(
|
||||||
relayPool,
|
relayPool,
|
||||||
eventStore,
|
eventStore,
|
||||||
@@ -155,14 +166,18 @@ const Me: React.FC<MeProps> = ({ relayPool, activeTab: propActiveTab, pubkey: pr
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (savedPosition && savedPosition.position > 0) {
|
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)
|
positions.set(post.event.id, savedPosition.position)
|
||||||
|
} else {
|
||||||
|
console.log('❌ [Archive] No position found for:', post.title?.slice(0, 50))
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} 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)
|
setReadingPositions(positions)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,10 +52,12 @@ export async function saveReadingPosition(
|
|||||||
articleIdentifier: string,
|
articleIdentifier: string,
|
||||||
position: ReadingPosition
|
position: ReadingPosition
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
console.log('💾 Saving reading position:', {
|
console.log('💾 [ReadingPosition] Saving position:', {
|
||||||
identifier: articleIdentifier.slice(0, 32) + '...',
|
identifier: articleIdentifier.slice(0, 32) + '...',
|
||||||
position: position.position,
|
position: position.position,
|
||||||
timestamp: position.timestamp
|
positionPercent: Math.round(position.position * 100) + '%',
|
||||||
|
timestamp: position.timestamp,
|
||||||
|
scrollTop: position.scrollTop
|
||||||
})
|
})
|
||||||
|
|
||||||
const dTag = `${READING_POSITION_PREFIX}${articleIdentifier}`
|
const dTag = `${READING_POSITION_PREFIX}${articleIdentifier}`
|
||||||
@@ -75,7 +77,7 @@ export async function saveReadingPosition(
|
|||||||
// Use unified write service
|
// Use unified write service
|
||||||
await publishEvent(relayPool, eventStore, signed)
|
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<ReadingPosition | null> {
|
): Promise<ReadingPosition | null> {
|
||||||
const dTag = `${READING_POSITION_PREFIX}${articleIdentifier}`
|
const dTag = `${READING_POSITION_PREFIX}${articleIdentifier}`
|
||||||
|
|
||||||
console.log('📖 Loading reading position:', {
|
console.log('📖 [ReadingPosition] Loading position:', {
|
||||||
pubkey: pubkey.slice(0, 8) + '...',
|
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
|
// First, check if we already have the position in the local event store
|
||||||
@@ -102,7 +105,11 @@ export async function loadReadingPosition(
|
|||||||
if (localEvent) {
|
if (localEvent) {
|
||||||
const content = getReadingPositionContent(localEvent)
|
const content = getReadingPositionContent(localEvent)
|
||||||
if (content) {
|
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
|
// Still fetch from relays in the background to get any updates
|
||||||
relayPool
|
relayPool
|
||||||
@@ -151,13 +158,18 @@ export async function loadReadingPosition(
|
|||||||
if (event) {
|
if (event) {
|
||||||
const content = getReadingPositionContent(event)
|
const content = getReadingPositionContent(event)
|
||||||
if (content) {
|
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)
|
resolve(content)
|
||||||
} else {
|
} else {
|
||||||
|
console.log('⚠️ [ReadingPosition] Event found but no valid content')
|
||||||
resolve(null)
|
resolve(null)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log('📭 No reading position found')
|
console.log('📭 [ReadingPosition] No position found on relays')
|
||||||
resolve(null)
|
resolve(null)
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user