feat: добавлено предупреждение о fallback кэше и debug опции

Основные изменения:

- Предупреждение о неактуальности расписания:
  * Добавлен баннер предупреждения при использовании fallback кэша
  * Добавлено toast уведомление о возможной неактуальности данных
  * Баннер показывает возраст кэша в удобочитаемом формате
  * Автоскролл с учетом рендеринга баннера

- Debug опции в админ-панели:
  * Добавлена секция с аккордеоном для debug опций (только в dev режиме)
  * Опции: принудительное использование кэша, пустое расписание, ошибка, таймаут, информация о кэше
  * Все опции с тумблерами для удобного управления
  * API endpoint обновлен для поддержки debug настроек

- Структурные изменения:
  * Создан компонент Accordion для shadcn/ui
  * Расширены типы AppSettings для поддержки debug опций
  * Компонент баннера размещен внутри Schedule компонента (следуя правилам проекта)
  * Добавлен файл .cursorrules с правилами для AI ассистента

- Исправления:
  * Исправлена сериализация undefined значений в getServerSideProps
  * Улучшена логика автоскролла при использовании fallback кэша
  * Убраны лишние отступы у баннера предупреждения

- Зависимости:
  * Добавлен @radix-ui/react-accordion для компонента аккордеона

- Прочие изменения:
  * Обновлены настройки в settings.json
  * Изменения в старых файлах (old/README.md, old/old-schedule.txt)
  * Обновления в API endpoints админ-панели
This commit is contained in:
kilyabin
2025-12-02 01:05:36 +04:00
parent 166c73aff4
commit 16bba463eb
16 changed files with 825 additions and 40 deletions

View File

@@ -3,6 +3,13 @@ import path from 'path'
export type AppSettings = {
weekNavigationEnabled: boolean
debug?: {
forceCache?: boolean
forceEmpty?: boolean
forceError?: boolean
forceTimeout?: boolean
showCacheInfo?: boolean
}
}
let cachedSettings: AppSettings | null = null
@@ -10,7 +17,14 @@ let cachedSettingsPath: string | null = null
let cachedSettingsMtime: number | null = null
const defaultSettings: AppSettings = {
weekNavigationEnabled: true
weekNavigationEnabled: true,
debug: {
forceCache: false,
forceEmpty: false,
forceError: false,
forceTimeout: false,
showCacheInfo: false
}
}
/**
@@ -60,7 +74,11 @@ export function loadSettings(): AppSettings {
// Убеждаемся, что все обязательные поля присутствуют
const mergedSettings: AppSettings = {
...defaultSettings,
...settings
...settings,
debug: {
...defaultSettings.debug,
...settings.debug
}
}
cachedSettings = mergedSettings
@@ -112,7 +130,11 @@ export function saveSettings(settings: AppSettings): void {
// Объединяем с настройками по умолчанию для сохранения всех полей
const mergedSettings: AppSettings = {
...defaultSettings,
...settings
...settings,
debug: {
...defaultSettings.debug,
...settings.debug
}
}
// Ищем существующий файл