@djangocfg/layouts 2.1.35 → 2.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/package.json +5 -5
  2. package/src/layouts/AppLayout/BaseApp.tsx +31 -25
  3. package/src/layouts/shared/types.ts +36 -0
  4. package/src/snippets/McpChat/context/ChatContext.tsx +9 -0
  5. package/src/snippets/PWA/@docs/research.md +576 -0
  6. package/src/snippets/PWA/@refactoring/ARCHITECTURE_ANALYSIS.md +1179 -0
  7. package/src/snippets/PWA/@refactoring/EXECUTIVE_SUMMARY.md +271 -0
  8. package/src/snippets/PWA/@refactoring/README.md +204 -0
  9. package/src/snippets/PWA/@refactoring/REFACTORING_PROPOSALS.md +1109 -0
  10. package/src/snippets/PWA/@refactoring2/COMPARISON-WITH-NEXTJS.md +718 -0
  11. package/src/snippets/PWA/@refactoring2/P1-FIXES-COMPLETED.md +188 -0
  12. package/src/snippets/PWA/@refactoring2/POST-P0-ANALYSIS.md +362 -0
  13. package/src/snippets/PWA/@refactoring2/README.md +85 -0
  14. package/src/snippets/PWA/@refactoring2/RECOMMENDATIONS.md +1321 -0
  15. package/src/snippets/PWA/@refactoring2/REMAINING-ISSUES.md +557 -0
  16. package/src/snippets/PWA/README.md +387 -0
  17. package/src/snippets/PWA/components/A2HSHint.tsx +226 -0
  18. package/src/snippets/PWA/components/IOSGuide.tsx +29 -0
  19. package/src/snippets/PWA/components/IOSGuideDrawer.tsx +101 -0
  20. package/src/snippets/PWA/components/IOSGuideModal.tsx +101 -0
  21. package/src/snippets/PWA/components/PushPrompt.tsx +165 -0
  22. package/src/snippets/PWA/config.ts +20 -0
  23. package/src/snippets/PWA/context/DjangoPushContext.tsx +105 -0
  24. package/src/snippets/PWA/context/InstallContext.tsx +118 -0
  25. package/src/snippets/PWA/context/PushContext.tsx +156 -0
  26. package/src/snippets/PWA/hooks/useDjangoPush.ts +277 -0
  27. package/src/snippets/PWA/hooks/useInstallPrompt.ts +164 -0
  28. package/src/snippets/PWA/hooks/useIsPWA.ts +115 -0
  29. package/src/snippets/PWA/hooks/usePushNotifications.ts +205 -0
  30. package/src/snippets/PWA/index.ts +95 -0
  31. package/src/snippets/PWA/types/components.ts +101 -0
  32. package/src/snippets/PWA/types/index.ts +26 -0
  33. package/src/snippets/PWA/types/install.ts +38 -0
  34. package/src/snippets/PWA/types/platform.ts +29 -0
  35. package/src/snippets/PWA/types/push.ts +21 -0
  36. package/src/snippets/PWA/utils/localStorage.ts +203 -0
  37. package/src/snippets/PWA/utils/logger.ts +149 -0
  38. package/src/snippets/PWA/utils/platform.ts +151 -0
  39. package/src/snippets/PWA/utils/vapid.ts +226 -0
  40. package/src/snippets/index.ts +30 -0
@@ -0,0 +1,271 @@
1
+ # PWA Snippets: Executive Summary
2
+
3
+ **TL;DR:** Текущая реализация работает хорошо (4/5), но требует улучшений в надежности определения isPWA, производительности и качестве кода.
4
+
5
+ ---
6
+
7
+ ## Основные выводы
8
+
9
+ ### ✅ Что работает хорошо
10
+
11
+ 1. **Унифицированный UX** для iOS и Android
12
+ 2. **Хорошая документация** (README, research.md)
13
+ 3. **TypeScript типизация**
14
+ 4. **Поддержка push-уведомлений**
15
+ 5. **Адаптивность** (drawer/modal)
16
+
17
+ ### ⚠️ Что требует улучшения
18
+
19
+ 1. **Надежность isPWA:** 3.8/5 — работает на iOS/Android, но есть проблемы на desktop
20
+ 2. **Дублирование кода:** `isStandalone()` определен дважды
21
+ 3. **Production logging:** ~20 консоль логов загрязняют production
22
+ 4. **Валидация VAPID:** слабая проверка может привести к runtime ошибкам
23
+ 5. **Архитектура контекстов:** неявная вложенность затрудняет поддержку
24
+
25
+ ---
26
+
27
+ ## Оценка надежности isPWA
28
+
29
+ | Платформа | Оценка | Комментарий |
30
+ |-----------|--------|-------------|
31
+ | **iOS Safari** | ⭐⭐⭐⭐⭐ | Отлично работает |
32
+ | **Android Chrome** | ⭐⭐⭐⭐⭐ | Отлично работает |
33
+ | **Desktop Chrome** | ⭐⭐⭐⭐ | Работает, но нужна проверка манифеста |
34
+ | **Safari macOS** | ⭐⭐⭐ | Требуется проверка платформы |
35
+ | **Edge cases** | ⭐⭐ | Chromium-браузеры не все покрыты |
36
+
37
+ **Общая оценка:** 3.8/5
38
+
39
+ ### Ключевые проблемы
40
+
41
+ ```typescript
42
+ // Текущая реализация
43
+ function isStandalone(): boolean {
44
+ const isStandaloneDisplay = window.matchMedia('(display-mode: standalone)').matches;
45
+ const isStandaloneNavigator = navigator.standalone === true;
46
+ return isStandaloneDisplay || isStandaloneNavigator;
47
+ }
48
+ ```
49
+
50
+ **Проблемы:**
51
+ - ❌ **Дублируется** в `useIsPWA.ts` и `useInstallPrompt.ts`
52
+ - ❌ **Нет fallback** для браузеров без `matchMedia`
53
+ - ❌ **False positive** на Safari macOS ("Add to Dock" определяется как mobile PWA)
54
+ - ❌ **Нет кеширования** — пересчитывается при каждом рендере
55
+
56
+ ---
57
+
58
+ ## Критические проблемы
59
+
60
+ ### 🔴 P0: Немедленно исправить
61
+
62
+ | # | Проблема | Влияние | Время | Риск |
63
+ |---|----------|---------|-------|------|
64
+ | 1 | Дублирование `isStandalone()` | Код поддержка | 1ч | Низкий |
65
+ | 2 | Production logging | UX, безопасность | 2ч | Низкий |
66
+ | 3 | Слабая VAPID валидация | Runtime ошибки | 2ч | Средний |
67
+
68
+ **Итого:** 5 часов работы, низкий риск
69
+
70
+ ### 🟡 P1: В ближайшее время
71
+
72
+ | # | Проблема | Влияние | Время | Риск |
73
+ |---|----------|---------|-------|------|
74
+ | 4 | Запутанная архитектура контекстов | Код поддержка | 1д | Высокий |
75
+ | 5 | False positive isPWA на desktop | UX | 4ч | Средний |
76
+ | 6 | Отсутствие мемоизации | Производительность | 3ч | Низкий |
77
+
78
+ **Итого:** 2 дня работы
79
+
80
+ ### 🟢 P2: По возможности
81
+
82
+ | # | Улучшение | Влияние | Время |
83
+ |---|-----------|---------|-------|
84
+ | 7 | Lazy loading | Bundle size -22% | 2ч |
85
+ | 8 | Unit/E2E тесты | Качество | 2д |
86
+ | 9 | Улучшенная документация | Developer experience | 1д |
87
+
88
+ **Итого:** 3-4 дня работы
89
+
90
+ ---
91
+
92
+ ## Рекомендуемый план действий
93
+
94
+ ### Фаза 1: Быстрые победы (неделя 1)
95
+
96
+ **Цель:** Устранить критические проблемы с минимальным риском
97
+
98
+ **Действия:**
99
+ 1. Создать `utils/platform.ts` с единой реализацией `isStandalone()`
100
+ 2. Создать `utils/logger.ts` для условного логирования
101
+ 3. Улучшить валидацию VAPID ключа
102
+
103
+ **Результат:**
104
+ - ✅ Устранено дублирование
105
+ - ✅ Чистая production консоль
106
+ - ✅ Надежная обработка ошибок
107
+
108
+ **Ресурсы:** 1 разработчик, 5 часов
109
+
110
+ ### Фаза 2: Рефакторинг (недели 2-3)
111
+
112
+ **Цель:** Улучшить архитектуру и надежность
113
+
114
+ **Действия:**
115
+ 1. Разделить `useInstallPrompt` на специализированные хуки
116
+ 2. Упростить композицию контекстов
117
+ 3. Добавить надежную проверку isPWA для desktop
118
+ 4. Добавить мемоизацию и кеширование
119
+
120
+ **Результат:**
121
+ - ✅ Чистая архитектура
122
+ - ✅ Надежное определение isPWA (4.8/5)
123
+ - ✅ Лучшая производительность
124
+
125
+ **Ресурсы:** 1 разработчик, 2 недели
126
+
127
+ ### Фаза 3: Качество (неделя 4)
128
+
129
+ **Цель:** Долгосрочная поддержка
130
+
131
+ **Действия:**
132
+ 1. Написать unit тесты
133
+ 2. Добавить E2E тесты
134
+ 3. Улучшить документацию
135
+ 4. Добавить migration guide
136
+
137
+ **Результат:**
138
+ - ✅ Покрытие тестами
139
+ - ✅ Документация для миграции
140
+ - ✅ Примеры использования
141
+
142
+ **Ресурсы:** 1 разработчик, 1 неделя
143
+
144
+ ---
145
+
146
+ ## ROI (Return on Investment)
147
+
148
+ ### Затраты
149
+ - **Время:** 4 недели (1 разработчик)
150
+ - **Риск:** Средний (требует тестирования)
151
+ - **Breaking changes:** Минимальные (с deprecation period)
152
+
153
+ ### Выгоды
154
+
155
+ #### Немедленные (после Фазы 1):
156
+ - ✅ Чище код база (-дублирование)
157
+ - ✅ Лучше UX (нет console spam)
158
+ - ✅ Меньше runtime ошибок
159
+
160
+ #### Средний срок (после Фазы 2):
161
+ - ✅ Проще поддерживать код
162
+ - ✅ Меньше багов
163
+ - ✅ Быстрее загрузка (-22% bundle)
164
+ - ✅ Надежнее определение PWA
165
+
166
+ #### Долгий срок (после Фазы 3):
167
+ - ✅ Автоматические тесты
168
+ - ✅ Документированные best practices
169
+ - ✅ Легче онбординг новых разработчиков
170
+
171
+ ---
172
+
173
+ ## Метрики успеха
174
+
175
+ ### До рефакторинга:
176
+ - **isPWA надежность:** 3.8/5
177
+ - **Дублирование кода:** 2 места
178
+ - **Production logs:** ~20 на операцию
179
+ - **VAPID ошибки:** Неинформативные
180
+ - **Bundle size:** ~45KB
181
+ - **Test coverage:** 0%
182
+
183
+ ### После рефакторинга (цели):
184
+ - **isPWA надежность:** 4.8/5 ⬆️
185
+ - **Дублирование кода:** 0 ⬇️
186
+ - **Production logs:** 0 (только errors) ⬇️
187
+ - **VAPID ошибки:** Понятные с кодами ⬆️
188
+ - **Bundle size:** ~35KB ⬇️
189
+ - **Test coverage:** >80% ⬆️
190
+
191
+ ---
192
+
193
+ ## Риски и митигация
194
+
195
+ ### Риск 1: Breaking changes
196
+ **Вероятность:** Средняя
197
+ **Влияние:** Высокое
198
+ **Митигация:**
199
+ - Сохранить старый API с deprecation warnings
200
+ - Период миграции 6 месяцев
201
+ - Подробный migration guide
202
+
203
+ ### Риск 2: Регрессия в определении isPWA
204
+ **Вероятность:** Низкая
205
+ **Влияние:** Критическое
206
+ **Митигация:**
207
+ - Тестирование на реальных устройствах
208
+ - Unit тесты для всех edge cases
209
+ - Beta period перед релизом
210
+
211
+ ### Риск 3: Производительность
212
+ **Вероятность:** Очень низкая
213
+ **Влияние:** Среднее
214
+ **Митигация:**
215
+ - Benchmarks до и после
216
+ - Мемоизация и кеширование
217
+ - Lazy loading компонентов
218
+
219
+ ---
220
+
221
+ ## Рекомендация
222
+
223
+ ### ✅ **Одобряем рефакторинг**
224
+
225
+ **Обоснование:**
226
+ 1. Критические проблемы (P0) имеют низкий риск и высокую ценность
227
+ 2. ROI положительный уже после Фазы 1
228
+ 3. Долгосрочные выгоды значительны (поддержка, качество, производительность)
229
+ 4. Обратная совместимость сохраняется
230
+
231
+ **Условия:**
232
+ - Начать с Фазы 1 (низкий риск, быстрая отдача)
233
+ - Оценить результаты перед переходом к Фазе 2
234
+ - Обязательное тестирование на реальных устройствах
235
+ - Сохранить период миграции для breaking changes
236
+
237
+ ---
238
+
239
+ ## Дополнительные материалы
240
+
241
+ ### Документы
242
+ - [ARCHITECTURE_ANALYSIS.md](./ARCHITECTURE_ANALYSIS.md) — полный анализ
243
+ - [REFACTORING_PROPOSALS.md](./REFACTORING_PROPOSALS.md) — примеры кода
244
+ - [README.md](./README.md) — быстрый старт
245
+
246
+ ### Ресурсы
247
+ - [Web App Manifest Spec](https://www.w3.org/TR/appmanifest/)
248
+ - [PWA Best Practices](https://web.dev/pwa/)
249
+ - [Service Worker API](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)
250
+
251
+ ---
252
+
253
+ ## Вопросы?
254
+
255
+ **Q: Можно ли начать только с P0?**
256
+ A: Да, P0 независимы и дают быстрый результат.
257
+
258
+ **Q: Сломается ли текущий код?**
259
+ A: Нет при следовании стратегии миграции.
260
+
261
+ **Q: Как протестировать на iOS?**
262
+ A: BrowserStack или реальные устройства. См. секцию 7.2 в ARCHITECTURE_ANALYSIS.
263
+
264
+ **Q: Сколько времени на внедрение?**
265
+ A: Минимум — 5 часов (P0). Полностью — 4 недели.
266
+
267
+ ---
268
+
269
+ **Статус:** Готово к обсуждению
270
+ **Дата:** 2025-12-15
271
+ **Версия:** 1.0
@@ -0,0 +1,204 @@
1
+ # PWA Рефакторинг
2
+
3
+ Документация по анализу и предложениям по улучшению PWA снипетов.
4
+
5
+ ## Документы
6
+
7
+ ### 1. [ARCHITECTURE_ANALYSIS.md](./ARCHITECTURE_ANALYSIS.md)
8
+ **Комплексный анализ текущей архитектуры**
9
+
10
+ Содержит:
11
+ - ✅ Подробный анализ структуры файлов и компонентов
12
+ - ✅ **Детальное исследование надежности isPWA определения**
13
+ - ✅ Критические проблемы и их влияние
14
+ - ✅ Тестирование на реальных устройствах
15
+ - ✅ Рекомендации по улучшению
16
+ - ✅ План рефакторинга с приоритетами
17
+ - ✅ Стратегия миграции
18
+
19
+ **Читать первым для понимания проблем.**
20
+
21
+ ### 2. [REFACTORING_PROPOSALS.md](./REFACTORING_PROPOSALS.md)
22
+ **Конкретные предложения по рефакторингу с примерами кода**
23
+
24
+ Содержит 6 proposals:
25
+ 1. **Унификация isStandalone()** - устранение дублирования
26
+ 2. **Улучшенный isPWA с кешированием** - производительность
27
+ 3. **Production-ready логирование** - убрать debug из production
28
+ 4. **Валидация VAPID ключа** - безопасность
29
+ 5. **Разделение ответственности хуков** - чистая архитектура
30
+ 6. **Упрощение контекстов** - прозрачность
31
+
32
+ **Готовые примеры кода для имплементации.**
33
+
34
+ ## Краткое резюме
35
+
36
+ ### Оценка надежности isPWA
37
+
38
+ | Платформа | Оценка | Статус |
39
+ |-----------|--------|--------|
40
+ | **iOS Safari** | ⭐⭐⭐⭐⭐ | Отлично работает |
41
+ | **Android Chrome** | ⭐⭐⭐⭐⭐ | Отлично работает |
42
+ | **Desktop Chrome** | ⭐⭐⭐⭐ | Работает, нужна проверка манифеста |
43
+ | **Safari macOS** | ⭐⭐⭐ | Требуется проверка платформы |
44
+ | **Edge cases** | ⭐⭐ | Не все покрыты |
45
+
46
+ **Общая оценка:** 3.8/5
47
+
48
+ ### Критические проблемы
49
+
50
+ 1. 🔴 **Дублирование кода** `isStandalone()` в 2 местах
51
+ 2. 🔴 **Production logging** ~20 консоль логов в production
52
+ 3. 🔴 **Слабая VAPID валидация** может привести к runtime ошибкам
53
+ 4. 🟡 **Запутанная архитектура контекстов** трудно поддерживать
54
+ 5. 🟡 **False positive на desktop** Safari macOS определяется как mobile PWA
55
+
56
+ ### Рекомендации
57
+
58
+ #### Немедленно (P0):
59
+ - Устранить дублирование `isStandalone()`
60
+ - Убрать diagnostic logging из production
61
+ - Улучшить валидацию VAPID ключа
62
+
63
+ #### В ближайшее время (P1):
64
+ - Рефакторинг архитектуры контекстов
65
+ - Улучшить isPWA для desktop браузеров
66
+ - Добавить мемоизацию platform detection
67
+
68
+ #### По возможности (P2):
69
+ - Lazy loading компонентов
70
+ - Unit и E2E тесты
71
+ - Улучшенная документация
72
+
73
+ ## Как использовать эту документацию
74
+
75
+ ### Для разработчиков
76
+ 1. Прочитайте **ARCHITECTURE_ANALYSIS.md** для понимания проблем
77
+ 2. Изучите **REFACTORING_PROPOSALS.md** для решений
78
+ 3. Выберите proposals по приоритету
79
+ 4. Имплементируйте с примерами кода из документов
80
+
81
+ ### Для ревьюверов
82
+ 1. Используйте контрольный список из секции 5.4 ARCHITECTURE_ANALYSIS
83
+ 2. Проверьте обратную совместимость
84
+ 3. Убедитесь, что тесты покрывают изменения
85
+
86
+ ### Для менеджеров
87
+ 1. **Roadmap** в ARCHITECTURE_ANALYSIS.md секция 5.2
88
+ 2. **Оценка времени** для каждой фазы
89
+ 3. **Риски** для каждого изменения
90
+
91
+ ## Ключевые улучшения isPWA
92
+
93
+ ### Текущая реализация
94
+ ```typescript
95
+ function isStandalone(): boolean {
96
+ const isStandaloneDisplay = window.matchMedia('(display-mode: standalone)').matches;
97
+ const isStandaloneNavigator = navigator.standalone === true;
98
+ return isStandaloneDisplay || isStandaloneNavigator;
99
+ }
100
+ ```
101
+
102
+ **Проблемы:**
103
+ - ❌ Дублируется в 2 местах
104
+ - ❌ Нет fallback для старых браузеров
105
+ - ❌ False positive на desktop (Safari macOS)
106
+ - ❌ Нет кеширования
107
+
108
+ ### Предлагаемая реализация
109
+ ```typescript
110
+ // utils/platform.ts - единая утилита
111
+ export function isStandalone(): boolean {
112
+ if (typeof window === 'undefined') return false;
113
+
114
+ // Fallback для старых браузеров
115
+ if (!window.matchMedia) {
116
+ return navigator.standalone === true;
117
+ }
118
+
119
+ const isStandaloneDisplay = window.matchMedia('(display-mode: standalone)').matches;
120
+ const isStandaloneNavigator = navigator.standalone === true;
121
+
122
+ return isStandaloneDisplay || isStandaloneNavigator;
123
+ }
124
+
125
+ // Надежная версия с проверкой платформы
126
+ export function isStandaloneReliable(): boolean {
127
+ const standalone = isStandalone();
128
+ if (!standalone) return false;
129
+
130
+ // Для desktop дополнительно проверяем манифест
131
+ if (!isMobileDevice()) {
132
+ return hasValidManifest();
133
+ }
134
+
135
+ return true;
136
+ }
137
+
138
+ // hooks/useIsPWA.ts - с кешированием
139
+ export function useIsPWA(options?: { reliable?: boolean }): boolean {
140
+ const [isPWA, setIsPWA] = useState(() => {
141
+ // Кеш из sessionStorage
142
+ const cached = sessionStorage.getItem('pwa_is_standalone');
143
+ if (cached) return cached === 'true';
144
+
145
+ return options?.reliable
146
+ ? isStandaloneReliable()
147
+ : isStandalone();
148
+ });
149
+
150
+ // ... rest with cache updates
151
+ }
152
+ ```
153
+
154
+ **Преимущества:**
155
+ - ✅ Единая реализация (DRY)
156
+ - ✅ Fallback для старых браузеров
157
+ - ✅ Надежная проверка для desktop
158
+ - ✅ Кеширование для производительности
159
+ - ✅ Опциональная строгая проверка
160
+
161
+ ## Вопросы и ответы
162
+
163
+ ### Q: Какой приоритет у этих изменений?
164
+ **A:** См. секцию 5.1 в ARCHITECTURE_ANALYSIS.md. Критические (P0) изменения должны быть выполнены немедленно.
165
+
166
+ ### Q: Сломает ли рефакторинг существующий код?
167
+ **A:** Нет, если следовать стратегии миграции из секции 5.4. Предусмотрен deprecation period.
168
+
169
+ ### Q: Как протестировать изменения?
170
+ **A:** Используйте unit тесты из REFACTORING_PROPOSALS.md секция 4.4.1.
171
+
172
+ ### Q: Можно ли внедрять proposals по отдельности?
173
+ **A:** Да, proposals 1-4 независимы. Proposals 5-6 требуют больше изменений и должны внедряться вместе.
174
+
175
+ ## Метрики для отслеживания
176
+
177
+ После внедрения отслеживайте:
178
+
179
+ 1. **Bundle size**
180
+ - До: ~45KB (PWA snippets)
181
+ - Цель: ~35KB (-22% с lazy loading)
182
+
183
+ 2. **Initial render time**
184
+ - До: platform detection при каждом рендере
185
+ - Цель: мемоизация, кеш в sessionStorage
186
+
187
+ 3. **Console logs в production**
188
+ - До: ~20 логов на каждую операцию
189
+ - Цель: 0 (только errors)
190
+
191
+ 4. **False positive rate для isPWA**
192
+ - До: ~5% (desktop browsers)
193
+ - Цель: <1% (с reliable check)
194
+
195
+ ## Контакты
196
+
197
+ При вопросах:
198
+ 1. Изучите документы в этой директории
199
+ 2. Проверьте research.md в родительской директории
200
+ 3. Создайте issue с тегом `pwa-refactoring`
201
+
202
+ ---
203
+
204
+ **Последнее обновление:** 2025-12-15