@@ -78,6 +78,53 @@ function getGapsMode(numbers: number[]): number[] {
7878 return modes ;
7979}
8080
81+ function getHoursMode ( hours : string [ ] ) : string {
82+ const frequencyMap : Record < string , number > = { } ;
83+ let maxCount = 0 ;
84+ let mode = hours [ 0 ] ;
85+
86+ for ( const item of hours ) {
87+ frequencyMap [ item ] = ( frequencyMap [ item ] || 0 ) + 1 ;
88+
89+ if ( frequencyMap [ item ] > maxCount ) {
90+ maxCount = frequencyMap [ item ] ;
91+ mode = item ;
92+ }
93+ }
94+
95+ return mode ;
96+ }
97+
98+ export function getMostFrequentTimes ( entries : ClassgroupDate [ ] ) : {
99+ startTime : string ;
100+ endTime : string ;
101+ } {
102+ const startTimes : string [ ] = [ ] ;
103+ const endTimes : string [ ] = [ ] ;
104+
105+ for ( const entry of entries ) {
106+ const startTimePart = entry . startTime . split ( " " ) [ 1 ] ;
107+ const endTimePart = entry . endTime . split ( " " ) [ 1 ] ;
108+
109+ if ( startTimePart ) {
110+ startTimes . push ( startTimePart ) ;
111+ }
112+ if ( endTimePart ) {
113+ endTimes . push ( endTimePart ) ;
114+ }
115+ }
116+
117+ const modeStartTime = getHoursMode ( startTimes ) ;
118+ const modeEndTime = getHoursMode ( endTimes ) ;
119+
120+ const baseDate = entries [ 0 ] . date ;
121+
122+ return {
123+ startTime : `${ baseDate } ${ modeStartTime } ` ,
124+ endTime : `${ baseDate } ${ modeEndTime } ` ,
125+ } ;
126+ }
127+
81128export function buildGroupSchedulePattern (
82129 dates : ClassgroupDate [ ] ,
83130) : GroupSchedulePattern | null {
@@ -87,19 +134,18 @@ export function buildGroupSchedulePattern(
87134
88135 const sorted = [ ...dates ] . toSorted ( ( a , b ) => a . date . localeCompare ( b . date ) ) ;
89136 const firstDate = new Date ( sorted [ 0 ] . date ) ;
90- let firstEntry = sorted [ 0 ] ;
91- if ( sorted . length > 1 ) {
92- firstEntry = sorted [ 1 ] ; //first date is often irregular, like in 15h course first classes can be 45mins, so if its possible, we can take second
93- }
137+ const firstEntry = sorted [ 0 ] ;
94138 const lastEntry = sorted . at ( - 1 ) ?? firstEntry ;
95139
140+ const { startTime, endTime } = getMostFrequentTimes ( dates ) ;
141+
96142 if ( sorted . length === 1 ) {
97143 return {
98144 pattern : "irregular" ,
99145 parity : "unknown" ,
100146 weekday : isoWeekday ( firstDate ) ,
101- startTime : firstEntry . startTime ,
102- endTime : firstEntry . endTime ,
147+ startTime,
148+ endTime,
103149 firstOccurrence : firstEntry . date ,
104150 lastOccurrence : lastEntry . date ,
105151 occurrencesCount : 1 ,
@@ -154,8 +200,8 @@ export function buildGroupSchedulePattern(
154200 pattern,
155201 parity,
156202 weekday : isoWeekday ( firstDate ) ,
157- startTime : firstEntry . startTime ,
158- endTime : firstEntry . endTime ,
203+ startTime,
204+ endTime,
159205 firstOccurrence : firstEntry . date ,
160206 lastOccurrence : lastEntry . date ,
161207 occurrencesCount : sorted . length ,
0 commit comments