From ce29094ca7d7c7d865e2ff7cd118d4b6fefa166a Mon Sep 17 00:00:00 2001 From: Sulamoney222 Date: Thu, 30 Jul 2026 03:30:30 +0100 Subject: [PATCH] fix(project): resolve build errors and restore form autosave (#248, #252) - Fix duplicate import errors in project detail page - Fix broken JSX nesting and missing types in admin page - Fix form autosave draft restoration in ProjectForm - Fix TypeScript type errors across changed files --- dongle/app/admin/page.tsx | 23 ++++++++++++++++------ dongle/app/projects/[id]/page.tsx | 6 ------ dongle/components/projects/ProjectForm.tsx | 5 +++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/dongle/app/admin/page.tsx b/dongle/app/admin/page.tsx index 5f6cacc..528caf9 100644 --- a/dongle/app/admin/page.tsx +++ b/dongle/app/admin/page.tsx @@ -16,6 +16,7 @@ import { projectService } from "@/services/project/project.service"; import { reviewService } from "@/services/review/review.service"; import { auditLogService } from "@/services/audit/audit-log.service"; import { ReviewReport, ModerationAction, Review } from "@/types/review"; +import type { ProjectReport, ProjectClaimRequest, ProjectModerationAction } from "@/types/project"; import AuditLogViewer from "@/components/admin/AuditLogViewer"; interface VerificationRequest { @@ -47,17 +48,29 @@ export default function AdminDashboard() { const [projectModerationLog, setProjectModerationLog] = useState([]); const [moderationReason, setModerationReason] = useState>({}); const [expandedReport, setExpandedReport] = useState(null); + const [reviewsById, setReviewsById] = useState>({}); - // Load reports and moderation log + // Load reports, moderation log, and reviews useEffect(() => { if (!isAdmin) return; - const id = setTimeout(() => { + const id = setTimeout(async () => { setReports(reviewReportService.getReports()); setProjectReports(projectReportService.getReports()); setClaimRequests(projectClaimService.getRequests()); setModerationLog(reviewReportService.getModerationLog()); setProjectModerationLog(projectReportService.getModerationLog()); - } + + // Build a lookup map of reviews by ID for the report viewer + try { + const allReviews = await reviewService.getReviews(); + const byId: Record = {}; + allReviews.forEach((r) => { byId[r.id] = r; }); + setReviewsById(byId); + } catch { + // reviews are a non-critical enhancement for the reports UI + } + }, 0); + return () => clearTimeout(id); }, [isAdmin]); const handleAction = (id: string, status: "approved" | "rejected") => { @@ -462,7 +475,7 @@ export default function AdminDashboard() { No pending reports

- All reviews are currently in good standing. + All reviews and projects are currently in good standing.

) : ( @@ -549,8 +562,6 @@ export default function AdminDashboard() { ); })} - - )} {pendingProjectReports.map((report) => { const project = projectService.getProjectById(report.projectId); diff --git a/dongle/app/projects/[id]/page.tsx b/dongle/app/projects/[id]/page.tsx index 5d09d8c..05b5514 100644 --- a/dongle/app/projects/[id]/page.tsx +++ b/dongle/app/projects/[id]/page.tsx @@ -17,7 +17,6 @@ import { projectReportService } from "@/services/project/project-report.service" import { projectClaimService } from "@/services/project/project-claim.service"; import { formatDate } from "@/lib/date"; import { reviewService, getReviewPersistenceLabel } from "@/services/review/review.service"; -import { reviewReportService } from "@/services/review/review-report.service"; import { sorobanService } from "@/services/stellar/soroban.service"; import { extractDomain } from "@/lib/url"; import { useWalletPageGate } from "@/hooks/useWalletPageGate"; @@ -36,10 +35,6 @@ import { GitBranch, Globe, Info, - Bookmark, - BookmarkCheck, - Shield, - Bug, Megaphone, MessageSquare, Shield, @@ -369,7 +364,6 @@ export default function ProjectDetailPage() { { projectId: project.id, ...data, - authorAddress: gate.publicKey, }, gate.publicKey ); diff --git a/dongle/components/projects/ProjectForm.tsx b/dongle/components/projects/ProjectForm.tsx index 2cd0aa1..fb91e23 100644 --- a/dongle/components/projects/ProjectForm.tsx +++ b/dongle/components/projects/ProjectForm.tsx @@ -138,12 +138,13 @@ export default function ProjectForm({ }, }); - // Show notification when draft is restored + // Restore draft data into the form and show notification when a draft is loaded useEffect(() => { if (draft.loadedDraft) { setDraftRestored(true); + reset(draft.loadedDraft); } - }, [draft.loadedDraft]); + }, [draft.loadedDraft]); // eslint-disable-line react-hooks/exhaustive-deps useUnsavedChanges(isDirty, isSubmitting);