diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 8745855..0d9c6be 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -1,6 +1,9 @@ import { Button } from '@/components/ui/button' -import { RotateCw } from 'lucide-react' +import PostContent from '@/components/PostEditor/PostContent' +import { SILBERENGEL_PUBKEY } from '@/constants' +import { MessageCircle, RotateCw } from 'lucide-react' import React, { Component, ReactNode } from 'react' +import { toast } from 'sonner' interface ErrorBoundaryProps { children: ReactNode @@ -9,16 +12,17 @@ interface ErrorBoundaryProps { interface ErrorBoundaryState { hasError: boolean error?: Error + showErrorReportDialog: boolean } export class ErrorBoundary extends Component { constructor(props: ErrorBoundaryProps) { super(props) - this.state = { hasError: false } + this.state = { hasError: false, showErrorReportDialog: false } } static getDerivedStateFromError(error: Error) { - return { hasError: true, error } + return { hasError: true, error, showErrorReportDialog: false } } componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { @@ -31,45 +35,52 @@ export class ErrorBoundary extends Component

Oops, something went wrong.

- Sorry for the inconvenience. If you don't mind helping, you can{' '} - - submit an issue on GitHub - {' '} - with the error details, or{' '} - - mention me - - . Thank you for your support! + Sorry for the inconvenience. You can help by sending me a public message with the error details.

{this.state.error?.message && ( <> - +
+ + +
                 Error: {this.state.error.message}
               
)} + + {this.state.showErrorReportDialog && ( + { + this.setState({ showErrorReportDialog: false }) + }} + /> + )} ) } diff --git a/src/pages/primary/DiscussionsPage/index.tsx b/src/pages/primary/DiscussionsPage/index.tsx index 2be470d..d864916 100644 --- a/src/pages/primary/DiscussionsPage/index.tsx +++ b/src/pages/primary/DiscussionsPage/index.tsx @@ -181,7 +181,7 @@ const DiscussionsPage = forwardRef((_, ref) => { } updateRelayUrls() - }, [selectedRelay, availableRelays, relaySets, pubkey, favoriteRelays]) + }, [selectedRelay, availableRelays, relaySets, pubkey]) // Available topic IDs for matching const availableTopicIds = useMemo(() => @@ -246,7 +246,10 @@ const DiscussionsPage = forwardRef((_, ref) => { const validThreads = events .filter(event => { // Filter out deleted events - if (isEventDeleted(event)) return false + if (isEventDeleted(event)) { + console.log(`Filtering out deleted event: ${event.id}`) + return false + } // Ensure it has a title tag const titleTag = event.tags.find(tag => tag[0] === 'title' && tag[1]) diff --git a/src/providers/DeletedEventProvider.tsx b/src/providers/DeletedEventProvider.tsx index a4ac026..04fc672 100644 --- a/src/providers/DeletedEventProvider.tsx +++ b/src/providers/DeletedEventProvider.tsx @@ -1,5 +1,5 @@ import { getReplaceableCoordinateFromEvent, isReplaceableEvent } from '@/lib/event' -import { NostrEvent } from 'nostr-tools' +import { NostrEvent, kinds } from 'nostr-tools' import { createContext, useCallback, useContext, useState } from 'react' type TDeletedEventContext = { diff --git a/src/providers/NostrProvider/index.tsx b/src/providers/NostrProvider/index.tsx index 06d6366..21d14dc 100644 --- a/src/providers/NostrProvider/index.tsx +++ b/src/providers/NostrProvider/index.tsx @@ -278,6 +278,42 @@ export function NostrProvider({ children }: { children: React.ReactNode }) { } setRelayList(relayList) + // Fetch deletion events to populate the deleted event keys + try { + const relays = relayList.read?.slice(0, 5) || [] + if (relays.length > 0) { + // Fetch kind 5 (deletion) events from the last 30 days + const thirtyDaysAgo = Math.floor((Date.now() - (30 * 24 * 60 * 60 * 1000)) / 1000) + + const deletionEvents = await client.fetchEvents(relays, { + kinds: [kinds.EventDeletion], + since: thirtyDaysAgo, + limit: 1000 + }) + + // Process deletion events to extract deleted event IDs + const newDeletedKeys = new Set() + + for (const deletionEvent of deletionEvents) { + // Kind 5 events contain 'e' tags with the IDs of deleted events + const deletedEventTags = deletionEvent.tags.filter(tag => tag[0] === 'e' && tag[1]) + + for (const tag of deletedEventTags) { + const deletedEventId = tag[1] + if (deletedEventId) { + newDeletedKeys.add(deletedEventId) + // Also add to the DeletedEventProvider + addDeletedEvent({ id: deletedEventId } as Event) + } + } + } + + console.log(`Fetched ${deletionEvents.length} deletion events, found ${newDeletedKeys.size} deleted event IDs`) + } + } catch (error) { + console.warn('Failed to fetch deletion events:', error) + } + const normalizedRelays = [ ...relayList.write.map(url => normalizeUrl(url) || url), ...BIG_RELAY_URLS.map(url => normalizeUrl(url) || url)