22
33import { useState , useEffect } from "react" ;
44import { 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" ;
66import { 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+
824interface 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
1430interface 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