From 52775e29c70de1dea6205d1d2beb731f35002cf4 Mon Sep 17 00:00:00 2001 From: Silberengel Date: Sat, 14 Feb 2026 19:15:04 +0100 Subject: [PATCH] bug-fixes --- .../content/MarkdownRenderer.svelte | 25 ++-- .../modules/discussions/DiscussionList.svelte | 12 ++ src/lib/modules/feed/FeedPage.svelte | 10 ++ src/lib/modules/profiles/ProfilePage.svelte | 16 +++ src/routes/cache/+page.svelte | 2 +- src/routes/discussions/+page.svelte | 12 +- src/routes/event/[id]/+page.svelte | 6 +- src/routes/feed/relay/[relay]/+page.svelte | 11 +- src/routes/find/+page.svelte | 2 +- src/routes/highlights/+page.svelte | 2 +- src/routes/profile/[pubkey]/+page.svelte | 8 +- src/routes/rss/+page.svelte | 107 ++++++++++++++++-- src/routes/topics/+page.svelte | 2 +- src/routes/topics/[name]/+page.svelte | 2 +- 14 files changed, 188 insertions(+), 29 deletions(-) diff --git a/src/lib/components/content/MarkdownRenderer.svelte b/src/lib/components/content/MarkdownRenderer.svelte index b094855..60ffbb1 100644 --- a/src/lib/components/content/MarkdownRenderer.svelte +++ b/src/lib/components/content/MarkdownRenderer.svelte @@ -30,6 +30,14 @@ } let { content, event, excludeMediaUrls = [] }: Props = $props(); + + // Ensure excludeMediaUrls is always an array (safety check) + let normalizedExcludeMediaUrls = $derived.by(() => { + if (!excludeMediaUrls || !Array.isArray(excludeMediaUrls)) { + return []; + } + return excludeMediaUrls; + }); let containerRef = $state(null); let emojiUrls = $state>(new Map()); let highlights = $state([]); @@ -445,9 +453,10 @@ // Process and convert media URLs: handles markdown, AsciiDoc, and plain URLs // Removes excluded URLs (displayed by MediaAttachments) and converts others to HTML tags function processMediaUrls(text: string): string { + const excludeUrls = normalizedExcludeMediaUrls; // Normalize exclude URLs for comparison - const normalizedExcludeUrls = excludeMediaUrls.length > 0 - ? new Set(excludeMediaUrls.map(url => normalizeUrl(url))) + const normalizedExcludeUrls = excludeUrls.length > 0 + ? new Set(excludeUrls.map(url => normalizeUrl(url))) : new Set(); // Debug: Log excluded URLs and check if they're being found in text @@ -458,11 +467,11 @@ for (const excludedUrl of normalizedExcludeUrls) { // Try to find the URL in the text (check both normalized and original) const urlInText = text.includes(excludedUrl) || - excludeMediaUrls.some(orig => text.includes(orig)); + excludeUrls.some(orig => text.includes(orig)); if (urlInText) { console.debug('MarkdownRenderer: Found excluded URL in text:', excludedUrl); // Find where it appears - const index = text.indexOf(excludeMediaUrls.find(orig => text.includes(orig)) || ''); + const index = text.indexOf(excludeUrls.find(orig => text.includes(orig)) || ''); if (index >= 0) { console.debug('MarkdownRenderer: URL found at index:', index, 'context:', text.substring(Math.max(0, index - 20), Math.min(text.length, index + 100))); } @@ -764,9 +773,10 @@ // Helper function to apply exclusion filtering to HTML (used for both fresh and cached content) function applyExclusionFiltering(htmlContent: string): string { - if (excludeMediaUrls.length === 0) return htmlContent; + const excludeUrls = normalizedExcludeMediaUrls; + if (!excludeUrls || excludeUrls.length === 0) return htmlContent; - const normalizedExcludeUrls = new Set(excludeMediaUrls.map(url => normalizeUrl(url))); + const normalizedExcludeUrls = new Set(excludeUrls.map(url => normalizeUrl(url))); let filtered = htmlContent; // Remove ALL img tags with excluded URLs (aggressive cleanup) @@ -898,7 +908,8 @@ }); // Normalize exclude URLs for comparison - const normalizedExcludeUrls = new Set(excludeMediaUrls.map(url => normalizeUrl(url))); + const excludeUrls = normalizedExcludeMediaUrls; + const normalizedExcludeUrls = new Set(excludeUrls.map(url => normalizeUrl(url))); // AGGRESSIVE CLEANUP: Remove ALL img tags with excluded URLs first (before any other processing) // This is the most important step - it catches images regardless of how they were created diff --git a/src/lib/modules/discussions/DiscussionList.svelte b/src/lib/modules/discussions/DiscussionList.svelte index b479c93..fa6cd42 100644 --- a/src/lib/modules/discussions/DiscussionList.svelte +++ b/src/lib/modules/discussions/DiscussionList.svelte @@ -19,6 +19,18 @@ // Expose state for parent component export { sortBy, showOlder }; + // Refresh function for parent component + async function refresh() { + if (!isMounted) return; + threadsMap.clear(); + reactionsMap.clear(); + commentsMap.clear(); + loading = true; + await loadCachedThreads(); + await loadAllData(); + } + export { refresh }; + // Resolved pubkey from filter (handled by parent component's PubkeyFilter) // For now, we'll do basic normalization here since we don't have access to the filter component // The parent component should resolve NIP-05 before passing it here diff --git a/src/lib/modules/feed/FeedPage.svelte b/src/lib/modules/feed/FeedPage.svelte index 5b633b8..5f59155 100644 --- a/src/lib/modules/feed/FeedPage.svelte +++ b/src/lib/modules/feed/FeedPage.svelte @@ -25,6 +25,16 @@ // Expose API for parent component via component reference // Note: The warning about loadOlderEvents is a false positive - functions don't need to be reactive export { loadOlderEvents, loadingMore, hasMoreEvents, waitingRoomEvents, loadWaitingRoomEvents }; + + // Refresh function for parent component + async function refresh() { + if (!isMounted) return; + allEvents = []; + oldestTimestamp = null; + waitingRoomEvents = []; + await loadFeed(); + } + export { refresh }; // Core state let allEvents = $state([]); diff --git a/src/lib/modules/profiles/ProfilePage.svelte b/src/lib/modules/profiles/ProfilePage.svelte index a828a8d..c58db8e 100644 --- a/src/lib/modules/profiles/ProfilePage.svelte +++ b/src/lib/modules/profiles/ProfilePage.svelte @@ -770,6 +770,22 @@ } } } + + // Refresh function for parent component + async function refresh() { + if (!isMounted) return; + // Reset state and reload + profile = null; + profileEvent = null; + userStatus = null; + userStatusEvent = null; + notifications = []; + interactionsWithMe = []; + wallComments = []; + pins = []; + await loadProfile(); + } + export { refresh };
diff --git a/src/routes/cache/+page.svelte b/src/routes/cache/+page.svelte index d181b77..0d7118d 100644 --- a/src/routes/cache/+page.svelte +++ b/src/routes/cache/+page.svelte @@ -555,7 +555,7 @@
- + { await loadStats(); await loadArchiveStats(); await loadEvents(); }} refreshLoading={loading || archiving || recovering || recoveringEvent} /> {#if loading && !stats}
diff --git a/src/routes/discussions/+page.svelte b/src/routes/discussions/+page.svelte index 2cc1ac9..78c6774 100644 --- a/src/routes/discussions/+page.svelte +++ b/src/routes/discussions/+page.svelte @@ -17,7 +17,15 @@ let filterResult = $state<{ type: 'event' | 'pubkey' | 'text' | null; value: string | null }>({ type: null, value: null }); let searchResults = $state<{ events: NostrEvent[]; profiles: string[] }>({ events: [], profiles: [] }); let unifiedSearchComponent: { triggerSearch: () => void } | null = $state(null); - let discussionListComponent: { sortBy: 'newest' | 'active' | 'upvoted'; showOlder: boolean } | null = $state(null); + let discussionListComponent: { sortBy: 'newest' | 'active' | 'upvoted'; showOlder: boolean; refresh?: () => Promise } | null = $state(null); + + async function handleRefresh() { + // Clear search results and refresh discussion list + searchResults = { events: [], profiles: [] }; + if (discussionListComponent?.refresh) { + await discussionListComponent.refresh(); + } + } // Pagination for search results let currentPage = $derived(getCurrentPage($page.url.searchParams)); @@ -52,7 +60,7 @@
- +

Decentralized discussion board on Nostr.

diff --git a/src/routes/event/[id]/+page.svelte b/src/routes/event/[id]/+page.svelte index a234a0a..7b903d8 100644 --- a/src/routes/event/[id]/+page.svelte +++ b/src/routes/event/[id]/+page.svelte @@ -147,13 +147,13 @@
{#if loading} - +

Loading event...

{:else if error} - +

{error}

{:else if decodedEventId} - + {#if eventKind === KIND.DISCUSSION_THREAD} diff --git a/src/routes/feed/relay/[relay]/+page.svelte b/src/routes/feed/relay/[relay]/+page.svelte index 15a915a..ff82c67 100644 --- a/src/routes/feed/relay/[relay]/+page.svelte +++ b/src/routes/feed/relay/[relay]/+page.svelte @@ -10,6 +10,13 @@ let decodedRelay = $state(null); let error = $state(null); + let feedPageComponent: { refresh?: () => Promise } | null = $state(null); + + async function handleRefresh() { + if (feedPageComponent?.refresh) { + await feedPageComponent.refresh(); + } + } function decodeRelayUrl(encoded: string): string | null { try { @@ -84,7 +91,7 @@
- +
@@ -95,7 +102,7 @@
{:else if decodedRelay} - + {:else}

Loading relay feed...

diff --git a/src/routes/find/+page.svelte b/src/routes/find/+page.svelte index a8517d2..e31db4e 100644 --- a/src/routes/find/+page.svelte +++ b/src/routes/find/+page.svelte @@ -135,7 +135,7 @@
- +