fix: expose more detailed error messages

This commit is contained in:
codytseng 2026-01-17 11:50:24 +08:00
parent d37aa61501
commit 71791c9513
27 changed files with 330 additions and 153 deletions

View file

@ -4,6 +4,7 @@ import { Input } from '@/components/ui/input'
import { Separator } from '@/components/ui/separator'
import { RECOMMENDED_BLOSSOM_SERVERS } from '@/constants'
import { createBlossomServerListDraftEvent } from '@/lib/draft-event'
import { formatError } from '@/lib/error'
import { getServersFromServerTags } from '@/lib/tag'
import { normalizeHttpUrl } from '@/lib/url'
import { cn } from '@/lib/utils'
@ -13,6 +14,7 @@ import { AlertCircle, ArrowUpToLine, Loader, X } from 'lucide-react'
import { Event } from 'nostr-tools'
import { useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
export default function BlossomServerListSetting() {
const { t } = useTranslation()
@ -48,7 +50,10 @@ export default function BlossomServerListSetting() {
setBlossomServerListEvent(newEvent)
setUrl('')
} catch (error) {
console.error('Failed to add Blossom URL:', error)
const errors = formatError(error)
errors.forEach((err) => {
toast.error(`${t('Failed to add Blossom URL')}: ${err}`, { duration: 10_000 })
})
} finally {
setAdding(false)
}
@ -72,7 +77,10 @@ export default function BlossomServerListSetting() {
await client.updateBlossomServerListEventCache(newEvent)
setBlossomServerListEvent(newEvent)
} catch (error) {
console.error('Failed to remove Blossom URL:', error)
const errors = formatError(error)
errors.forEach((err) => {
toast.error(`${t('Failed to remove Blossom URL')}: ${err}`, { duration: 10_000 })
})
} finally {
setRemovingIndex(-1)
}
@ -88,7 +96,10 @@ export default function BlossomServerListSetting() {
await client.updateBlossomServerListEventCache(newEvent)
setBlossomServerListEvent(newEvent)
} catch (error) {
console.error('Failed to move Blossom URL to top:', error)
const errors = formatError(error)
errors.forEach((err) => {
toast.error(`${t('Failed to move Blossom URL to top')}: ${err}`, { duration: 10_000 })
})
} finally {
setMovingIndex(-1)
}

View file

@ -7,6 +7,7 @@ import { Label } from '@/components/ui/label'
import { Textarea } from '@/components/ui/textarea'
import SecondaryPageLayout from '@/layouts/SecondaryPageLayout'
import { createProfileDraftEvent } from '@/lib/draft-event'
import { formatError } from '@/lib/error'
import { generateImageByPubkey } from '@/lib/pubkey'
import { isEmail } from '@/lib/utils'
import { useSecondaryPage } from '@/PageManager'
@ -14,6 +15,7 @@ import { useNostr } from '@/providers/NostrProvider'
import { Loader, Upload } from 'lucide-react'
import { forwardRef, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
const ProfileEditorPage = forwardRef(({ index }: { index?: number }, ref) => {
const { t } = useTranslation()
@ -97,10 +99,17 @@ const ProfileEditorPage = forwardRef(({ index }: { index?: number }, ref) => {
JSON.stringify(newProfileContent),
profileEvent?.tags
)
const newProfileEvent = await publish(profileDraftEvent)
await updateProfileEvent(newProfileEvent)
setSaving(false)
pop()
try {
const newProfileEvent = await publish(profileDraftEvent)
await updateProfileEvent(newProfileEvent)
setSaving(false)
pop()
} catch (error) {
const errors = formatError(error)
errors.forEach((err) => {
toast.error(`${t('Failed to save profile')}: ${err}`, { duration: 10_000 })
})
}
}
const onBannerUploadSuccess = ({ url }: { url: string }) => {

View file

@ -2,6 +2,7 @@ import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import SecondaryPageLayout from '@/layouts/SecondaryPageLayout'
import { createProfileDraftEvent } from '@/lib/draft-event'
import { formatError } from '@/lib/error'
import { isEmail } from '@/lib/utils'
import { useNostr } from '@/providers/NostrProvider'
import { useZap } from '@/providers/ZapProvider'
@ -65,8 +66,13 @@ const RizfulPage = forwardRef(({ index }: { index?: number }, ref) => {
)
const newProfileEvent = await publish(profileDraftEvent)
await updateProfileEvent(newProfileEvent)
} catch (e: unknown) {
toast.error(e instanceof Error ? e.message : String(e))
} catch (error) {
const errors = formatError(error)
errors.forEach((err) => {
toast.error(`${t('Failed to update profile with Lightning Address')}: ${err}`, {
duration: 10_000
})
})
}
}

View file

@ -2,6 +2,7 @@ import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { createProfileDraftEvent } from '@/lib/draft-event'
import { formatError } from '@/lib/error'
import { isEmail } from '@/lib/utils'
import { useNostr } from '@/providers/NostrProvider'
import { Loader } from 'lucide-react'
@ -45,9 +46,19 @@ export default function LightningAddressInput() {
JSON.stringify(profileContent),
profileEvent?.tags
)
const newProfileEvent = await publish(profileDraftEvent)
await updateProfileEvent(newProfileEvent)
setSaving(false)
try {
const newProfileEvent = await publish(profileDraftEvent)
await updateProfileEvent(newProfileEvent)
} catch (error) {
const errors = formatError(error)
errors.forEach((err) => {
toast.error(`${t('Failed to update profile with Lightning Address')}: ${err}`, {
duration: 10_000
})
})
} finally {
setSaving(false)
}
}
return (