feat: улучшения системы расписания и UI

- Добавлены таймауты (8 сек) для запросов расписания
- Реализована навигация по неделям с поддержкой параметра wk
- Улучшено кэширование с автоматической очисткой старых записей
- Добавлена валидация параметров в getSchedule
- Улучшен UI загрузки с анимированными сообщениями и предупреждениями
- Оптимизирована обработка ошибок и очистка памяти JSDOM
- Обновлены зависимости проекта
- Добавлена документация для старых файлов
This commit is contained in:
kilyabin
2025-11-30 22:15:07 +04:00
parent d3d33c1e08
commit 3345eb2e3f
10 changed files with 65 additions and 18 deletions

View File

@@ -11,6 +11,13 @@ export type ScheduleResult = {
availableWeeks?: WeekInfo[]
}
export class ScheduleTimeoutError extends Error {
constructor(message: string) {
super(message)
this.name = 'ScheduleTimeoutError'
}
}
export async function getSchedule(groupID: number, groupName: string, wk?: number, parseWeekNavigation: boolean = true): Promise<ScheduleResult> {
// Валидация параметров
if (!Number.isInteger(groupID) || groupID <= 0) {
@@ -23,9 +30,9 @@ export async function getSchedule(groupID: number, groupName: string, wk?: numbe
const url = `${PROXY_URL}/?mn=2&obj=${groupID}${wk ? `&wk=${wk}` : ''}`
// Добавляем таймаут 30 секунд для fetch запроса
// Добавляем таймаут 8 секунд для fetch запроса
const controller = new AbortController()
const timeoutId = setTimeout(() => controller.abort(), 30000) // 30 секунд
const timeoutId = setTimeout(() => controller.abort(), 8000) // 8 секунд
try {
const page = await fetch(url, { signal: controller.signal })
@@ -65,7 +72,7 @@ export async function getSchedule(groupID: number, groupName: string, wk?: numbe
} catch (error) {
clearTimeout(timeoutId)
if (error instanceof Error && error.name === 'AbortError') {
throw new Error(`Request timeout while fetching ${PROXY_URL}`)
throw new ScheduleTimeoutError(`Request timeout while fetching ${PROXY_URL}`)
}
throw error
}