diff --git a/src/components/NoteList/index.tsx b/src/components/NoteList/index.tsx
index c39f43f6..a60c4088 100644
--- a/src/components/NoteList/index.tsx
+++ b/src/components/NoteList/index.tsx
@@ -52,6 +52,7 @@ import dayjs from 'dayjs'
import { type Event, type Filter, kinds } from 'nostr-tools'
import { decode } from 'nostr-tools/nip19'
import RelayStatusDisplay from '@/components/RelayStatusDisplay'
+import { detailedPublishToastsEnabled } from '@/lib/publishing-feedback'
import {
relayOpTerminalRowsToTimelineRelayUiStatuses,
type RelayOpTerminalRow
@@ -69,7 +70,6 @@ import {
type ReactNode,
type SetStateAction
} from 'react'
-import { CircleAlert } from 'lucide-react'
import { useLongPressAction } from '@/hooks/use-long-press-action'
import { useTranslation } from 'react-i18next'
import PullToRefresh from 'react-simple-pull-to-refresh'
@@ -3926,15 +3926,12 @@ const NoteList = forwardRef(
const title = t(
'Relays returned no events for this feed. They may be offline, slow, or not indexing these notes.'
)
- if (uiStatuses.length === 0) {
+ if (uiStatuses.length === 0 || !detailedPublishToastsEnabled()) {
toast.error(title, { duration: 8000 })
} else {
toast.error(
,
- { duration: 12_000, className: 'max-w-lg w-full' }
+ { duration: 12_000, className: 'max-w-lg w-full', icon: null }
)
}
}, debounceMs)
diff --git a/src/constants.ts b/src/constants.ts
index fe66a791..a29e05f6 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -390,8 +390,10 @@ export const StorageKey = {
ADD_RANDOM_RELAYS_TO_PUBLISH: 'addRandomRelaysToPublish',
/** When `'true'`, only connect to relays on the viewer's NIP-65 / favorites / cache / HTTP lists. */
RESTRICT_RELAYS_TO_METADATA_LISTS: 'restrictRelaysToMetadataLists',
- /** When not `'false'`, show green Sonner toasts after successful publishes (default on). */
+ /** When `'true'`, show Sonner toasts after successful publishes (default off). */
SHOW_PUBLISH_SUCCESS_TOASTS: 'showPublishSuccessToasts',
+ /** When not `'false'`, publish/feed toasts include per-relay breakdown when success toasts are on (default on). */
+ SHOW_DETAILED_PUBLISH_TOASTS: 'showDetailedPublishToasts',
/** When not `'false'`, show NIP-53 live activity banner (default on). */
SHOW_LIVE_ACTIVITIES_BANNER: 'showLiveActivitiesBanner',
/** Max approximate archive size (MB). `0` in UI means “use platform default”. */
diff --git a/src/i18n/locales/de.ts b/src/i18n/locales/de.ts
index 37b9ea0d..8ec3f8f2 100644
--- a/src/i18n/locales/de.ts
+++ b/src/i18n/locales/de.ts
@@ -757,9 +757,14 @@ export default {
'Favorited by': 'Favorisiert von',
'Post settings': 'Beitragseinstellungen',
'Publishing feedback': 'Rückmeldungen beim Veröffentlichen',
- 'Publish success toasts': 'Erfolgs-Benachrichtigungen beim Veröffentlichen',
- 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.':
- 'Grüne Hinweise anzeigen, wenn Beiträge, Antworten, Reaktionen und andere Veröffentlichungen gelingen. Wenn aus, erscheint kurz ein kleines Häkchen unten rechts. Fehler weiterhin als Hinweis.',
+ 'Publish success toasts': 'Erfolg beim Veröffentlichen anzeigen',
+ 'Publish success toasts hint':
+ 'Wenn an, bestätigt ein Hinweis gelungene Beiträge, Antworten, Reaktionen und ähnliche Aktionen. Wenn aus, erscheint kurz ein kleines Häkchen unten rechts.',
+ 'Publish toast per-relay details': 'Pro-Relay-Aufschlüsselung in Hinweisen',
+ 'Publish toast per-relay details hint':
+ 'Wenn an, listet der Hinweis jedes Relay (angenommen, fehlgeschlagen, Fehlertext). Wenn aus, nur eine kurze Zusammenfassung.',
+ 'Publishing feedback errors note':
+ 'Fehlgeschlagene Veröffentlichungen und andere Fehler zeigen immer einen Hinweis — mit Kurzfassung oder Pro-Relay-Aufschlüsselung wie oben.',
'Publish successful': 'Veröffentlichung erfolgreich',
'Media upload service': 'Medien-Upload-Service',
BlossomUploadYourListOption: 'Blossom (eigene Liste)',
diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts
index 7089d626..5c0e03b0 100644
--- a/src/i18n/locales/en.ts
+++ b/src/i18n/locales/en.ts
@@ -756,9 +756,14 @@ export default {
'Favorited by': 'Favorited by',
'Post settings': 'Post settings',
'Publishing feedback': 'Publishing feedback',
- 'Publish success toasts': 'Publish success toasts',
- 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.':
- 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.',
+ 'Publish success toasts': 'Success notifications when publishing',
+ 'Publish success toasts hint':
+ 'When on, a toast confirms successful posts, replies, reactions, and similar actions. When off, a small checkmark appears briefly at the bottom-right instead.',
+ 'Publish toast per-relay details': 'Per-relay breakdown in toasts',
+ 'Publish toast per-relay details hint':
+ 'When on, those toasts list each relay (accepted, failed, errors). When off, only a short summary line.',
+ 'Publishing feedback errors note':
+ 'Failed publishes and other errors always show a toast, using the same summary or per-relay style as above.',
'Publish successful': 'Publish successful',
'Media upload service': 'Media upload service',
BlossomUploadYourListOption: 'Blossom (your list)',
diff --git a/src/lib/publishing-feedback.tsx b/src/lib/publishing-feedback.tsx
index ba4e098b..85186d7b 100644
--- a/src/lib/publishing-feedback.tsx
+++ b/src/lib/publishing-feedback.tsx
@@ -23,6 +23,11 @@ function publishSuccessToastsEnabled(): boolean {
return storage.getShowPublishSuccessToasts()
}
+/** Per-relay toast panels only when success toasts are on and the nested setting is enabled. */
+export function detailedPublishToastsEnabled(): boolean {
+ return publishSuccessToastsEnabled() && storage.getShowDetailedPublishToasts()
+}
+
function resolvePromiseSuccessLabel(success: string | (() => ReactNode)): string | undefined {
if (typeof success === 'string') return success
try {
@@ -123,10 +128,16 @@ export function showPublishingFeedback(
}
const toastFunction = isSuccess ? toast.success : toast.error
-
+
+ if (!detailedPublishToastsEnabled()) {
+ toastFunction(message, { duration: isSuccess ? 2000 : duration })
+ return
+ }
+
toastFunction(, {
duration,
- className: 'max-w-lg w-full'
+ className: 'max-w-lg w-full',
+ icon: null
})
}
diff --git a/src/pages/secondary/PostSettingsPage/PublishSuccessToastSetting.tsx b/src/pages/secondary/PostSettingsPage/PublishSuccessToastSetting.tsx
deleted file mode 100644
index ba0703d5..00000000
--- a/src/pages/secondary/PostSettingsPage/PublishSuccessToastSetting.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Label } from '@/components/ui/label'
-import { Switch } from '@/components/ui/switch'
-import storage from '@/services/local-storage.service'
-import { useEffect, useState } from 'react'
-import { useTranslation } from 'react-i18next'
-
-export default function PublishSuccessToastSetting() {
- const { t } = useTranslation()
- const [enabled, setEnabled] = useState(true)
-
- useEffect(() => {
- setEnabled(storage.getShowPublishSuccessToasts())
- }, [])
-
- const onChange = (checked: boolean) => {
- setEnabled(checked)
- storage.setShowPublishSuccessToasts(checked)
- }
-
- return (
-
-
-
-
-
-
- {t(
- 'Show green notifications when posts, replies, reactions, and other publishes succeed. When off, a small checkmark appears briefly at the bottom-right instead. Errors and failures still use a toast.'
- )}
-