From b01bedf3929f8bb752b7273b121dd0f880ebfb1c Mon Sep 17 00:00:00 2001 From: yun-zhi-ztl <15071461069@163.com> Date: Tue, 17 Mar 2026 11:13:37 +0800 Subject: [PATCH] fix: show review failure reasons --- web/src/features/review/review-error.test.ts | 13 +++++++++++++ web/src/features/review/review-error.ts | 8 ++++++++ web/src/pages/dashboard/review-detail.tsx | 9 +++++---- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 web/src/features/review/review-error.test.ts create mode 100644 web/src/features/review/review-error.ts diff --git a/web/src/features/review/review-error.test.ts b/web/src/features/review/review-error.test.ts new file mode 100644 index 00000000..d4e82098 --- /dev/null +++ b/web/src/features/review/review-error.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, it } from 'vitest' +import { resolveReviewActionErrorDescription } from './review-error' + +describe('resolveReviewActionErrorDescription', () => { + it('returns the error message when present', () => { + expect(resolveReviewActionErrorDescription(new Error('审核规则校验失败'))).toBe('审核规则校验失败') + }) + + it('returns undefined for blank or non-error values', () => { + expect(resolveReviewActionErrorDescription(new Error(' '))).toBeUndefined() + expect(resolveReviewActionErrorDescription('审核失败')).toBeUndefined() + }) +}) diff --git a/web/src/features/review/review-error.ts b/web/src/features/review/review-error.ts new file mode 100644 index 00000000..75858052 --- /dev/null +++ b/web/src/features/review/review-error.ts @@ -0,0 +1,8 @@ +export function resolveReviewActionErrorDescription(error: unknown): string | undefined { + if (!(error instanceof Error)) { + return undefined + } + + const message = error.message.trim() + return message || undefined +} diff --git a/web/src/pages/dashboard/review-detail.tsx b/web/src/pages/dashboard/review-detail.tsx index 83441597..911ca246 100644 --- a/web/src/pages/dashboard/review-detail.tsx +++ b/web/src/pages/dashboard/review-detail.tsx @@ -7,6 +7,7 @@ import { Textarea } from '@/shared/ui/textarea' import { Label } from '@/shared/ui/label' import { ConfirmDialog } from '@/shared/components/confirm-dialog' import { toast } from '@/shared/lib/toast' +import { resolveReviewActionErrorDescription } from '@/features/review/review-error' import { useReviewDetail, useApproveReview, useRejectReview } from '@/features/review/use-review-detail' export function ReviewDetailPage() { @@ -36,8 +37,8 @@ export function ReviewDetailPage() { toast.success(t('review.approveSuccess')) navigate({ to: '/dashboard/reviews' }) }, - onError: () => { - toast.error(t('review.approveFailed')) + onError: (error) => { + toast.error(t('review.approveFailed'), resolveReviewActionErrorDescription(error)) }, } ) @@ -55,8 +56,8 @@ export function ReviewDetailPage() { toast.success(t('review.rejectSuccess')) navigate({ to: '/dashboard/reviews' }) }, - onError: () => { - toast.error(t('review.rejectFailed')) + onError: (error) => { + toast.error(t('review.rejectFailed'), resolveReviewActionErrorDescription(error)) }, } )