From 63857e18291ec31589e34fdad23684eafcaac0f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Nagy?= Date: Mon, 13 Apr 2026 14:26:45 +0200 Subject: [PATCH] #EX-80: Add PWA support for mobile app-like experience --- frontend/Exence/angular.json | 3 ++- frontend/Exence/ngsw-config.json | 21 +++++++++++++++ frontend/Exence/package-lock.json | 21 +++++++++++++++ frontend/Exence/package.json | 1 + frontend/Exence/src/app/app.config.ts | 5 ++++ .../Exence/src/assets/icons/icon-192x192.png | Bin 0 -> 13833 bytes .../Exence/src/assets/icons/icon-512x512.png | Bin 0 -> 33795 bytes frontend/Exence/src/index.html | 8 +++++- frontend/Exence/src/manifest.webmanifest | 24 ++++++++++++++++++ frontend/Exence/src/styles/styles.scss | 13 ++++++++++ 10 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 frontend/Exence/ngsw-config.json create mode 100644 frontend/Exence/src/assets/icons/icon-192x192.png create mode 100644 frontend/Exence/src/assets/icons/icon-512x512.png create mode 100644 frontend/Exence/src/manifest.webmanifest diff --git a/frontend/Exence/angular.json b/frontend/Exence/angular.json index b909a38f..ee1edbd3 100644 --- a/frontend/Exence/angular.json +++ b/frontend/Exence/angular.json @@ -22,7 +22,7 @@ "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "scss", - "assets": ["src/assets"], + "assets": ["src/assets", { "glob": "manifest.webmanifest", "input": "src", "output": "/" }], "styles": ["src/styles/styles.scss"], "scripts": ["node_modules/apexcharts/dist/apexcharts.min.js"], "stylePreprocessorOptions": { @@ -33,6 +33,7 @@ }, "configurations": { "production": { + "serviceWorker": "ngsw-config.json", "budgets": [ { "type": "initial", diff --git a/frontend/Exence/ngsw-config.json b/frontend/Exence/ngsw-config.json new file mode 100644 index 00000000..b4f5aa44 --- /dev/null +++ b/frontend/Exence/ngsw-config.json @@ -0,0 +1,21 @@ +{ + "$schema": "./node_modules/@angular/service-worker/config/schema.json", + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": ["/favicon.ico", "/index.html", "/manifest.webmanifest", "/*.css", "/*.js"] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": ["/assets/**", "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"] + } + } + ] +} diff --git a/frontend/Exence/package-lock.json b/frontend/Exence/package-lock.json index 91b4d98d..5e7b2d3b 100644 --- a/frontend/Exence/package-lock.json +++ b/frontend/Exence/package-lock.json @@ -19,6 +19,7 @@ "@angular/platform-browser": "^21.0.1", "@angular/platform-browser-dynamic": "^21.0.1", "@angular/router": "^21.0.1", + "@angular/service-worker": "^21.1.3", "@ngrx/signals": "^21.0.1", "angular-gridster2": "^21.0.1", "apexcharts": "^5.6.0", @@ -881,6 +882,26 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/service-worker": { + "version": "21.1.3", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-21.1.3.tgz", + "integrity": "sha512-5qJD2JsFLn9H1BMQvEUzfKZhX7oMkgYRTfuPbQuyuxfR9U8M5EYifRqOtAY6xyIUDjnn0FOS6dqMPOq49DGAog==", + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "bin": { + "ngsw-config": "ngsw-config.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "21.1.3", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", diff --git a/frontend/Exence/package.json b/frontend/Exence/package.json index b242d57c..023f5796 100644 --- a/frontend/Exence/package.json +++ b/frontend/Exence/package.json @@ -30,6 +30,7 @@ "@angular/platform-browser": "^21.0.1", "@angular/platform-browser-dynamic": "^21.0.1", "@angular/router": "^21.0.1", + "@angular/service-worker": "^21.1.3", "@ngrx/signals": "^21.0.1", "angular-gridster2": "^21.0.1", "apexcharts": "^5.6.0", diff --git a/frontend/Exence/src/app/app.config.ts b/frontend/Exence/src/app/app.config.ts index 04366297..39c0608f 100644 --- a/frontend/Exence/src/app/app.config.ts +++ b/frontend/Exence/src/app/app.config.ts @@ -1,5 +1,6 @@ import { provideHttpClient, withInterceptors } from '@angular/common/http'; import { ApplicationConfig, importProvidersFrom, provideZonelessChangeDetection, isDevMode } from '@angular/core'; +import { provideServiceWorker } from '@angular/service-worker'; import { provideRouter } from '@angular/router'; import { LayoutModule } from '@angular/cdk/layout'; @@ -42,6 +43,10 @@ export const appConfig: ApplicationConfig = { provideDateFnsAdapter(), CookieService, provideHttpClient(), + provideServiceWorker('ngsw-worker.js', { + enabled: !isDevMode(), + registrationStrategy: 'registerWhenStable:30000', + }), provideTransloco({ config: { availableLangs: ['hu', 'en', 'de', 'es', 'fr', 'it', 'pl', 'sk'], diff --git a/frontend/Exence/src/assets/icons/icon-192x192.png b/frontend/Exence/src/assets/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..2388d23596ed63e6ebacf6798d79c85f336077b6 GIT binary patch literal 13833 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

~KhspJD$8=@d;N!>0Veo3W8XjCR=BIrWX4uaPuz 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 - + + + + + + + Exence diff --git a/frontend/Exence/src/manifest.webmanifest b/frontend/Exence/src/manifest.webmanifest new file mode 100644 index 00000000..4410b815 --- /dev/null +++ b/frontend/Exence/src/manifest.webmanifest @@ -0,0 +1,24 @@ +{ + "name": "Exence", + "short_name": "Exence", + "description": "Personal finance tracker", + "start_url": "/", + "display": "standalone", + "orientation": "portrait", + "background_color": "#121212", + "theme_color": "#121212", + "icons": [ + { + "src": "assets/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable any" + }, + { + "src": "assets/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable any" + } + ] +} diff --git a/frontend/Exence/src/styles/styles.scss b/frontend/Exence/src/styles/styles.scss index 40c9d624..f0e14e8c 100644 --- a/frontend/Exence/src/styles/styles.scss +++ b/frontend/Exence/src/styles/styles.scss @@ -50,6 +50,19 @@ body { margin: 0; text-align: left; height: 100%; + overscroll-behavior: none; +} + +@media (pointer: coarse) { + * { + -webkit-tap-highlight-color: transparent; + } + + button, + a, + [role='button'] { + user-select: none; + } } a {