Files
boris/src/hooks/useContentSelection.ts
Gigi 70a830fb66 refactor(bookmarks): split Bookmarks.tsx into smaller hooks and components
- Extract useBookmarksData hook for data fetching
- Extract useContentSelection hook for content selection logic
- Extract useHighlightCreation hook for highlight creation
- Extract useBookmarksUI hook for UI state management
- Create ThreePaneLayout component to reduce JSX complexity
- Reduce Bookmarks.tsx from 392 lines to 209 lines
2025-10-07 21:47:59 +01:00

76 lines
2.3 KiB
TypeScript

import { useState, useCallback } from 'react'
import { useNavigate } from 'react-router-dom'
import { RelayPool } from 'applesauce-relay'
import { NostrEvent, nip19 } from 'nostr-tools'
import { loadContent, BookmarkReference } from '../utils/contentLoader'
import { ReadableContent } from '../services/readerService'
import { UserSettings } from '../services/settingsService'
interface UseContentSelectionParams {
relayPool: RelayPool | null
settings: UserSettings
setIsCollapsed: (collapsed: boolean) => void
setShowSettings: (show: boolean) => void
setCurrentArticle: (article: NostrEvent | undefined) => void
}
export const useContentSelection = ({
relayPool,
settings,
setIsCollapsed,
setShowSettings,
setCurrentArticle
}: UseContentSelectionParams) => {
const navigate = useNavigate()
const [selectedUrl, setSelectedUrl] = useState<string | undefined>(undefined)
const [readerLoading, setReaderLoading] = useState(false)
const [readerContent, setReaderContent] = useState<ReadableContent | undefined>(undefined)
const handleSelectUrl = useCallback(async (url: string, bookmark?: BookmarkReference) => {
if (!relayPool) return
// Update the URL path based on content type
if (bookmark && bookmark.kind === 30023) {
const dTag = bookmark.tags.find(t => t[0] === 'd')?.[1] || ''
if (dTag && bookmark.pubkey) {
const pointer = {
identifier: dTag,
kind: 30023,
pubkey: bookmark.pubkey,
}
const naddr = nip19.naddrEncode(pointer)
navigate(`/a/${naddr}`)
}
} else if (url) {
navigate(`/r/${encodeURIComponent(url)}`)
}
setSelectedUrl(url)
setReaderLoading(true)
setReaderContent(undefined)
setCurrentArticle(undefined)
setShowSettings(false)
if (settings.collapseOnArticleOpen !== false) setIsCollapsed(true)
try {
const content = await loadContent(url, relayPool, bookmark)
setReaderContent(content)
} catch (err) {
console.warn('Failed to fetch content:', err)
} finally {
setReaderLoading(false)
}
}, [relayPool, settings, navigate, setIsCollapsed, setShowSettings, setCurrentArticle])
return {
selectedUrl,
setSelectedUrl,
readerLoading,
setReaderLoading,
readerContent,
setReaderContent,
handleSelectUrl
}
}