@@ -7,7 +7,7 @@ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
77import { MeetingCardComponent } from '@app/shared/components/meeting-card/meeting-card.component' ;
88import { ProjectContextService } from '@app/shared/services/project-context.service' ;
99import { ButtonComponent } from '@components/button/button.component' ;
10- import { Meeting , ProjectContext } from '@lfx-one/shared/interfaces' ;
10+ import { Meeting , PastMeeting , ProjectContext } from '@lfx-one/shared/interfaces' ;
1111import { getCurrentOrNextOccurrence } from '@lfx-one/shared/utils' ;
1212import { MeetingService } from '@services/meeting.service' ;
1313import { PersonaService } from '@services/persona.service' ;
@@ -28,9 +28,11 @@ export class MeetingsDashboardComponent {
2828 private readonly personaService = inject ( PersonaService ) ;
2929
3030 public meetingsLoading : WritableSignal < boolean > ;
31- public meetings : Signal < Meeting [ ] > = signal ( [ ] ) ;
31+ public pastMeetingsLoading : WritableSignal < boolean > ;
32+ public upcomingMeetings : Signal < Meeting [ ] > ;
33+ public pastMeetings : Signal < PastMeeting [ ] > ;
3234 public currentView : WritableSignal < 'list' | 'calendar' > ;
33- public filteredMeetings : Signal < Meeting [ ] > ;
35+ public filteredMeetings : Signal < ( Meeting | PastMeeting ) [ ] > ;
3436 public refresh$ : BehaviorSubject < void > ;
3537 public searchQuery : WritableSignal < string > ;
3638 public timeFilter : WritableSignal < 'upcoming' | 'past' > ;
@@ -49,14 +51,16 @@ export class MeetingsDashboardComponent {
4951
5052 // Initialize state
5153 this . meetingsLoading = signal < boolean > ( true ) ;
54+ this . pastMeetingsLoading = signal < boolean > ( true ) ;
5255 this . refresh$ = new BehaviorSubject < void > ( undefined ) ;
5356 this . currentView = signal < 'list' | 'calendar' > ( 'list' ) ;
5457 this . searchQuery = signal < string > ( '' ) ;
5558 this . timeFilter = signal < 'upcoming' | 'past' > ( 'upcoming' ) ;
5659 this . topBarVisibilityFilter = signal < 'mine' | 'public' > ( 'mine' ) ;
5760
5861 // Initialize data with reactive pattern
59- this . meetings = this . initializeMeetings ( ) ;
62+ this . upcomingMeetings = this . initializeUpcomingMeetings ( ) ;
63+ this . pastMeetings = this . initializePastMeetings ( ) ;
6064 this . filteredMeetings = this . initializeFilteredMeetings ( ) ;
6165 }
6266
@@ -66,10 +70,11 @@ export class MeetingsDashboardComponent {
6670
6771 public refreshMeetings ( ) : void {
6872 this . meetingsLoading . set ( true ) ;
73+ this . pastMeetingsLoading . set ( true ) ;
6974 this . refresh$ . next ( ) ;
7075 }
7176
72- private initializeMeetings ( ) : Signal < Meeting [ ] > {
77+ private initializeUpcomingMeetings ( ) : Signal < Meeting [ ] > {
7378 // Convert project signal to observable to react to project changes
7479 const project$ = toObservable ( this . project ) ;
7580
@@ -86,7 +91,7 @@ export class MeetingsDashboardComponent {
8691 return of ( [ ] ) ;
8792 }
8893
89- return this . meetingService . getMeetings ( ) . pipe (
94+ return this . meetingService . getMeetingsByProject ( project . projectId , 100 ) . pipe (
9095 map ( ( meetings ) => {
9196 // Sort meetings by current or next occurrence start time (earliest first)
9297 return meetings . sort ( ( a , b ) => {
@@ -107,7 +112,7 @@ export class MeetingsDashboardComponent {
107112 } ) ;
108113 } ) ,
109114 catchError ( ( error ) => {
110- console . error ( 'Failed to load meetings:' , error ) ;
115+ console . error ( 'Failed to load upcoming meetings:' , error ) ;
111116 this . meetingsLoading . set ( false ) ;
112117 return of ( [ ] ) ;
113118 } ) ,
@@ -119,11 +124,44 @@ export class MeetingsDashboardComponent {
119124 ) ;
120125 }
121126
122- private initializeFilteredMeetings ( ) : Signal < Meeting [ ] > {
127+ private initializePastMeetings ( ) : Signal < PastMeeting [ ] > {
128+ // Convert project signal to observable to react to project changes
129+ const project$ = toObservable ( this . project ) ;
130+
131+ return toSignal (
132+ merge (
133+ project$ , // Triggers on project context changes
134+ this . refresh$ // Triggers on manual refresh
135+ ) . pipe (
136+ tap ( ( ) => this . pastMeetingsLoading . set ( true ) ) ,
137+ switchMap ( ( ) => {
138+ const project = this . project ( ) ;
139+ if ( ! project ?. projectId ) {
140+ this . pastMeetingsLoading . set ( false ) ;
141+ return of ( [ ] ) ;
142+ }
143+
144+ return this . meetingService . getPastMeetingsByProject ( project . projectId , 100 ) . pipe (
145+ catchError ( ( error ) => {
146+ console . error ( 'Failed to load past meetings:' , error ) ;
147+ this . pastMeetingsLoading . set ( false ) ;
148+ return of ( [ ] ) ;
149+ } ) ,
150+ tap ( ( ) => this . pastMeetingsLoading . set ( false ) )
151+ ) ;
152+ } )
153+ ) ,
154+ { initialValue : [ ] }
155+ ) ;
156+ }
157+
158+ private initializeFilteredMeetings ( ) : Signal < ( Meeting | PastMeeting ) [ ] > {
123159 return computed ( ( ) => {
124- let filtered = this . meetings ( ) ;
125- const now = new Date ( ) ;
160+ // Get appropriate meetings based on time filter
161+ const timeFilter = this . timeFilter ( ) ;
162+ let filtered : ( Meeting | PastMeeting ) [ ] = timeFilter === 'past' ? this . pastMeetings ( ) : this . upcomingMeetings ( ) ;
126163
164+ // Apply search filter only - time filtering is handled by API
127165 const search = this . searchQuery ( ) ?. toLowerCase ( ) || '' ;
128166 if ( search ) {
129167 filtered = filtered . filter (
@@ -135,21 +173,6 @@ export class MeetingsDashboardComponent {
135173 ) ;
136174 }
137175
138- const timeFilterValue = this . timeFilter ( ) ;
139- if ( timeFilterValue === 'upcoming' ) {
140- filtered = filtered . filter ( ( meeting ) => {
141- const meetingEndTime = new Date ( meeting . start_time ) ;
142- meetingEndTime . setMinutes ( meetingEndTime . getMinutes ( ) + meeting . duration + 40 ) ;
143- return meetingEndTime >= now ;
144- } ) ;
145- } else {
146- filtered = filtered . filter ( ( meeting ) => {
147- const meetingEndTime = new Date ( meeting . start_time ) ;
148- meetingEndTime . setMinutes ( meetingEndTime . getMinutes ( ) + meeting . duration + 40 ) ;
149- return meetingEndTime < now ;
150- } ) ;
151- }
152-
153176 return filtered ;
154177 } ) ;
155178 }
0 commit comments