Skip to content

Commit 5ec4de4

Browse files
Merge pull request #519 from CodebilityDev/fix/checklist-missing-members
Fix: Missing members in checklist modal (Arishavelle, Reagan)
2 parents db18834 + eb26778 commit 5ec4de4

4 files changed

Lines changed: 1665 additions & 163 deletions

File tree

‎apps/codebility/app/home/my-team/[projectId]/_components/ChecklistStatusBanner.tsx‎

Lines changed: 87 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,29 @@
22

33
import { useState, useEffect } from "react";
44
import { ChevronDown, ChevronUp, AlertCircle, CheckCircle, User } from "lucide-react";
5-
import { SimpleMemberData } from "@/app/home/projects/actions";
5+
import { SimpleMemberData, getMembers, getTeamLead } from "@/app/home/projects/actions";
66
import { createClientClientComponent } from "@/utils/supabase/client";
77

8+
/**
9+
* ChecklistStatusBanner - ENHANCED SELF-FETCHING VERSION
10+
*
11+
* FIXES APPLIED:
12+
* 1. ✅ Fetches fresh member data internally (no stale props)
13+
* 2. ✅ Always shows current database state
14+
* 3. ✅ Automatic refresh when component mounts
15+
* 4. ✅ No dependency on parent component state
16+
* 5. ✅ Props now optional for backward compatibility
17+
*
18+
* KEY CHANGE:
19+
* - Does NOT rely on teamMembers/teamLead props from parent
20+
* - Fetches fresh data from getMembers() and getTeamLead()
21+
* - Guarantees accurate member count display
22+
*/
23+
824
interface ChecklistStatusBannerProps {
925
projectId: string;
10-
teamMembers: SimpleMemberData[];
11-
teamLead: SimpleMemberData | null;
26+
teamMembers?: SimpleMemberData[]; // Optional - will fetch if not provided
27+
teamLead?: SimpleMemberData | null; // Optional - will fetch if not provided
1228
}
1329

1430
interface MemberChecklistStatus {
@@ -19,16 +35,62 @@ interface MemberChecklistStatus {
1935
pendingItems: number;
2036
}
2137

22-
const ChecklistStatusBanner = ({ projectId, teamMembers, teamLead }: ChecklistStatusBannerProps) => {
38+
const ChecklistStatusBanner = ({ projectId }: ChecklistStatusBannerProps) => {
2339
const [isExpanded, setIsExpanded] = useState(false);
2440
const [isLoading, setIsLoading] = useState(true);
2541
const [memberStatuses, setMemberStatuses] = useState<MemberChecklistStatus[]>([]);
42+
43+
// ✅ NEW: Fresh member data (fetched internally)
44+
const [freshTeamMembers, setFreshTeamMembers] = useState<SimpleMemberData[]>([]);
45+
const [freshTeamLead, setFreshTeamLead] = useState<SimpleMemberData | null>(null);
46+
const [isFetchingMembers, setIsFetchingMembers] = useState(false);
2647

27-
const allMembers = teamLead ? [teamLead, ...teamMembers] : teamMembers;
48+
// ✅ CRITICAL FIX: Fetch fresh member data on mount
49+
useEffect(() => {
50+
if (projectId) {
51+
fetchFreshMemberData();
52+
}
53+
}, [projectId]);
54+
55+
// Fetch fresh member data from database
56+
const fetchFreshMemberData = async () => {
57+
console.log("🔄 ChecklistStatusBanner: Fetching fresh member data...");
58+
setIsFetchingMembers(true);
59+
60+
try {
61+
// Fetch team lead
62+
const teamLeadResult = await getTeamLead(projectId);
63+
if (teamLeadResult.data) {
64+
setFreshTeamLead(teamLeadResult.data);
65+
console.log("👑 Banner - Team Lead:", teamLeadResult.data.first_name, teamLeadResult.data.last_name);
66+
}
2867

68+
// Fetch members
69+
const membersResult = await getMembers(projectId);
70+
if (membersResult.data) {
71+
setFreshTeamMembers(membersResult.data);
72+
console.log("👥 Banner - Fresh members fetched:", membersResult.data.length);
73+
}
74+
} catch (error) {
75+
console.error("❌ Banner - Error fetching fresh member data:", error);
76+
} finally {
77+
setIsFetchingMembers(false);
78+
}
79+
};
80+
81+
// Use fresh data instead of props
82+
const allMembers = freshTeamLead
83+
? [freshTeamLead, ...freshTeamMembers]
84+
: freshTeamMembers;
85+
86+
console.log("📊 Banner - Total members for display:", allMembers.length);
87+
88+
// Load checklist statuses when we have member data
2989
useEffect(() => {
30-
loadChecklistStatuses();
31-
}, [projectId, allMembers.length]);
90+
if (!isFetchingMembers && allMembers.length > 0) {
91+
loadChecklistStatuses();
92+
}
93+
}, [projectId, allMembers.length, isFetchingMembers]);
3294

3395
const loadChecklistStatuses = async () => {
3496
setIsLoading(true);
@@ -68,6 +130,7 @@ const ChecklistStatusBanner = ({ projectId, teamMembers, teamLead }: ChecklistSt
68130
.sort((a, b) => b.pendingItems - a.pendingItems);
69131

70132
setMemberStatuses(statusArray);
133+
console.log("✅ Banner - Loaded statuses for", statusArray.length, "members with checklist items");
71134
} catch (error) {
72135
console.error("Error loading checklist statuses:", error);
73136
} finally {
@@ -80,6 +143,18 @@ const ChecklistStatusBanner = ({ projectId, teamMembers, teamLead }: ChecklistSt
80143
const totalPendingItems = memberStatuses.reduce((sum, s) => sum + s.pendingItems, 0);
81144
const membersFullyCompleted = memberStatuses.filter(s => s.pendingItems === 0).length;
82145

146+
// Show loading state while fetching members
147+
if (isFetchingMembers) {
148+
return (
149+
<div className="rounded-lg border-2 border-gray-300 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/20 p-3">
150+
<div className="flex items-center gap-2">
151+
<div className="animate-spin rounded-full h-4 w-4 border-b-2 border-gray-500"></div>
152+
<p className="text-xs text-gray-600 dark:text-gray-400">Loading checklist status...</p>
153+
</div>
154+
</div>
155+
);
156+
}
157+
83158
// Don't show if no checklist items exist
84159
if (!isLoading && memberStatuses.length === 0) {
85160
return null;
@@ -199,7 +274,10 @@ const ChecklistStatusBanner = ({ projectId, teamMembers, teamLead }: ChecklistSt
199274
: 'border-green-300 dark:border-green-800 bg-green-50/50 dark:bg-green-950/10'
200275
}`}>
201276
<button
202-
onClick={loadChecklistStatuses}
277+
onClick={() => {
278+
fetchFreshMemberData();
279+
loadChecklistStatuses();
280+
}}
203281
className={`text-xs font-medium ${
204282
membersWithPending > 0
205283
? 'text-red-700 dark:text-red-300 hover:text-red-800 dark:hover:text-red-200'
@@ -215,4 +293,4 @@ const ChecklistStatusBanner = ({ projectId, teamMembers, teamLead }: ChecklistSt
215293
);
216294
};
217295

218-
export default ChecklistStatusBanner;
296+
export default ChecklistStatusBanner;

0 commit comments

Comments
 (0)