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);