Skip to content

Commit 88c168d

Browse files
AutoJunjieclaude
andcommitted
fix: load projects when move dialog opens via useEffect
The dialog data loading was inside handleOpenChange which only fires when the Dialog component itself triggers onOpenChange. When the parent sets open=true directly, data never loaded. Use useEffect on open prop. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1e2c9cf commit 88c168d

1 file changed

Lines changed: 45 additions & 44 deletions

File tree

src/app/(dashboard)/projects/[uuid]/dashboard/panels/move-idea-dialog.tsx

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client";
22

3-
import { useState } from "react";
3+
import { useState, useEffect, useCallback } from "react";
44
import { useTranslations } from "next-intl";
55
import { useRouter } from "next/navigation";
66
import { Loader2, Check } from "lucide-react";
@@ -45,58 +45,59 @@ export function MoveIdeaDialog({ open, onOpenChange, ideaUuid, projectUuid, onMo
4545
const [selectedProject, setSelectedProject] = useState<{ uuid: string; name: string } | null>(null);
4646
const [isMoving, setIsMoving] = useState(false);
4747
const [moveError, setMoveError] = useState<string | null>(null);
48-
const [hasLoaded, setHasLoaded] = useState(false);
4948

50-
// Load projects when dialog opens
51-
const handleOpenChange = async (isOpen: boolean) => {
52-
onOpenChange(isOpen);
53-
if (isOpen && !hasLoaded) {
54-
setSelectedProject(null);
55-
setMoveError(null);
56-
setIsLoadingProjects(true);
57-
try {
58-
const result = await getProjectsAndGroupsAction();
59-
if (result.success) {
60-
const { projects: allProjects, groups: allGroups } = result.data;
61-
const projects = allProjects
62-
.filter((p: { uuid: string }) => p.uuid !== projectUuid)
63-
.map((p: { uuid: string; name: string; groupUuid: string | null }) => ({
64-
uuid: p.uuid, name: p.name, groupUuid: p.groupUuid,
65-
}));
49+
const loadProjects = useCallback(async () => {
50+
setSelectedProject(null);
51+
setMoveError(null);
52+
setIsLoadingProjects(true);
53+
try {
54+
const result = await getProjectsAndGroupsAction();
55+
if (result.success) {
56+
const { projects: allProjects, groups: allGroups } = result.data;
57+
const projects = allProjects
58+
.filter((p: { uuid: string }) => p.uuid !== projectUuid)
59+
.map((p: { uuid: string; name: string; groupUuid: string | null }) => ({
60+
uuid: p.uuid, name: p.name, groupUuid: p.groupUuid,
61+
}));
6662

67-
const groupMap = new Map<string, string>();
68-
for (const g of allGroups) {
69-
groupMap.set(g.uuid, g.name);
70-
}
63+
const groupMap = new Map<string, string>();
64+
for (const g of allGroups) {
65+
groupMap.set(g.uuid, g.name);
66+
}
7167

72-
const grouped = new Map<string, MoveGroup>();
73-
const ungrouped: { uuid: string; name: string }[] = [];
68+
const grouped = new Map<string, MoveGroup>();
69+
const ungrouped: { uuid: string; name: string }[] = [];
7470

75-
for (const p of projects) {
76-
if (p.groupUuid && groupMap.has(p.groupUuid)) {
77-
if (!grouped.has(p.groupUuid)) {
78-
grouped.set(p.groupUuid, { uuid: p.groupUuid, name: groupMap.get(p.groupUuid)!, projects: [] });
79-
}
80-
grouped.get(p.groupUuid)!.projects.push({ uuid: p.uuid, name: p.name });
81-
} else {
82-
ungrouped.push({ uuid: p.uuid, name: p.name });
71+
for (const p of projects) {
72+
if (p.groupUuid && groupMap.has(p.groupUuid)) {
73+
if (!grouped.has(p.groupUuid)) {
74+
grouped.set(p.groupUuid, { uuid: p.groupUuid, name: groupMap.get(p.groupUuid)!, projects: [] });
8375
}
76+
grouped.get(p.groupUuid)!.projects.push({ uuid: p.uuid, name: p.name });
77+
} else {
78+
ungrouped.push({ uuid: p.uuid, name: p.name });
8479
}
80+
}
8581

86-
const groups = [...grouped.values()];
87-
if (ungrouped.length > 0) {
88-
groups.push({ uuid: "ungrouped", name: t("ideas.ungrouped"), projects: ungrouped });
89-
}
90-
setMoveGroups(groups);
91-
setHasLoaded(true);
82+
const groups = [...grouped.values()];
83+
if (ungrouped.length > 0) {
84+
groups.push({ uuid: "ungrouped", name: t("ideas.ungrouped"), projects: ungrouped });
9285
}
93-
} catch (e) {
94-
console.error("Failed to load projects for move dialog:", e);
95-
setMoveGroups([]);
86+
setMoveGroups(groups);
9687
}
97-
setIsLoadingProjects(false);
88+
} catch (e) {
89+
console.error("Failed to load projects for move dialog:", e);
90+
setMoveGroups([]);
9891
}
99-
};
92+
setIsLoadingProjects(false);
93+
}, [projectUuid, t]);
94+
95+
// Load projects when dialog opens
96+
useEffect(() => {
97+
if (open) {
98+
loadProjects();
99+
}
100+
}, [open, loadProjects]);
100101

101102
const handleMove = async () => {
102103
if (!selectedProject || isMoving) return;
@@ -119,7 +120,7 @@ export function MoveIdeaDialog({ open, onOpenChange, ideaUuid, projectUuid, onMo
119120
};
120121

121122
return (
122-
<Dialog open={open} onOpenChange={handleOpenChange}>
123+
<Dialog open={open} onOpenChange={onOpenChange}>
123124
<DialogContent>
124125
<DialogHeader>
125126
<DialogTitle>{t("ideas.moveIdeaTitle")}</DialogTitle>

0 commit comments

Comments
 (0)