From 7745bb2614ae3b0d1578c5bed6769a320a59d20a Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Sun, 14 Jun 2026 23:04:23 +0300 Subject: [PATCH] save score --- src/sqlite-manager.ts | 2 -- src/training.ts | 10 ++++++++++ vite.config.ts | 45 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/sqlite-manager.ts b/src/sqlite-manager.ts index ddaa93b..f1fe4fa 100644 --- a/src/sqlite-manager.ts +++ b/src/sqlite-manager.ts @@ -1,5 +1,3 @@ -import DbWorker from './db-worker.ts?worker'; - // ----- Прокси к Worker ----- let worker: Worker | null = null; diff --git a/src/training.ts b/src/training.ts index e5a6059..6b1e137 100644 --- a/src/training.ts +++ b/src/training.ts @@ -103,6 +103,16 @@ export class TrainingPage { const word = this.words.find((w) => w.id === result.word.id); if (!word) return; + // Обновляем дату последнего открытия в БД + const stat = this.cardSet.set[this.cardSet.currentWordIndex!]; + if (stat) { + const now = Math.floor(Date.now() / 1000); + stat.last_open = Date.now(); // обновляем в памяти из алгоритма + updateCardStat(stat.id, stat.score, now).catch((err) => + console.error('[Training] Ошибка сохранения last_opened:', err), + ); + } + this.renderSide(word, this.forwardFields, this.backwardFields, false); this.renderActions(false); } diff --git a/vite.config.ts b/vite.config.ts index 94a4026..e96d516 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,51 @@ import { defineConfig } from 'vite'; import basicSsl from '@vitejs/plugin-basic-ssl'; // npm i -D @vitejs/plugin-basic-ssl +import { VitePWA } from 'vite-plugin-pwa'; export default defineConfig({ - plugins: [basicSsl()], // Добавит локальный HTTPS + plugins: [basicSsl(), + VitePWA({ + registerType: 'autoUpdate', // Автоматически обновлять SW при изменении кода + includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'masked-icon.svg'], + manifest: { + name: 'Мое PWA Приложение', + short_name: 'Моё PWA', + description: 'Описание моего приложения, работающего оффлайн', + theme_color: '#ffffff', + background_color: '#ffffff', + display: 'standalone', // Важно для открытия без интерфейса браузера + scope: '/', + start_url: '/', + // Иконки обязательны для iOS и Android. Минимум 192x192 и 512x512 + icons: [ + { + src: 'pwa-192x192.png', + sizes: '192x192', + type: 'image/png' + }, + { + src: 'pwa-512x512.png', + sizes: '512x512', + type: 'image/png' + }, + { + src: 'pwa-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any maskable' // Для адаптивных иконок Android + } + ] + }, + workbox: { + // Стратегия кэширования для оффлайн-работы + globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'], + // Если пользователь оффлайн и переходит по роуту, отдаем index.html + navigateFallback: '/index.html', + // Игнорируем запросы к API или внешним ресурсам, если они не должны кэшироваться + navigateFallbackDenylist: [/^\/api\//], + } + }) + ], // Добавит локальный HTTPS build: { target: 'esnext',