RedFoxBot Logo

RedFoxBot

Выполнено

Q1 · Март 2026

Проработать работу в offline

enhancement
## User Story

**Как** посетитель сайта
**Я хочу** продолжать пользоваться приложением при нестабильном интернете или без сети
**Чтобы** просматривать кэшированный контент и понимать, когда данные недоступны

---

## Критерии приёмки

- [ ] Приложение определяет offline-режим и показывает индикатор
- [ ] Основная навигация и статический контент доступны из кэша при отсутствии сети
- [ ] Имеется offline fallback-страница при неудаче загрузки
- [ ] При восстановлении сети показывается уведомление и возможность обновить данные
- [ ] PWA настроена: manifest.json, service worker, иконки для «Установить на устройство»
- [ ] Критичный для LCP контент (оболочка, шрифты, стили) отдаётся из кэша

---

## Декомпозиция / подзадачи

1. Настроить PWA через `@ducanh2912/next-pwa` в `next.config.ts`
2. Добавить manifest.json (название, иконки, theme_color, display)
3. Реализовать fallback-страницу `/_offline` (или offline.html)
4. Добавить UI-индикатор статуса сети (компонент + хук `navigator.onLine` / события online/offline)
5. Настроить кэширование статики и навигационных запросов (Workbox)
6. Добавить уведомление при восстановлении сети и кнопку «Обновить»
7. Документировать ограничения (что работает offline, что нет)

---

## План реализации

### Обзор

`@ducanh2912/next-pwa` уже есть в зависимостях, но не подключён в `next.config.ts`. Подключить PWA, настроить runtime caching, добавить offline fallback и UI-индикатор сети.

### Шаги

1. **Конфигурация PWA** — обернуть `nextConfig` в `withPWA` из `@ducanh2912/next-pwa`, задать `dest: "public"`, `register: true`, `skipWaiting: true`, настроить `runtimeCaching` для API и статики (стратегия NetworkFirst с fallback на Cache)
2. **Manifest** — добавить или сгенерировать `manifest.json` с `name`, `short_name`, `icons`, `theme_color`, `display: "standalone"`, подключить в layout через `<link rel="manifest">`
3. **Fallback-страница** — создать `src/app/offline/page.tsx` или `public/_offline.html`, отображать сообщение «Нет соединения» и кнопку «Повторить»
4. **Компонент OfflineIndicator** — хук `useOnlineStatus()` на `navigator.onLine` + события `online`/`offline`; компонент-баннер/тост при offline; разместить в AppShell или layout
5. **Обновление при восстановлении сети** — в хуке/контексте при событии `online` показать уведомление (Mantine Notifications) «Сеть восстановлена» и кнопку «Обновить страницу» или `router.refresh()`
6. **Тестирование** — DevTools → Network → Offline, проверить fallback, индикатор, поведение при возврате сети

### Технические детали

- **Зависимости:** `@ducanh2912/next-pwa` (уже установлен)
- **Затронутые модули:** `next.config.ts`, `src/app/layout.tsx`, AppShell (или layout-оболочка)
- **Ограничения:** авторизация и мутации требуют сети; динамический контент (блог, игры) offline доступен только после предварительной загрузки; Server Components без кэша при первом заходе offline не отдадутся