fix: resolve all linter and type check errors

- Fix mergeMap concurrency syntax (pass as second parameter, not object)
- Fix type casting in CompactView debug logging
- Update useEventLoader to use ReadableContent type
- Fix eventStore type compatibility in useEventLoader
- All linter and TypeScript checks now pass
This commit is contained in:
Gigi
2025-10-22 00:27:45 +02:00
parent 5551cc3a55
commit a5bdde68fc
3 changed files with 36 additions and 25 deletions

View File

@@ -37,15 +37,16 @@ export const CompactView: React.FC<CompactViewProps> = ({
// Debug empty bookmarks // Debug empty bookmarks
if (!displayText && bookmark.kind === 1) { if (!displayText && bookmark.kind === 1) {
console.log('📌 Empty kind:1 bookmark:', { const debugInfo: Record<string, unknown> = {
id: bookmark.id.slice(0, 12), id: bookmark.id.slice(0, 12),
content: bookmark.content, content: bookmark.content,
contentLength: bookmark.content?.length, contentLength: bookmark.content?.length,
contentType: typeof bookmark.content, contentType: typeof bookmark.content,
parsedContent: !!bookmark.parsedContent, parsedContent: !!bookmark.parsedContent,
created_at: bookmark.created_at, created_at: bookmark.created_at,
sourceKind: (bookmark as any).sourceKind sourceKind: (bookmark as unknown as Record<string, unknown>).sourceKind
}) }
console.log('📌 Empty kind:1 bookmark:', debugInfo)
} }
// Calculate progress color // Calculate progress color

View File

@@ -1,15 +1,16 @@
import { useEffect } from 'react' import { useEffect, useCallback } from 'react'
import { RelayPool } from 'applesauce-relay' import { RelayPool } from 'applesauce-relay'
import { EventStore } from 'applesauce-core' import { IEventStore } from 'applesauce-core'
import { createEventLoader } from 'applesauce-loaders/loaders' import { createEventLoader } from 'applesauce-loaders/loaders'
import { NostrEvent } from 'nostr-tools' import { NostrEvent } from 'nostr-tools'
import { ReadableContent } from '../services/readerService'
interface UseEventLoaderProps { interface UseEventLoaderProps {
eventId?: string eventId?: string
relayPool?: RelayPool | null relayPool?: RelayPool | null
eventStore?: EventStore | null eventStore?: IEventStore | null
setSelectedUrl: (url: string) => void setSelectedUrl: (url: string) => void
setReaderContent: (content: string) => void setReaderContent: (content: ReadableContent | undefined) => void
setReaderLoading: (loading: boolean) => void setReaderLoading: (loading: boolean) => void
setIsCollapsed: (collapsed: boolean) => void setIsCollapsed: (collapsed: boolean) => void
} }
@@ -23,6 +24,22 @@ export function useEventLoader({
setReaderLoading, setReaderLoading,
setIsCollapsed setIsCollapsed
}: UseEventLoaderProps) { }: UseEventLoaderProps) {
const displayEvent = useCallback((event: NostrEvent) => {
// Format event HTML for display with metadata
const metaHtml = `<div style="opacity: 0.6; font-size: 0.9em; margin-bottom: 1rem; border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">
<div>Event ID: <code>${event.id.slice(0, 16)}...</code></div>
<div>Posted: ${new Date(event.created_at * 1000).toLocaleString()}</div>
<div>Kind: ${event.kind}</div>
</div>`
const content: ReadableContent = {
url: '',
html: metaHtml + event.content,
title: `Note (${event.kind})`
}
setReaderContent(content)
}, [setReaderContent])
useEffect(() => { useEffect(() => {
if (!eventId) return if (!eventId) return
@@ -47,8 +64,7 @@ export function useEventLoader({
} }
const eventLoader = createEventLoader(relayPool, { const eventLoader = createEventLoader(relayPool, {
eventStore, eventStore: eventStore ?? undefined
cacheRequest: true
}) })
const subscription = eventLoader({ id: eventId }).subscribe({ const subscription = eventLoader({ id: eventId }).subscribe({
@@ -58,22 +74,16 @@ export function useEventLoader({
}, },
error: (err) => { error: (err) => {
console.error('Error fetching event:', err) console.error('Error fetching event:', err)
setReaderContent(`Error loading event: ${err instanceof Error ? err.message : 'Unknown error'}`) const errorContent: ReadableContent = {
url: '',
html: `Error loading event: ${err instanceof Error ? err.message : 'Unknown error'}`,
title: 'Error'
}
setReaderContent(errorContent)
setReaderLoading(false) setReaderLoading(false)
} }
}) })
return () => subscription.unsubscribe() return () => subscription.unsubscribe()
}, [eventId, relayPool, eventStore]) }, [eventId, relayPool, eventStore, displayEvent, setReaderLoading, setSelectedUrl, setIsCollapsed, setReaderContent])
function displayEvent(event: NostrEvent) {
// Format event for display with metadata
const meta = `<div style="opacity: 0.6; font-size: 0.9em; margin-bottom: 1rem; border-bottom: 1px solid var(--color-border); padding-bottom: 0.5rem;">
<div>Event ID: <code>${event.id.slice(0, 16)}...</code></div>
<div>Posted: ${new Date(event.created_at * 1000).toLocaleString()}</div>
<div>Kind: ${event.kind}</div>
</div>`
setReaderContent(meta + event.content)
}
} }

View File

@@ -3,7 +3,7 @@ import { Helpers, EventStore } from 'applesauce-core'
import { createEventLoader, createAddressLoader } from 'applesauce-loaders/loaders' import { createEventLoader, createAddressLoader } from 'applesauce-loaders/loaders'
import { NostrEvent } from 'nostr-tools' import { NostrEvent } from 'nostr-tools'
import { EventPointer } from 'nostr-tools/nip19' import { EventPointer } from 'nostr-tools/nip19'
import { merge, from } from 'rxjs' import { from } from 'rxjs'
import { mergeMap } from 'rxjs/operators' import { mergeMap } from 'rxjs/operators'
import { queryEvents } from './dataFetch' import { queryEvents } from './dataFetch'
import { KINDS } from '../config/kinds' import { KINDS } from '../config/kinds'
@@ -142,7 +142,7 @@ class BookmarkController {
// Use mergeMap with concurrency limit instead of merge to properly batch requests // Use mergeMap with concurrency limit instead of merge to properly batch requests
// This prevents overwhelming relays with 96+ simultaneous requests // This prevents overwhelming relays with 96+ simultaneous requests
from(pointers).pipe( from(pointers).pipe(
mergeMap(pointer => this.eventLoader!(pointer), { concurrency: 5 }) mergeMap(pointer => this.eventLoader!(pointer), 5)
).subscribe({ ).subscribe({
next: (event) => { next: (event) => {
// Check if hydration was cancelled // Check if hydration was cancelled
@@ -189,7 +189,7 @@ class BookmarkController {
// Use mergeMap with concurrency limit instead of merge to properly batch requests // Use mergeMap with concurrency limit instead of merge to properly batch requests
from(pointers).pipe( from(pointers).pipe(
mergeMap(pointer => this.addressLoader!(pointer), { concurrency: 5 }) mergeMap(pointer => this.addressLoader!(pointer), 5)
).subscribe({ ).subscribe({
next: (event) => { next: (event) => {
// Check if hydration was cancelled // Check if hydration was cancelled