From e2ffc241311e38e62a896767f75cfcdeeb494fa3 Mon Sep 17 00:00:00 2001 From: Daniel Pichler Date: Fri, 26 Dec 2025 13:54:51 +0100 Subject: [PATCH] Refactor LoginViewModel to use IAppSettings; improve settings management and update dependency injection. --- Jugenddienst Stunden/MauiProgram.cs | 13 ++++---- .../ViewModels/LoginViewModel.cs | 32 ++++++++++++++----- Jugenddienst Stunden/Views/LoginPage.xaml.cs | 18 ++++++++--- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/Jugenddienst Stunden/MauiProgram.cs b/Jugenddienst Stunden/MauiProgram.cs index 98dadaa..f1b73de 100644 --- a/Jugenddienst Stunden/MauiProgram.cs +++ b/Jugenddienst Stunden/MauiProgram.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging; using ZXing.Net.Maui.Controls; using System.Net.Http; using Jugenddienst_Stunden.ViewModels; +using Jugenddienst_Stunden.Views; using System.Net; namespace Jugenddienst_Stunden; @@ -112,12 +113,12 @@ public static class MauiProgram { builder.Services.AddSingleton(); // DI: Views/ViewModels - builder.Services.AddTransient(); - builder.Services.AddTransient(); - builder.Services.AddTransient(); - builder.Services.AddTransient(); - builder.Services.AddTransient(); - builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); + builder.Services.AddTransient(); return builder.Build(); } diff --git a/Jugenddienst Stunden/ViewModels/LoginViewModel.cs b/Jugenddienst Stunden/ViewModels/LoginViewModel.cs index 0c26c6c..726abd0 100644 --- a/Jugenddienst Stunden/ViewModels/LoginViewModel.cs +++ b/Jugenddienst Stunden/ViewModels/LoginViewModel.cs @@ -11,6 +11,7 @@ namespace Jugenddienst_Stunden.ViewModels; public partial class LoginViewModel : ObservableObject { private readonly IAuthService _auth; private readonly IAlertService? _alerts; + private readonly IAppSettings _settings; private DateTime _lastDetectionTime = DateTime.MinValue; private readonly TimeSpan _detectionInterval = TimeSpan.FromSeconds(5); @@ -38,7 +39,7 @@ public partial class LoginViewModel : ObservableObject { private string? serverLabel; [ObservableProperty] - private string title = Preferences.Default.Get("name", "Nicht") + " " + Preferences.Default.Get("surname", "eingeloggt"); + private string title = "Nicht eingeloggt"; [ObservableProperty] private string? username; @@ -58,8 +59,9 @@ public partial class LoginViewModel : ObservableObject { // Explizite Command-Property für den QR-Scanner-Event, damit das Binding in XAML zuverlässig greift public IAsyncRelayCommand QrDetectedCommand { get; } - public LoginViewModel(IAuthService auth) { + public LoginViewModel(IAuthService auth, IAppSettings settings) { _auth = auth; + _settings = settings; // gespeicherte Präferenz für Logintyp laden var lt = Preferences.Default.Get("logintype", "qr"); @@ -68,22 +70,36 @@ public partial class LoginViewModel : ObservableObject { IsDetecting = !isManualMode; // Serveranzeige vorbereiten - var apiUrl = Preferences.Default.Get("apiUrl", string.Empty); - if (!string.IsNullOrWhiteSpace(apiUrl)) { - Server = apiUrl.Replace("/appapi", "").Replace("https://", "").Replace("http://", ""); - ServerLabel = "Server: " + Server; - } + RefreshSettings(); // Command initialisieren QrDetectedCommand = new AsyncRelayCommand(QrDetectedAsync); } // DI-Konstruktor: AlertService anbinden und Alerts an VM-Event weiterreichen (analog StundeViewModel) - internal LoginViewModel(IAuthService auth, IAlertService alertService) : this(auth) { + internal LoginViewModel(IAuthService auth, IAlertService alertService,IAppSettings settings) : this(auth,settings) { _alerts = alertService; + _settings = settings; if (alertService is not null) { alertService.AlertRaised += (s, msg) => AlertEvent?.Invoke(this, msg); } + RefreshSettings(); + } + + /// + /// Aktualisiert die Serveranzeige aus den aktuellen AppSettings. + /// + public void RefreshSettings() { + var apiUrl = _settings.ApiUrl; + if (!string.IsNullOrWhiteSpace(apiUrl)) { + Server = apiUrl.Replace("/appapi", "").Replace("https://", "").Replace("http://", ""); + ServerLabel = "Server: " + Server; + } else { + Server = string.Empty; + ServerLabel = "Server: Nicht konfiguriert"; + } + + Title = $"{_settings.Name} {_settings.Surname}"; } partial void OnIsManualModeChanged(bool value) { diff --git a/Jugenddienst Stunden/Views/LoginPage.xaml.cs b/Jugenddienst Stunden/Views/LoginPage.xaml.cs index 88199f0..9cb787b 100644 --- a/Jugenddienst Stunden/Views/LoginPage.xaml.cs +++ b/Jugenddienst Stunden/Views/LoginPage.xaml.cs @@ -11,7 +11,7 @@ namespace Jugenddienst_Stunden.Views; /// Die Loginseite mit dem Barcodescanner /// public partial class LoginPage : ContentPage { - + /// /// CTOR /// @@ -58,22 +58,30 @@ public partial class LoginPage : ContentPage { }; } - + protected override void OnDisappearing() { base.OnDisappearing(); barcodeScannerView.CameraLocation = CameraLocation.Front; - // IsDetecting wird via Binding vom ViewModel gesteuert + // Scanner deaktivieren, wenn Seite verlassen wird + if (BindingContext is LoginViewModel vm) { + vm.IsDetecting = false; + } } protected override void OnAppearing() { base.OnAppearing(); + + if (BindingContext is LoginViewModel vm) { + vm.RefreshSettings(); + // Scanner wieder aktivieren, wenn QR-Modus aktiv ist + vm.IsDetecting = !vm.IsManualMode; + } - // IsDetecting wird via Binding vom ViewModel gesteuert barcodeScannerView.CameraLocation = CameraLocation.Rear; } - + } \ No newline at end of file