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

@@ -21,15 +21,37 @@ async function handler(
if (req.method === 'PUT') {
// Обновление настроек
const { weekNavigationEnabled } = req.body
const { weekNavigationEnabled, debug } = req.body
if (typeof weekNavigationEnabled !== 'boolean') {
res.status(400).json({ error: 'weekNavigationEnabled must be a boolean' })
return
}
// Валидация debug опций (только в dev режиме)
if (debug !== undefined) {
if (typeof debug !== 'object' || debug === null) {
res.status(400).json({ error: 'debug must be an object' })
return
}
if (process.env.NODE_ENV !== 'development') {
res.status(403).json({ error: 'Debug options are only available in development mode' })
return
}
const debugKeys = ['forceCache', 'forceEmpty', 'forceError', 'forceTimeout', 'showCacheInfo']
for (const key of debugKeys) {
if (key in debug && typeof debug[key] !== 'boolean' && debug[key] !== undefined) {
res.status(400).json({ error: `debug.${key} must be a boolean` })
return
}
}
}
const settings: AppSettings = {
weekNavigationEnabled
weekNavigationEnabled,
...(debug !== undefined && { debug })
}
try {