Skip to content

Commit a8a2d92

Browse files
committed
fix: groups pattern and parity
detecting startTime and endTime is now based on mode value
1 parent 44f5a9c commit a8a2d92

1 file changed

Lines changed: 54 additions & 8 deletions

File tree

src/lib/utils/build-group-schedule-pattern.ts

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
81128
export 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

Comments
 (0)