mirror of
https://github.com/dergigi/boris.git
synced 2025-12-31 05:24:36 +01:00
141 lines
4.5 KiB
TypeScript
141 lines
4.5 KiB
TypeScript
import React, { useState, useEffect } from 'react'
|
|
import { Hooks } from 'applesauce-react'
|
|
import { useEventModel } from 'applesauce-react/hooks'
|
|
import { Models } from 'applesauce-core'
|
|
import { RelayPool } from 'applesauce-relay'
|
|
import { Bookmark } from '../types/bookmarks'
|
|
import { BookmarkList } from './BookmarkList'
|
|
import { fetchBookmarks } from '../services/bookmarkService'
|
|
import ContentPanel from './ContentPanel'
|
|
import { fetchReadableContent, ReadableContent } from '../services/readerService'
|
|
|
|
interface BookmarksProps {
|
|
relayPool: RelayPool | null
|
|
onLogout: () => void
|
|
}
|
|
|
|
const Bookmarks: React.FC<BookmarksProps> = ({ relayPool, onLogout }) => {
|
|
const [bookmarks, setBookmarks] = useState<Bookmark[]>([])
|
|
const [loading, setLoading] = useState(true)
|
|
const [selectedUrl, setSelectedUrl] = useState<string | undefined>(undefined)
|
|
const [readerLoading, setReaderLoading] = useState(false)
|
|
const [readerContent, setReaderContent] = useState<ReadableContent | undefined>(undefined)
|
|
const activeAccount = Hooks.useActiveAccount()
|
|
const accountManager = Hooks.useAccountManager()
|
|
|
|
// Use ProfileModel to get user profile information
|
|
const profile = useEventModel(Models.ProfileModel, activeAccount ? [activeAccount.pubkey] : null)
|
|
|
|
useEffect(() => {
|
|
console.log('Bookmarks useEffect triggered')
|
|
console.log('relayPool:', !!relayPool)
|
|
console.log('activeAccount:', !!activeAccount)
|
|
if (relayPool && activeAccount) {
|
|
console.log('Starting to fetch bookmarks...')
|
|
handleFetchBookmarks()
|
|
} else {
|
|
console.log('Not fetching bookmarks - missing dependencies')
|
|
}
|
|
}, [relayPool, activeAccount?.pubkey]) // Only depend on pubkey, not the entire activeAccount object
|
|
|
|
const handleFetchBookmarks = async () => {
|
|
console.log('🔍 fetchBookmarks called, loading:', loading)
|
|
if (!relayPool || !activeAccount) {
|
|
console.log('🔍 fetchBookmarks early return - relayPool:', !!relayPool, 'activeAccount:', !!activeAccount)
|
|
return
|
|
}
|
|
|
|
// Set a timeout to ensure loading state gets reset
|
|
const timeoutId = setTimeout(() => {
|
|
console.log('⏰ Timeout reached, resetting loading state')
|
|
setLoading(false)
|
|
}, 15000) // 15 second timeout
|
|
|
|
// Get the full account object with extension capabilities
|
|
const fullAccount = accountManager.getActive()
|
|
await fetchBookmarks(relayPool, fullAccount || activeAccount, setBookmarks, setLoading, timeoutId)
|
|
}
|
|
|
|
const handleSelectUrl = async (url: string) => {
|
|
setSelectedUrl(url)
|
|
setReaderLoading(true)
|
|
setReaderContent(undefined)
|
|
try {
|
|
const content = await fetchReadableContent(url)
|
|
setReaderContent(content)
|
|
} catch (err) {
|
|
console.warn('Failed to fetch readable content:', err)
|
|
} finally {
|
|
setReaderLoading(false)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const formatUserDisplay = () => {
|
|
if (!activeAccount) return 'Unknown User'
|
|
|
|
// Debug profile loading
|
|
console.log('Profile data:', profile)
|
|
console.log('Active account pubkey:', activeAccount.pubkey)
|
|
|
|
// Use profile data from ProfileModel if available
|
|
if (profile?.name) {
|
|
return profile.name
|
|
}
|
|
if (profile?.display_name) {
|
|
return profile.display_name
|
|
}
|
|
if (profile?.nip05) {
|
|
return profile.nip05
|
|
}
|
|
|
|
// Fallback to formatted public key to avoid sticky loading text
|
|
return `${activeAccount.pubkey.slice(0, 8)}...${activeAccount.pubkey.slice(-8)}`
|
|
}
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="bookmarks-container">
|
|
<div className="bookmarks-header">
|
|
<div>
|
|
<h2>Your Bookmarks</h2>
|
|
{activeAccount && (
|
|
<p className="user-info">Logged in as: {formatUserDisplay()}</p>
|
|
)}
|
|
</div>
|
|
<button onClick={onLogout} className="logout-button">
|
|
Logout
|
|
</button>
|
|
</div>
|
|
<div className="loading">Loading bookmarks...</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<div className="two-pane">
|
|
<div className="pane sidebar">
|
|
<BookmarkList
|
|
bookmarks={bookmarks}
|
|
activeAccount={activeAccount || null}
|
|
onLogout={onLogout}
|
|
formatUserDisplay={formatUserDisplay}
|
|
onSelectUrl={handleSelectUrl}
|
|
/>
|
|
</div>
|
|
<div className="pane main">
|
|
<ContentPanel
|
|
loading={readerLoading}
|
|
title={readerContent?.title}
|
|
html={readerContent?.html}
|
|
markdown={readerContent?.markdown}
|
|
selectedUrl={selectedUrl}
|
|
/>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default Bookmarks
|