diff --git a/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesIosViewModel.cs b/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesIosViewModel.cs index 7be6fb0..699066c 100644 --- a/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesIosViewModel.cs +++ b/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesIosViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.ObjectModel; +using System.Text.RegularExpressions; using System.Web; using CommunityToolkit.Maui.Core.Extensions; using CommunityToolkit.Mvvm.ComponentModel; @@ -28,6 +29,13 @@ namespace gehGassiApp.ViewModels.Messages private readonly IFavouriteService _favouriteService; private string _conversationId; + // Regex pattern für Telefonnummer-Erkennung + private static readonly Regex PhoneNumberRegex = new Regex( + @"(\+\d{1,4}[\s\-\(\)]*(?:\(0\)[\s\-]*)?[\d\s\-\(\)\/]{7,15})|" + // Internationale Nummern mit Ländercode + @"(0\d{2,5}[\s\-\/]*\d{4,12})|" + // Deutsche Festnetz-/Mobilnummern + @"(\d{10,15})", // Reine Zahlenketten (10-15 Ziffern) + RegexOptions.Compiled | RegexOptions.IgnoreCase); + /// /// Erstellt eine Instanz /// @@ -50,6 +58,40 @@ namespace gehGassiApp.ViewModels.Messages _favouriteService = favouriteService; Title = Text.View_Title_Messages; SelectedMenu = MenuSelected.Messages; + + // PropertyChanged Event für Message registrieren + PropertyChanged += OnPropertyChanged; + } + + /// + /// Handler für PropertyChanged Events + /// + private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(Message)) + { + ValidateForPhoneNumbers(Message); + } + } + + /// + /// Validiert den Text auf Telefonnummern + /// + /// Zu validierender Text + private void ValidateForPhoneNumbers(string text) + { + if (string.IsNullOrWhiteSpace(text)) + { + HasPhoneNumber = false; + PhoneNumberErrorMessage = string.Empty; + return; + } + + var hasPhone = PhoneNumberRegex.IsMatch(text); + HasPhoneNumber = hasPhone; + PhoneNumberErrorMessage = hasPhone + ? "Aus Sicherheitsgründen können keine Telefonnummern geteilt werden. Bitte nutzen Sie unseren integrierten Messenger." + : string.Empty; } /// @@ -84,6 +126,18 @@ namespace gehGassiApp.ViewModels.Messages [ObservableProperty] private string _message; + /// + /// Gibt an, ob eine Telefonnummer im Text erkannt wurde + /// + [ObservableProperty] + private bool _hasPhoneNumber; + + /// + /// Fehlermeldung für Telefonnummer-Validierung + /// + [ObservableProperty] + private string _phoneNumberErrorMessage; + /// /// Wird pull to refresh ausgeführt? /// @@ -98,7 +152,7 @@ namespace gehGassiApp.ViewModels.Messages [RelayCommand] public async Task Send() { - if (!string.IsNullOrWhiteSpace(Message)) + if (!string.IsNullOrWhiteSpace(Message) && !HasPhoneNumber) { IsBusy = true; using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout); diff --git a/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesViewModel.cs b/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesViewModel.cs index 23e686f..813648a 100644 --- a/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesViewModel.cs +++ b/gehGassiApp/gehGassiApp/ViewModels/Messages/MessagesViewModel.cs @@ -1,4 +1,5 @@ using System.Collections.ObjectModel; +using System.Text.RegularExpressions; using System.Web; using CommunityToolkit.Maui.Core.Extensions; using CommunityToolkit.Mvvm.ComponentModel; @@ -30,6 +31,13 @@ namespace gehGassiApp.ViewModels.Messages private readonly IFavouriteService _favouriteService; private string _conversationId; + // Regex pattern für Telefonnummer-Erkennung + private static readonly Regex PhoneNumberRegex = new Regex( + @"(\+\d{1,4}[\s\-\(\)]*(?:\(0\)[\s\-]*)?[\d\s\-\(\)\/]{7,15})|" + // Internationale Nummern mit Ländercode + @"(0\d{2,5}[\s\-\/]*\d{4,12})|" + // Deutsche Festnetz-/Mobilnummern + @"(\d{10,15})", // Reine Zahlenketten (10-15 Ziffern) + RegexOptions.Compiled | RegexOptions.IgnoreCase); + /// /// Erstellt eine Instanz @@ -53,6 +61,40 @@ namespace gehGassiApp.ViewModels.Messages _favouriteService = favouriteService; Title = Text.View_Title_Messages; SelectedMenu = MenuSelected.Messages; + + // PropertyChanged Event für Message registrieren + PropertyChanged += OnPropertyChanged; + } + + /// + /// Handler für PropertyChanged Events + /// + private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(Message)) + { + ValidateForPhoneNumbers(Message); + } + } + + /// + /// Validiert den Text auf Telefonnummern + /// + /// Zu validierender Text + private void ValidateForPhoneNumbers(string text) + { + if (string.IsNullOrWhiteSpace(text)) + { + HasPhoneNumber = false; + PhoneNumberErrorMessage = string.Empty; + return; + } + + var hasPhone = PhoneNumberRegex.IsMatch(text); + HasPhoneNumber = hasPhone; + PhoneNumberErrorMessage = hasPhone + ? "Aus Sicherheitsgründen können keine Telefonnummern geteilt werden. Bitte nutzen Sie unseren integrierten Messenger." + : string.Empty; } /// @@ -87,6 +129,18 @@ namespace gehGassiApp.ViewModels.Messages [ObservableProperty] private string _message; + /// + /// Gibt an, ob eine Telefonnummer im Text erkannt wurde + /// + [ObservableProperty] + private bool _hasPhoneNumber; + + /// + /// Fehlermeldung für Telefonnummer-Validierung + /// + [ObservableProperty] + private string _phoneNumberErrorMessage; + /// /// Wird pull to refresh ausgeführt? /// @@ -101,7 +155,7 @@ namespace gehGassiApp.ViewModels.Messages [RelayCommand] public async Task Send() { - if (!string.IsNullOrWhiteSpace(Message)) + if (!string.IsNullOrWhiteSpace(Message) && !HasPhoneNumber) { IsBusy = true; using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout); diff --git a/gehGassiApp/gehGassiApp/Views/Messages/MessagesIosView.xaml b/gehGassiApp/gehGassiApp/Views/Messages/MessagesIosView.xaml index 30c14e4..f80d75e 100644 --- a/gehGassiApp/gehGassiApp/Views/Messages/MessagesIosView.xaml +++ b/gehGassiApp/gehGassiApp/Views/Messages/MessagesIosView.xaml @@ -17,7 +17,7 @@ - + + + + + diff --git a/gehGassiApp/gehGassiApp/Views/Messages/MessagesView.xaml b/gehGassiApp/gehGassiApp/Views/Messages/MessagesView.xaml index 6578a28..5cf3ae1 100644 --- a/gehGassiApp/gehGassiApp/Views/Messages/MessagesView.xaml +++ b/gehGassiApp/gehGassiApp/Views/Messages/MessagesView.xaml @@ -19,7 +19,7 @@ - + + + + +