Add phone number validation in message view models and update UI to display error messages
This commit is contained in:
parent
0ee468ef8c
commit
ce2fdba811
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using CommunityToolkit.Maui.Core.Extensions;
|
using CommunityToolkit.Maui.Core.Extensions;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
@ -28,6 +29,13 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
private readonly IFavouriteService _favouriteService;
|
private readonly IFavouriteService _favouriteService;
|
||||||
private string _conversationId;
|
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);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Erstellt eine Instanz
|
/// Erstellt eine Instanz
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -50,6 +58,40 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
_favouriteService = favouriteService;
|
_favouriteService = favouriteService;
|
||||||
Title = Text.View_Title_Messages;
|
Title = Text.View_Title_Messages;
|
||||||
SelectedMenu = MenuSelected.Messages;
|
SelectedMenu = MenuSelected.Messages;
|
||||||
|
|
||||||
|
// PropertyChanged Event für Message registrieren
|
||||||
|
PropertyChanged += OnPropertyChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler für PropertyChanged Events
|
||||||
|
/// </summary>
|
||||||
|
private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.PropertyName == nameof(Message))
|
||||||
|
{
|
||||||
|
ValidateForPhoneNumbers(Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Validiert den Text auf Telefonnummern
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text">Zu validierender Text</param>
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -84,6 +126,18 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _message;
|
private string _message;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gibt an, ob eine Telefonnummer im Text erkannt wurde
|
||||||
|
/// </summary>
|
||||||
|
[ObservableProperty]
|
||||||
|
private bool _hasPhoneNumber;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fehlermeldung für Telefonnummer-Validierung
|
||||||
|
/// </summary>
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _phoneNumberErrorMessage;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wird pull to refresh ausgeführt?
|
/// Wird pull to refresh ausgeführt?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -98,7 +152,7 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
public async Task Send()
|
public async Task Send()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(Message))
|
if (!string.IsNullOrWhiteSpace(Message) && !HasPhoneNumber)
|
||||||
{
|
{
|
||||||
IsBusy = true;
|
IsBusy = true;
|
||||||
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);
|
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using CommunityToolkit.Maui.Core.Extensions;
|
using CommunityToolkit.Maui.Core.Extensions;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
@ -30,6 +31,13 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
private readonly IFavouriteService _favouriteService;
|
private readonly IFavouriteService _favouriteService;
|
||||||
private string _conversationId;
|
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);
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Erstellt eine Instanz
|
/// Erstellt eine Instanz
|
||||||
@ -53,6 +61,40 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
_favouriteService = favouriteService;
|
_favouriteService = favouriteService;
|
||||||
Title = Text.View_Title_Messages;
|
Title = Text.View_Title_Messages;
|
||||||
SelectedMenu = MenuSelected.Messages;
|
SelectedMenu = MenuSelected.Messages;
|
||||||
|
|
||||||
|
// PropertyChanged Event für Message registrieren
|
||||||
|
PropertyChanged += OnPropertyChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handler für PropertyChanged Events
|
||||||
|
/// </summary>
|
||||||
|
private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.PropertyName == nameof(Message))
|
||||||
|
{
|
||||||
|
ValidateForPhoneNumbers(Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Validiert den Text auf Telefonnummern
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text">Zu validierender Text</param>
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -87,6 +129,18 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _message;
|
private string _message;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gibt an, ob eine Telefonnummer im Text erkannt wurde
|
||||||
|
/// </summary>
|
||||||
|
[ObservableProperty]
|
||||||
|
private bool _hasPhoneNumber;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fehlermeldung für Telefonnummer-Validierung
|
||||||
|
/// </summary>
|
||||||
|
[ObservableProperty]
|
||||||
|
private string _phoneNumberErrorMessage;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wird pull to refresh ausgeführt?
|
/// Wird pull to refresh ausgeführt?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -101,7 +155,7 @@ namespace gehGassiApp.ViewModels.Messages
|
|||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
public async Task Send()
|
public async Task Send()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(Message))
|
if (!string.IsNullOrWhiteSpace(Message) && !HasPhoneNumber)
|
||||||
{
|
{
|
||||||
IsBusy = true;
|
IsBusy = true;
|
||||||
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);
|
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
</controls:BaseContentPage.TitleView>
|
</controls:BaseContentPage.TitleView>
|
||||||
|
|
||||||
<ContentPage.Content>
|
<ContentPage.Content>
|
||||||
<Grid RowDefinitions="*,Auto" HorizontalOptions="Fill" VerticalOptions="FillAndExpand" Padding="20,10,20,0" RowSpacing="0">
|
<Grid RowDefinitions="*,Auto,Auto" HorizontalOptions="Fill" VerticalOptions="FillAndExpand" Padding="20,10,20,0" RowSpacing="0">
|
||||||
|
|
||||||
<Grid Grid.Row="0" VerticalOptions="FillAndExpand" HorizontalOptions="Fill">
|
<Grid Grid.Row="0" VerticalOptions="FillAndExpand" HorizontalOptions="Fill">
|
||||||
<CollectionView x:Name="messages" ItemsSource="{Binding Messages}" ItemTemplate="{StaticResource MessageIosDataTemplateSelector}" HorizontalOptions="Fill" VerticalOptions="Fill"
|
<CollectionView x:Name="messages" ItemsSource="{Binding Messages}" ItemTemplate="{StaticResource MessageIosDataTemplateSelector}" HorizontalOptions="Fill" VerticalOptions="Fill"
|
||||||
@ -54,11 +54,21 @@
|
|||||||
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
|
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
|
||||||
<Binding Source="{x:Reference notEmptyValidation}" Path="IsValid"></Binding>
|
<Binding Source="{x:Reference notEmptyValidation}" Path="IsValid"></Binding>
|
||||||
<Binding Path="IsBusy" Converter="{StaticResource InvertedBoolConverter}"></Binding>
|
<Binding Path="IsBusy" Converter="{StaticResource InvertedBoolConverter}"></Binding>
|
||||||
|
<Binding Path="HasPhoneNumber" Converter="{StaticResource InvertedBoolConverter}"></Binding>
|
||||||
</MultiBinding>
|
</MultiBinding>
|
||||||
</ImageButton.IsEnabled>
|
</ImageButton.IsEnabled>
|
||||||
</ImageButton>
|
</ImageButton>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
|
<!-- Fehlermeldung für Telefonnummer-Validierung -->
|
||||||
|
<Label Grid.Row="2"
|
||||||
|
Text="{Binding PhoneNumberErrorMessage}"
|
||||||
|
IsVisible="{Binding HasPhoneNumber}"
|
||||||
|
TextColor="Red"
|
||||||
|
FontSize="12"
|
||||||
|
Margin="0,5,0,0"
|
||||||
|
HorizontalOptions="Fill" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</ContentPage.Content>
|
</ContentPage.Content>
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<ContentPage.Content>
|
<ContentPage.Content>
|
||||||
|
|
||||||
<Grid RowDefinitions="*,Auto" Padding="20" RowSpacing="20" HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
|
<Grid RowDefinitions="*,Auto,Auto" Padding="20" RowSpacing="20" HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
|
||||||
<RefreshView Grid.Row="0" IsRefreshing="{Binding IsRefreshing}" Command="{Binding RefreshCommand}">
|
<RefreshView Grid.Row="0" IsRefreshing="{Binding IsRefreshing}" Command="{Binding RefreshCommand}">
|
||||||
<Grid HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
|
<Grid HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
|
||||||
<CollectionView x:Name="messages" ItemsSource="{Binding MessageGroups}" ItemTemplate="{StaticResource MessageDataTemplateSelector}" HorizontalOptions="Fill" IsGrouped="True"
|
<CollectionView x:Name="messages" ItemsSource="{Binding MessageGroups}" ItemTemplate="{StaticResource MessageDataTemplateSelector}" HorizontalOptions="Fill" IsGrouped="True"
|
||||||
@ -59,11 +59,21 @@
|
|||||||
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
|
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
|
||||||
<Binding Source="{x:Reference notEmptyValidation}" Path="IsValid"></Binding>
|
<Binding Source="{x:Reference notEmptyValidation}" Path="IsValid"></Binding>
|
||||||
<Binding Path="IsBusy" Converter="{StaticResource InvertedBoolConverter}"></Binding>
|
<Binding Path="IsBusy" Converter="{StaticResource InvertedBoolConverter}"></Binding>
|
||||||
|
<Binding Path="HasPhoneNumber" Converter="{StaticResource InvertedBoolConverter}"></Binding>
|
||||||
</MultiBinding>
|
</MultiBinding>
|
||||||
</ImageButton.IsEnabled>
|
</ImageButton.IsEnabled>
|
||||||
</ImageButton>
|
</ImageButton>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
|
|
||||||
|
<!-- Fehlermeldung für Telefonnummer-Validierung -->
|
||||||
|
<Label Grid.Row="2"
|
||||||
|
Text="{Binding PhoneNumberErrorMessage}"
|
||||||
|
IsVisible="{Binding HasPhoneNumber}"
|
||||||
|
TextColor="Red"
|
||||||
|
FontSize="12"
|
||||||
|
Margin="0,5,0,0"
|
||||||
|
HorizontalOptions="Fill" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</ContentPage.Content>
|
</ContentPage.Content>
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user