From 1ca85bd66053e7e8edc03731a3037fffb3a4627d Mon Sep 17 00:00:00 2001 From: Silberengel Date: Mon, 10 Nov 2025 09:10:34 +0100 Subject: [PATCH] Fully implement logger --- .../AccountManager/NostrConnectionLogin.tsx | 3 +- src/components/AudioPlayer/index.tsx | 3 +- src/components/CacheRelaysSetting/index.tsx | 19 +- src/components/ClientSelect/index.tsx | 3 +- src/components/Content/index.tsx | 29 +- src/components/Embedded/EmbeddedNote.tsx | 12 +- src/components/ErrorBoundary.tsx | 3 +- .../FavoriteRelaysSetting/AddBlockedRelay.tsx | 3 +- .../FavoriteRelaysSetting/AddNewRelay.tsx | 3 +- .../FavoriteRelaysSetting/AddNewRelaySet.tsx | 3 +- .../BlockedRelayItem.tsx | 3 +- .../FavoriteRelaysSetting/RelayUrl.tsx | 5 +- src/components/FeedSwitcher/index.tsx | 3 +- src/components/Image/index.tsx | 7 +- src/components/KindFilter/index.tsx | 3 +- .../MailboxSetting/DiscoveredRelays.tsx | 9 +- src/components/MailboxSetting/SaveButton.tsx | 3 +- src/components/MediaErrorBoundary.tsx | 3 +- src/components/Note/Article/index.tsx | 17 +- .../Note/AsciidocArticle/AsciidocArticle.tsx | 17 +- src/components/Note/Highlight/index.tsx | 3 +- .../Note/LongFormArticle/NostrNode.tsx | 3 +- .../Note/MarkdownArticle/NostrNode.tsx | 3 +- src/components/Note/Poll.tsx | 5 +- src/components/NoteOptions/RawEventDialog.tsx | 3 +- src/components/NoteOptions/useMenuActions.tsx | 2 +- src/components/NoteStats/LikeButton.tsx | 11 +- src/components/NoteStats/Likes.tsx | 3 +- src/components/NoteStats/RepostButton.tsx | 3 +- src/components/NoteStats/VoteButtons.tsx | 3 +- src/components/ParentNotePreview/index.tsx | 3 +- src/components/PostEditor/HighlightEditor.tsx | 7 +- src/components/PostEditor/Mentions.tsx | 3 +- src/components/PostEditor/PostContent.tsx | 9 +- .../PostEditor/PostRelaySelector.tsx | 9 +- .../PostTextarea/ClipboardAndDropHandler.ts | 3 +- src/components/PostEditor/Uploader.tsx | 3 +- src/components/Profile/ProfileArticles.tsx | 353 ++++++------------ .../Profile/ProfileBookmarksAndHashtags.tsx | 15 +- src/components/Profile/ProfileFeed.tsx | 329 ++++++---------- src/components/Profile/ProfileMedia.tsx | 146 ++++++++ src/components/Profile/index.tsx | 121 ++++-- src/components/RelayInfo/ReviewEditor.tsx | 3 +- .../SaveRelayDropdownMenu/index.tsx | 5 +- src/components/TrendingNotes/index.tsx | 137 ++++--- .../UniversalContent/EnhancedContent.tsx | 29 +- .../HighlightSourcePreview.tsx | 5 +- src/components/VersionUpdateBanner/index.tsx | 3 +- src/components/VideoPlayer/index.tsx | 3 +- src/components/WebPreview/index.tsx | 36 +- .../YoutubeEmbeddedPlayer/index.tsx | 3 +- src/hooks/useFetchRelayInfo.tsx | 3 +- src/hooks/useFetchRelayInfos.tsx | 3 +- src/hooks/useFetchRelayList.tsx | 3 +- src/hooks/useProfileTimeline.tsx | 202 ++++++++++ src/lib/debug-utils.ts | 6 +- src/lib/draft-event.ts | 15 +- src/lib/event-metadata.ts | 3 +- src/lib/nip05.ts | 5 +- src/lib/nostr-parser.tsx | 3 +- src/lib/pubkey.ts | 3 +- src/lib/url.ts | 16 +- src/pages/primary/NoteListPage/index.tsx | 2 +- src/pages/secondary/HomePage/index.tsx | 3 +- src/pages/secondary/NotePage/NotFound.tsx | 5 +- .../BlossomServerListSetting.tsx | 7 +- src/providers/MuteListProvider.tsx | 3 +- src/providers/NotificationProvider.tsx | 4 +- src/services/client.service.ts | 21 ++ src/services/content-parser.service.ts | 11 +- src/services/indexed-db.service.ts | 24 +- src/services/lightning.service.ts | 3 +- src/services/media-manager.service.ts | 3 +- src/services/relay-info.service.ts | 5 +- src/services/relay-selection.service.ts | 17 +- 75 files changed, 1076 insertions(+), 709 deletions(-) create mode 100644 src/components/Profile/ProfileMedia.tsx create mode 100644 src/hooks/useProfileTimeline.tsx diff --git a/src/components/AccountManager/NostrConnectionLogin.tsx b/src/components/AccountManager/NostrConnectionLogin.tsx index 37fde9d..0cb649b 100644 --- a/src/components/AccountManager/NostrConnectionLogin.tsx +++ b/src/components/AccountManager/NostrConnectionLogin.tsx @@ -10,6 +10,7 @@ import QrScanner from 'qr-scanner' import { useEffect, useLayoutEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import QrCode from '../QrCode' +import logger from '@/lib/logger' export default function NostrConnectLogin({ back, @@ -95,7 +96,7 @@ export default function NostrConnectLogin({ nostrConnectionLogin(loginDetails.privKey, loginDetails.connectionString) .then(() => onLoginSuccess()) .catch((err) => { - console.error('NostrConnectionLogin Error:', err) + logger.error('NostrConnectionLogin error', { error: err }) setNostrConnectionErrMsg( err.message ? `${err.message}. Please reload.` : 'Connection failed. Please reload.' ) diff --git a/src/components/AudioPlayer/index.tsx b/src/components/AudioPlayer/index.tsx index 690ce6e..eccbce2 100644 --- a/src/components/AudioPlayer/index.tsx +++ b/src/components/AudioPlayer/index.tsx @@ -6,6 +6,7 @@ import { Pause, Play } from 'lucide-react' import { useEffect, useRef, useState } from 'react' import ExternalLink from '../ExternalLink' import { MediaErrorBoundary } from '../MediaErrorBoundary' +import logger from '@/lib/logger' interface AudioPlayerProps { src: string @@ -91,7 +92,7 @@ export default function AudioPlayer({ src, className }: AudioPlayerProps) { onError={(error) => { // Don't log expected media errors if (error.name !== 'AbortError' && !error.message.includes('play() request was interrupted')) { - console.warn('Audio player error:', error) + logger.warn('Audio player error', error) } setError(true) }} diff --git a/src/components/CacheRelaysSetting/index.tsx b/src/components/CacheRelaysSetting/index.tsx index 840fff1..0518ec1 100644 --- a/src/components/CacheRelaysSetting/index.tsx +++ b/src/components/CacheRelaysSetting/index.tsx @@ -1,5 +1,6 @@ import { Button } from '@/components/ui/button' import { normalizeUrl, isLocalNetworkUrl } from '@/lib/url' +import logger from '@/lib/logger' import { useNostr } from '@/providers/NostrProvider' import { TMailboxRelay, TMailboxRelayScope } from '@/types' import { useEffect, useState, useMemo, useRef, useCallback } from 'react' @@ -187,7 +188,7 @@ export default function CacheRelaysSetting() { const info = await indexedDb.getStoreInfo() setCacheInfo(info) } catch (error) { - console.error('Failed to load cache info:', error) + logger.error('Failed to load cache info', { error }) } } @@ -209,7 +210,7 @@ export default function CacheRelaysSetting() { try { window.localStorage.removeItem(key) } catch (e) { - console.warn(`Failed to remove ${key} from localStorage:`, e) + logger.warn(`Failed to remove ${key} from localStorage`, e as Error) } }) @@ -231,7 +232,7 @@ export default function CacheRelaysSetting() { toast.success(t('Cache cleared successfully')) } catch (error) { - console.error('Failed to clear cache:', error) + logger.error('Failed to clear cache', { error }) toast.error(t('Failed to clear cache')) } } @@ -246,7 +247,7 @@ export default function CacheRelaysSetting() { toast.success(t('Cache refreshed successfully')) } catch (error) { - console.error('Failed to refresh cache:', error) + logger.error('Failed to refresh cache', { error }) toast.error(t('Failed to refresh cache')) } } @@ -270,7 +271,7 @@ export default function CacheRelaysSetting() { : await indexedDb.getStoreItems(storeName) setStoreItems(items) } catch (error) { - console.error('Failed to load store items:', error) + logger.error('Failed to load store items', { error }) toast.error(t('Failed to load store items')) setStoreItems([]) } finally { @@ -335,7 +336,7 @@ export default function CacheRelaysSetting() { // Update cache info loadCacheInfo() } catch (error) { - console.error('Failed to delete item:', error) + logger.error('Failed to delete item', { error }) toast.error(t('Failed to delete item')) } } @@ -354,7 +355,7 @@ export default function CacheRelaysSetting() { loadCacheInfo() toast.success(t('All items deleted successfully')) } catch (error) { - console.error('Failed to delete all items:', error) + logger.error('Failed to delete all items', { error }) toast.error(t('Failed to delete all items')) } } @@ -391,7 +392,7 @@ export default function CacheRelaysSetting() { toast.success(t('Cleaned up {{deleted}} duplicate entries, kept {{kept}}', { deleted: result.deleted, kept: result.kept })) } } catch (error) { - console.error('Failed to cleanup duplicates:', error) + logger.error('Failed to cleanup duplicates', { error }) if (error instanceof Error && error.message === 'Not a replaceable event store') { toast.error(t('This store does not contain replaceable events')) } else { @@ -476,7 +477,7 @@ export default function CacheRelaysSetting() { } catch (error) { // Reset flag on error justSavedRef.current = false - console.error('Failed to save cache relays:', error) + logger.error('Failed to save cache relays', { error }) // Show error feedback if (error instanceof Error && (error as any).relayStatuses) { showPublishingFeedback({ diff --git a/src/components/ClientSelect/index.tsx b/src/components/ClientSelect/index.tsx index b4c6176..8601598 100644 --- a/src/components/ClientSelect/index.tsx +++ b/src/components/ClientSelect/index.tsx @@ -10,6 +10,7 @@ import clientService from '@/services/client.service' import { ExternalLink } from 'lucide-react' import { Event, kinds, nip19 } from 'nostr-tools' import { Dispatch, SetStateAction, useMemo, useState } from 'react' +import logger from '@/lib/logger' import { useTranslation } from 'react-i18next' const clients: Record string }> = { @@ -94,7 +95,7 @@ export default function ClientSelect({ kind = pointer.data.kind } } catch (error) { - console.error('Failed to decode NIP-19 pointer:', error) + logger.error('Failed to decode NIP-19 pointer', { error, originalNoteId }) return ['njump'] } } diff --git a/src/components/Content/index.tsx b/src/components/Content/index.tsx index 58d76d8..d2b3070 100644 --- a/src/components/Content/index.tsx +++ b/src/components/Content/index.tsx @@ -28,6 +28,33 @@ import Emoji from '../Emoji' import ImageGallery from '../ImageGallery' import MediaPlayer from '../MediaPlayer' import YoutubeEmbeddedPlayer from '../YoutubeEmbeddedPlayer' +import { toNote } from '@/lib/link' + +const REDIRECT_REGEX = /Read (naddr1[a-z0-9]+) instead\./i + +function renderRedirectText(text: string, key: number) { + const match = text.match(REDIRECT_REGEX) + if (!match) { + return text + } + const [fullMatch, naddr] = match + const [prefix, suffix] = text.split(fullMatch) + const href = toNote(naddr) + return ( + + {prefix} + Read{' '} + e.stopPropagation()} + > + {naddr} + {' '} + instead.{suffix} + + ) +} export default function Content({ event, @@ -168,7 +195,7 @@ export default function Content({ {nodes.map((node, index) => { if (node.type === 'text') { - return node.data + return renderRedirectText(node.data, index) } // Skip image nodes - they're rendered in the carousel at the top if (node.type === 'image' || node.type === 'images') { diff --git a/src/components/Embedded/EmbeddedNote.tsx b/src/components/Embedded/EmbeddedNote.tsx index ce2cd98..6892a39 100644 --- a/src/components/Embedded/EmbeddedNote.tsx +++ b/src/components/Embedded/EmbeddedNote.tsx @@ -11,6 +11,7 @@ import ClientSelect from '../ClientSelect' import MainNoteCard from '../NoteCard/MainNoteCard' import { Button } from '../ui/button' import { Search } from 'lucide-react' +import logger from '@/lib/logger' export function EmbeddedNote({ noteId, className }: { noteId: string; className?: string }) { const { event, isFetching } = useFetchEvent(noteId) @@ -32,7 +33,12 @@ export function EmbeddedNote({ noteId, className }: { noteId: string; className? } }) .catch((error: any) => { - console.warn(`Retry ${retryCount + 1}/${maxRetries} failed for event:`, noteId, error) + logger.warn('EmbeddedNote retry failed', { + attempt: retryCount + 1, + maxRetries, + noteId, + error + }) }) .finally(() => { setIsRetrying(false) @@ -125,7 +131,7 @@ function EmbeddedNoteNotFound({ relays = relays.map(url => normalizeUrl(url) || url) relays = Array.from(new Set(relays)) } catch (err) { - console.error('Failed to parse external relays:', err) + logger.error('Failed to parse external relays', { error: err, noteId }) } } else { extractedHexEventId = noteId @@ -167,7 +173,7 @@ function EmbeddedNoteNotFound({ onEventFound(event) } } catch (error) { - console.error('External relay fetch failed:', error) + logger.error('External relay fetch failed', { error, noteId }) } finally { setIsSearchingExternal(false) setTriedExternal(true) diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 0d9c6be..10f676b 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -4,6 +4,7 @@ import { SILBERENGEL_PUBKEY } from '@/constants' import { MessageCircle, RotateCw } from 'lucide-react' import React, { Component, ReactNode } from 'react' import { toast } from 'sonner' +import logger from '@/lib/logger' interface ErrorBoundaryProps { children: ReactNode @@ -26,7 +27,7 @@ export class ErrorBoundary extends Component setSuccessMsg(''), 3000) } catch (error) { - console.error('Failed to block relay:', error) + logger.error('Failed to block relay', { error, relay: normalizedUrl }) setErrorMsg(t('Failed to block relay. Please try again.')) } finally { setIsLoading(false) diff --git a/src/components/FavoriteRelaysSetting/AddNewRelay.tsx b/src/components/FavoriteRelaysSetting/AddNewRelay.tsx index ae441d7..7f224b6 100644 --- a/src/components/FavoriteRelaysSetting/AddNewRelay.tsx +++ b/src/components/FavoriteRelaysSetting/AddNewRelay.tsx @@ -4,6 +4,7 @@ import { normalizeUrl } from '@/lib/url' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useState } from 'react' import { useTranslation } from 'react-i18next' +import logger from '@/lib/logger' export default function AddNewRelay() { const { t } = useTranslation() @@ -31,7 +32,7 @@ export default function AddNewRelay() { await addFavoriteRelays([normalizedUrl]) setInput('') } catch (error) { - console.error('Failed to add favorite relay:', error) + logger.error('Failed to add favorite relay', { error, relay: normalizedUrl }) setErrorMsg(t('Failed to add relay. Please try again.')) } finally { setIsLoading(false) diff --git a/src/components/FavoriteRelaysSetting/AddNewRelaySet.tsx b/src/components/FavoriteRelaysSetting/AddNewRelaySet.tsx index ce332e5..2905530 100644 --- a/src/components/FavoriteRelaysSetting/AddNewRelaySet.tsx +++ b/src/components/FavoriteRelaysSetting/AddNewRelaySet.tsx @@ -3,6 +3,7 @@ import { Input } from '@/components/ui/input' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useState } from 'react' import { useTranslation } from 'react-i18next' +import logger from '@/lib/logger' export default function AddNewRelaySet() { const { t } = useTranslation() @@ -21,7 +22,7 @@ export default function AddNewRelaySet() { await createRelaySet(newRelaySetName) setNewRelaySetName('') } catch (error) { - console.error('Failed to create relay set:', error) + logger.error('Failed to create relay set', { error, name: newRelaySetName }) setErrorMsg(t('Failed to create relay set. Please try again.')) } finally { setIsLoading(false) diff --git a/src/components/FavoriteRelaysSetting/BlockedRelayItem.tsx b/src/components/FavoriteRelaysSetting/BlockedRelayItem.tsx index 4144c2b..af5c82e 100644 --- a/src/components/FavoriteRelaysSetting/BlockedRelayItem.tsx +++ b/src/components/FavoriteRelaysSetting/BlockedRelayItem.tsx @@ -5,6 +5,7 @@ import { X, Loader2 } from 'lucide-react' import { useState } from 'react' import RelayIcon from '../RelayIcon' import { Button } from '../ui/button' +import logger from '@/lib/logger' export default function BlockedRelayItem({ relay }: { relay: string }) { const { push } = useSecondaryPage() @@ -19,7 +20,7 @@ export default function BlockedRelayItem({ relay }: { relay: string }) { try { await deleteBlockedRelays([relay]) } catch (error) { - console.error('Failed to unblock relay:', error) + logger.error('Failed to unblock relay', { error, relay }) } finally { setIsLoading(false) } diff --git a/src/components/FavoriteRelaysSetting/RelayUrl.tsx b/src/components/FavoriteRelaysSetting/RelayUrl.tsx index 5e29ba5..5844f0c 100644 --- a/src/components/FavoriteRelaysSetting/RelayUrl.tsx +++ b/src/components/FavoriteRelaysSetting/RelayUrl.tsx @@ -8,6 +8,7 @@ import { CircleX } from 'lucide-react' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' +import logger from '@/lib/logger' export default function RelayUrls({ relaySetId }: { relaySetId: string }) { const { t } = useTranslation() @@ -29,7 +30,7 @@ export default function RelayUrls({ relaySetId }: { relaySetId: string }) { relayUrls: relaySet.relayUrls.filter((u) => u !== url) }) } catch (error) { - console.error('Failed to remove relay from set:', error) + logger.error('Failed to remove relay from set', { error, relaySetId, url }) } } @@ -54,7 +55,7 @@ export default function RelayUrls({ relaySetId }: { relaySetId: string }) { await updateRelaySet({ ...relaySet, relayUrls: newRelayUrls }) setNewRelayUrl('') } catch (error) { - console.error('Failed to update relay set:', error) + logger.error('Failed to update relay set', { error, relaySetId, url: normalizedUrl }) setNewRelayUrlError(t('Failed to add relay. Please try again.')) } finally { setIsLoading(false) diff --git a/src/components/FeedSwitcher/index.tsx b/src/components/FeedSwitcher/index.tsx index 3379851..a5b5d3f 100644 --- a/src/components/FeedSwitcher/index.tsx +++ b/src/components/FeedSwitcher/index.tsx @@ -8,6 +8,7 @@ import { BookmarkIcon, UsersRound, Server } from 'lucide-react' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' import RelaySetCard from '../RelaySetCard' +import logger from '@/lib/logger' export default function FeedSwitcher({ close }: { close?: () => void }) { const { t } = useTranslation() @@ -60,7 +61,7 @@ export default function FeedSwitcher({ close }: { close?: () => void }) { { - console.log('FeedSwitcher: Switching to all-favorites') + logger.debug('FeedSwitcher: Switching to all-favorites') switchFeed('all-favorites') close?.() }} diff --git a/src/components/Image/index.tsx b/src/components/Image/index.tsx index db67190..a39d9d2 100644 --- a/src/components/Image/index.tsx +++ b/src/components/Image/index.tsx @@ -6,6 +6,7 @@ import { getHashFromURL } from 'blossom-client-sdk' import { decode } from 'blurhash' import { ImageOff } from 'lucide-react' import { HTMLAttributes, useEffect, useMemo, useRef, useState } from 'react' +import logger from '@/lib/logger' export default function Image({ image: { url, blurHash, pubkey, dim, alt: imetaAlt, fallback }, @@ -62,7 +63,7 @@ export default function Image({ oldImageUrl = new URL(imageUrl) hash = getHashFromURL(oldImageUrl) } catch (error) { - console.error('Invalid image URL:', error) + logger.error('Invalid image URL', { error, imageUrl }) } if (!pubkey || !hash || !oldImageUrl) { setIsLoading(false) @@ -79,7 +80,7 @@ export default function Image({ try { return new URL(server) } catch (error) { - console.error('Invalid Blossom server URL:', server, error) + logger.error('Invalid Blossom server URL', { server, error }) return undefined } }) @@ -167,7 +168,7 @@ function BlurHashCanvas({ blurHash, className = '' }: { blurHash: string; classN try { return decode(blurHash, blurHashWidth, blurHashHeight) } catch (error) { - console.warn('Failed to decode blurhash:', error) + logger.warn('Failed to decode blurhash', error as Error) return null } }, [blurHash]) diff --git a/src/components/KindFilter/index.tsx b/src/components/KindFilter/index.tsx index 55c897e..9810eb0 100644 --- a/src/components/KindFilter/index.tsx +++ b/src/components/KindFilter/index.tsx @@ -17,7 +17,7 @@ const KIND_FILTER_OPTIONS = [ { kindGroup: [kinds.Repost], label: 'Reposts' }, { kindGroup: [kinds.LongFormArticle], label: 'Articles' }, { kindGroup: [ExtendedKind.PUBLICATION], label: 'Publications' }, - { kindGroup: [ExtendedKind.WIKI_ARTICLE], label: 'Wiki Articles' }, + { kindGroup: [ExtendedKind.WIKI_ARTICLE, ExtendedKind.WIKI_ARTICLE_MARKDOWN], label: 'Wiki Articles' }, { kindGroup: [kinds.Highlights], label: 'Highlights' }, { kindGroup: [ExtendedKind.POLL], label: 'Polls' }, { kindGroup: [ExtendedKind.VOICE, ExtendedKind.VOICE_COMMENT], label: 'Voice Posts' }, @@ -109,7 +109,6 @@ export default function KindFilter({ checked ? 'border-primary/60 bg-primary/5' : 'clickable' )} onClick={() => { - console.log(checked) if (!checked) { // add all kinds in this group setTemporaryShowKinds((prev) => Array.from(new Set([...prev, ...kindGroup]))) diff --git a/src/components/MailboxSetting/DiscoveredRelays.tsx b/src/components/MailboxSetting/DiscoveredRelays.tsx index d5fc90c..c8c7157 100644 --- a/src/components/MailboxSetting/DiscoveredRelays.tsx +++ b/src/components/MailboxSetting/DiscoveredRelays.tsx @@ -8,6 +8,7 @@ import { Loader2, Check, AlertCircle } from 'lucide-react' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' +import logger from '@/lib/logger' interface DiscoveredRelay { url: string @@ -53,7 +54,7 @@ export default function DiscoveredRelays({ onAdd, localOnly = false }: { onAdd: }) } } catch (error) { - console.log('Could not fetch relays from NIP-05:', error) + logger.warn('Could not fetch relays from NIP-05', error as Error) } } @@ -72,7 +73,7 @@ export default function DiscoveredRelays({ onAdd, localOnly = false }: { onAdd: } }) } catch (error) { - console.log('Could not fetch relays from NIP-07 extension:', error) + logger.warn('Could not fetch relays from NIP-07 extension', error as Error) } } @@ -87,7 +88,7 @@ export default function DiscoveredRelays({ onAdd, localOnly = false }: { onAdd: setDiscoveredRelays(discoveredArray) } catch (error) { - console.error('Error discovering relays:', error) + logger.error('Error discovering relays', { error }) setErrorMsg(t('Failed to discover relays')) } finally { setIsLoading(false) @@ -131,7 +132,7 @@ export default function DiscoveredRelays({ onAdd, localOnly = false }: { onAdd: // Clear discovered relays after adding setDiscoveredRelays([]) } catch (error) { - console.error('Failed to add relays:', error) + logger.error('Failed to add relays', { error }) setErrorMsg(t('Failed to add relays')) } finally { setIsAdding(false) diff --git a/src/components/MailboxSetting/SaveButton.tsx b/src/components/MailboxSetting/SaveButton.tsx index b1536d3..ea1da98 100644 --- a/src/components/MailboxSetting/SaveButton.tsx +++ b/src/components/MailboxSetting/SaveButton.tsx @@ -6,6 +6,7 @@ import { TMailboxRelay } from '@/types' import { CloudUpload, Loader } from 'lucide-react' import { useState } from 'react' import { useTranslation } from 'react-i18next' +import logger from '@/lib/logger' export default function SaveButton({ mailboxRelays, @@ -49,7 +50,7 @@ export default function SaveButton({ showSimplePublishSuccess(t('Mailbox relays saved')) } } catch (error) { - console.error('Failed to save relay list:', error) + logger.error('Failed to save relay list', { error }) // Show error feedback with relay statuses if available if (error instanceof Error && (error as any).relayStatuses) { const errorRelayStatuses = (error as any).relayStatuses diff --git a/src/components/MediaErrorBoundary.tsx b/src/components/MediaErrorBoundary.tsx index ba23db8..6b5195a 100644 --- a/src/components/MediaErrorBoundary.tsx +++ b/src/components/MediaErrorBoundary.tsx @@ -1,5 +1,6 @@ import React, { Component, ReactNode } from 'react' import { AlertTriangle } from 'lucide-react' +import logger from '@/lib/logger' interface MediaErrorBoundaryProps { children: ReactNode @@ -31,7 +32,7 @@ export class MediaErrorBoundary extends Component {/* Collapsible Article Info - only for article-type events */} - {isArticleType && (parsedContent?.nostrLinks?.length > 0 || parsedContent?.highlightSources?.length > 0 || parsedContent?.hashtags?.length > 0) && ( + {isArticleType && (parsedContent?.highlightSources?.length > 0 || parsedContent?.hashtags?.length > 0) && (