From c1c54301acf4233854fcd1b31ec97ebc34ff0ae0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 6 Jul 2025 07:55:28 +0000 Subject: [PATCH 1/7] Initial plan From b3bb7f939ee63f5570f542af0251ae29436d12e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 6 Jul 2025 08:04:48 +0000 Subject: [PATCH 2/7] Add report button functionality to project details page Co-authored-by: U8F69 <41963680+U8F69@users.noreply.github.com> --- .../common/receive/ReceiveContent.tsx | 2 + .../common/receive/ReportButton.tsx | 137 ++++++++++++++++++ frontend/components/common/receive/index.ts | 1 + .../lib/services/project/project.service.ts | 39 +++++ frontend/lib/services/project/types.ts | 13 ++ frontend/tsconfig.tsbuildinfo | 1 + 6 files changed, 193 insertions(+) create mode 100644 frontend/components/common/receive/ReportButton.tsx create mode 100644 frontend/tsconfig.tsbuildinfo diff --git a/frontend/components/common/receive/ReceiveContent.tsx b/frontend/components/common/receive/ReceiveContent.tsx index ee5c3887..70a1d6d0 100644 --- a/frontend/components/common/receive/ReceiveContent.tsx +++ b/frontend/components/common/receive/ReceiveContent.tsx @@ -13,6 +13,7 @@ import {BasicUserInfo} from '@/lib/services/core'; import {GetProjectResponseData} from '@/lib/services/project'; import {formatDateTimeWithSeconds, copyToClipboard} from '@/lib/utils'; import {motion} from 'motion/react'; +import {ReportButton} from './ReportButton'; /** @@ -320,6 +321,7 @@ export function ReceiveContent({data}: ReceiveContentProps) { receivedContent={receivedContent} onReceive={handleReceive} /> + diff --git a/frontend/components/common/receive/ReportButton.tsx b/frontend/components/common/receive/ReportButton.tsx new file mode 100644 index 00000000..ef47a603 --- /dev/null +++ b/frontend/components/common/receive/ReportButton.tsx @@ -0,0 +1,137 @@ +'use client'; + +import {useState} from 'react'; +import {toast} from 'sonner'; +import {Button} from '@/components/ui/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; +import {Textarea} from '@/components/ui/textarea'; +import {Label} from '@/components/ui/label'; +import {Flag} from 'lucide-react'; +import services from '@/lib/services'; + +/** + * 举报按钮组件 Props + */ +interface ReportButtonProps { + /** 项目ID */ + projectId: string; + /** 是否已经举报过 */ + hasReported?: boolean; +} + +/** + * 举报按钮组件 + * 提供项目举报功能,通过弹窗让用户填写举报理由 + */ +export function ReportButton({projectId, hasReported = false}: ReportButtonProps) { + const [isOpen, setIsOpen] = useState(false); + const [reason, setReason] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + + /** + * 处理举报提交 + */ + const handleSubmit = async () => { + if (!reason.trim()) { + toast.error('请填写举报理由'); + return; + } + + if (reason.trim().length > 255) { + toast.error('举报理由不能超过255个字符'); + return; + } + + try { + setIsSubmitting(true); + + const result = await services.project.reportProjectSafe(projectId, reason.trim()); + + if (result.success) { + toast.success('举报提交成功,感谢您的反馈'); + setIsOpen(false); + setReason(''); + } else { + toast.error(result.error || '举报失败,请稍后重试'); + } + } catch (error) { + toast.error(error instanceof Error ? error.message : '举报失败,请稍后重试'); + } finally { + setIsSubmitting(false); + } + }; + + /** + * 处理对话框关闭 + */ + const handleClose = () => { + if (!isSubmitting) { + setIsOpen(false); + setReason(''); + } + }; + + return ( + + + + + + + 举报项目 + + 如果您发现此项目存在违规内容、恶意行为或其他问题,请填写举报理由。我们会认真处理您的反馈。 + + +
+
+ +