feat(pwa): свой сервис-воркер и включение уведомлений

Воркер теперь собирается через injectManifest: generateSW умеет только кэш, а
уведомление показывает именно воркер — страница при этом может быть закрыта.
Нажатие на уведомление переиспользует уже открытое окно, а не плодит второе.

Включение — строкой на главном экране, по нажатию. Не всплывающим окном на
входе: разрешение спрашивается один раз за установку, отказ браузер запоминает
навсегда, и потраченная впустую попытка закрывает канал. Если сервер уведомления
не настроил — разрешение не запрашиваем вовсе.

Отдельные тексты вместо молчания: на iPhone без установки на домашний экран
уведомления невозможны в принципе, и об этом сказано прямо.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 10:29:43 +10:00
co-authored by Claude Opus 5
parent 0a09570d98
commit 562a6d35fe
10 changed files with 345 additions and 5 deletions
+11 -1
View File
@@ -54,7 +54,17 @@ export default defineConfig(({ command, mode }) => {
},
plugins: [
react(),
VitePWA({ registerType: "autoUpdate", manifest: false, includeAssets: ["icons/*.png"] }),
// injectManifest, а не generateSW: воркер свой, потому что уведомления
// показывает он (см. src/sw.ts), а сгенерированный умеет только кэш.
VitePWA({
strategies: "injectManifest",
srcDir: "src",
filename: "sw.ts",
registerType: "autoUpdate",
manifest: false,
includeAssets: ["icons/*.png"],
injectManifest: { globPatterns: ["**/*.{js,css,html,png,svg,webmanifest}"] },
}),
],
resolve: { alias: { "@": path.resolve(__dirname, "src") } },
server: {