@@ -48,6 +48,16 @@ interface Standing {
4848 setsAgainst : number ;
4949}
5050
51+ interface Match {
52+ _id : string ;
53+ opponentName : string ;
54+ date : string ;
55+ homeAway : "home" | "away" ;
56+ status : "scheduled" | "played" ;
57+ scoreFor ?: number ;
58+ scoreAgainst ?: number ;
59+ }
60+
5161interface TeamRole {
5262 _id : string ; // subdoc ObjectId
5363 teamId : string ;
@@ -123,6 +133,7 @@ export default function TeamDetailPage() {
123133 const [ team , setTeam ] = React . useState < Team | null > ( null ) ;
124134 const [ form , setForm ] = React . useState < Team | null > ( null ) ;
125135 const [ standings , setStandings ] = React . useState < Standing [ ] > ( [ ] ) ;
136+ const [ matches , setMatches ] = React . useState < Match [ ] > ( [ ] ) ;
126137 const [ allClubMembers , setAllClubMembers ] = React . useState < Member [ ] > ( [ ] ) ;
127138 const [ loading , setLoading ] = React . useState ( true ) ;
128139 const [ saving , setSaving ] = React . useState ( false ) ;
@@ -167,25 +178,27 @@ export default function TeamDetailPage() {
167178
168179 // ── Load ──────────────────────────────────────────────────────────────────
169180 const refreshMembers = React . useCallback ( async ( ) => {
170- const data : Member [ ] = await apiFetch ( "/api/members" ) ;
181+ const data = await apiFetch < Member [ ] > ( "/api/members" ) ;
171182 setAllClubMembers ( data ) ;
172183 } , [ ] ) ;
173184
174185 React . useEffect ( ( ) => {
175186 if ( ! id ) return ;
176187 Promise . all ( [
177- apiFetch ( `/api/teams/${ id } ` ) ,
178- apiFetch ( `/api/standings?teamId=${ id } ` ) ,
179- apiFetch ( "/api/members" ) ,
188+ apiFetch < Team > ( `/api/teams/${ id } ` ) ,
189+ apiFetch < Standing [ ] > ( `/api/standings?teamId=${ id } ` ) ,
190+ apiFetch < Member [ ] > ( "/api/members" ) ,
191+ apiFetch < Match [ ] > ( `/api/matches?teamId=${ id } ` ) ,
180192 ] )
181- . then ( ( [ teamData , standingsData , membersData ] ) => {
193+ . then ( ( [ teamData , standingsData , membersData , matchesData ] ) => {
182194 setTeam ( teamData ) ;
183195 setForm ( {
184196 ...teamData ,
185197 trainingSchedule : teamData . trainingSchedule ?? [ ] ,
186198 } ) ;
187199 setStandings ( standingsData ) ;
188- setAllClubMembers ( membersData as Member [ ] ) ;
200+ setAllClubMembers ( membersData ) ;
201+ setMatches ( matchesData ) ;
189202 } )
190203 . catch ( ( ) => alert ( "Erreur lors du chargement" ) )
191204 . finally ( ( ) => setLoading ( false ) ) ;
@@ -196,7 +209,7 @@ export default function TeamDetailPage() {
196209 if ( ! form ) return ;
197210 setSaving ( true ) ;
198211 try {
199- const updated = await apiFetch ( `/api/teams/${ form . _id } ` , {
212+ const updated = await apiFetch < Team > ( `/api/teams/${ form . _id } ` , {
200213 method : "PUT" ,
201214 body : JSON . stringify ( form ) ,
202215 } ) ;
@@ -482,6 +495,79 @@ export default function TeamDetailPage() {
482495 </ section >
483496 ) }
484497
498+ { /* ── Matches ── */ }
499+ { matches . length > 0 && (
500+ < section className = "border rounded-lg p-6 flex flex-col gap-4" >
501+ < h2 className = "text-lg font-semibold" >
502+ Matches
503+ < span className = "ml-2 text-sm font-normal text-muted-foreground" >
504+ ({ matches . length } )
505+ </ span >
506+ </ h2 >
507+ < div className = "overflow-auto rounded border" >
508+ < table className = "w-full text-sm" >
509+ < thead className = "bg-muted" >
510+ < tr >
511+ < th className = "p-2 text-left" > Date</ th >
512+ < th className = "p-2 text-left" > Adversaire</ th >
513+ < th className = "p-2 text-center" > D/E</ th >
514+ < th className = "p-2 text-center" > Statut</ th >
515+ < th className = "p-2 text-center" > Score</ th >
516+ </ tr >
517+ </ thead >
518+ < tbody >
519+ { [ ...matches ]
520+ . sort (
521+ ( a , b ) =>
522+ new Date ( a . date ) . getTime ( ) - new Date ( b . date ) . getTime ( ) ,
523+ )
524+ . map ( ( m ) => (
525+ < tr key = { m . _id } className = "border-t" >
526+ < td className = "p-2 whitespace-nowrap text-muted-foreground" >
527+ { new Date ( m . date ) . toLocaleString ( "fr-FR" , {
528+ day : "2-digit" ,
529+ month : "2-digit" ,
530+ year : "numeric" ,
531+ hour : "2-digit" ,
532+ minute : "2-digit" ,
533+ } ) }
534+ </ td >
535+ < td className = "p-2 font-medium" > { m . opponentName } </ td >
536+ < td className = "p-2 text-center" >
537+ < span
538+ className = { `px-2 py-0.5 rounded text-xs font-medium ${
539+ m . homeAway === "home"
540+ ? "bg-blue-100 text-blue-700"
541+ : "bg-purple-100 text-purple-700"
542+ } `}
543+ >
544+ { m . homeAway === "home" ? "Dom." : "Ext." }
545+ </ span >
546+ </ td >
547+ < td className = "p-2 text-center" >
548+ < span
549+ className = { `px-2 py-0.5 rounded text-xs font-medium ${
550+ m . status === "played"
551+ ? "bg-green-100 text-green-700"
552+ : "bg-yellow-100 text-yellow-700"
553+ } `}
554+ >
555+ { m . status === "played" ? "Joué" : "Prévu" }
556+ </ span >
557+ </ td >
558+ < td className = "p-2 text-center font-mono" >
559+ { m . status === "played"
560+ ? `${ m . scoreFor } - ${ m . scoreAgainst } `
561+ : "-" }
562+ </ td >
563+ </ tr >
564+ ) ) }
565+ </ tbody >
566+ </ table >
567+ </ div >
568+ </ section >
569+ ) }
570+
485571 { /* ── Joueurs & Staff ── */ }
486572 < section className = "border rounded-lg p-6 flex flex-col gap-4" >
487573 < div className = "flex items-center justify-between" >
0 commit comments