@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.
- package/package.json +5 -5
- package/src/layouts/AppLayout/BaseApp.tsx +31 -25
- package/src/layouts/shared/types.ts +36 -0
- package/src/snippets/McpChat/context/ChatContext.tsx +9 -0
- package/src/snippets/PWA/@docs/research.md +576 -0
- package/src/snippets/PWA/@refactoring/ARCHITECTURE_ANALYSIS.md +1179 -0
- package/src/snippets/PWA/@refactoring/EXECUTIVE_SUMMARY.md +271 -0
- package/src/snippets/PWA/@refactoring/README.md +204 -0
- package/src/snippets/PWA/@refactoring/REFACTORING_PROPOSALS.md +1109 -0
- package/src/snippets/PWA/@refactoring2/COMPARISON-WITH-NEXTJS.md +718 -0
- package/src/snippets/PWA/@refactoring2/P1-FIXES-COMPLETED.md +188 -0
- package/src/snippets/PWA/@refactoring2/POST-P0-ANALYSIS.md +362 -0
- package/src/snippets/PWA/@refactoring2/README.md +85 -0
- package/src/snippets/PWA/@refactoring2/RECOMMENDATIONS.md +1321 -0
- package/src/snippets/PWA/@refactoring2/REMAINING-ISSUES.md +557 -0
- package/src/snippets/PWA/README.md +387 -0
- package/src/snippets/PWA/components/A2HSHint.tsx +226 -0
- package/src/snippets/PWA/components/IOSGuide.tsx +29 -0
- package/src/snippets/PWA/components/IOSGuideDrawer.tsx +101 -0
- package/src/snippets/PWA/components/IOSGuideModal.tsx +101 -0
- package/src/snippets/PWA/components/PushPrompt.tsx +165 -0
- package/src/snippets/PWA/config.ts +20 -0
- package/src/snippets/PWA/context/DjangoPushContext.tsx +105 -0
- package/src/snippets/PWA/context/InstallContext.tsx +118 -0
- package/src/snippets/PWA/context/PushContext.tsx +156 -0
- package/src/snippets/PWA/hooks/useDjangoPush.ts +277 -0
- package/src/snippets/PWA/hooks/useInstallPrompt.ts +164 -0
- package/src/snippets/PWA/hooks/useIsPWA.ts +115 -0
- package/src/snippets/PWA/hooks/usePushNotifications.ts +205 -0
- package/src/snippets/PWA/index.ts +95 -0
- package/src/snippets/PWA/types/components.ts +101 -0
- package/src/snippets/PWA/types/index.ts +26 -0
- package/src/snippets/PWA/types/install.ts +38 -0
- package/src/snippets/PWA/types/platform.ts +29 -0
- package/src/snippets/PWA/types/push.ts +21 -0
- package/src/snippets/PWA/utils/localStorage.ts +203 -0
- package/src/snippets/PWA/utils/logger.ts +149 -0
- package/src/snippets/PWA/utils/platform.ts +151 -0
- package/src/snippets/PWA/utils/vapid.ts +226 -0
- 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
|