Refactor subscription success popup handling and improve UI consistency across popups; add width request to buttons in Profile views.

This commit is contained in:
Max Mannstein 2025-10-05 12:43:56 +02:00
parent 7cfecb836f
commit ddaf7e0e28
6 changed files with 177 additions and 207 deletions

View File

@ -33,6 +33,7 @@ namespace gehGassiApp.ViewModels.Subscriptions
private readonly IDispatcher _dispatcher; private readonly IDispatcher _dispatcher;
private readonly IDialogService _dialogService; private readonly IDialogService _dialogService;
private readonly IPopupService _popupService; private readonly IPopupService _popupService;
private bool _hasShownSuccessPopupThisSession;
/// <summary> /// <summary>
/// ERstellt eine Instanz /// ERstellt eine Instanz
@ -209,15 +210,7 @@ namespace gehGassiApp.ViewModels.Subscriptions
await LoadAsync(); await LoadAsync();
if (MySubscriptions != null && MySubscriptions.Any()) if (MySubscriptions != null && MySubscriptions.Any())
{ {
var popupResult = await _popupService.ShowPopupAsync<SubscriptionSuccessPopup, SubscriptionSuccessResult>( await ShowSubscriptionSuccessPopupAsync(force: true);
Shell.Current
);
var result = popupResult.Result;
if (result != null && result.HasOpenedStrayz)
{
// User hat STRAYZ geöffnet
}
} }
} }
else else
@ -436,15 +429,27 @@ namespace gehGassiApp.ViewModels.Subscriptions
IsBusy = false; IsBusy = false;
if (MySubscriptions != null && MySubscriptions.Any()) if (MySubscriptions != null && MySubscriptions.Any())
{ {
var popupResult = await _popupService.ShowPopupAsync<SubscriptionSuccessPopup, SubscriptionSuccessResult>( await ShowSubscriptionSuccessPopupAsync();
Shell.Current }
); }
var result = popupResult.Result; private async Task ShowSubscriptionSuccessPopupAsync(bool force = false)
if (result != null && result.HasOpenedStrayz) {
{ if (_hasShownSuccessPopupThisSession && !force)
// User hat STRAYZ geöffnet {
} return;
}
var popupResult = await _popupService.ShowPopupAsync<SubscriptionSuccessPopup, SubscriptionSuccessResult>(
Shell.Current
);
_hasShownSuccessPopupThisSession = true;
var result = popupResult.Result;
if (result != null && result.HasOpenedStrayz)
{
// User hat STRAYZ geöffnet
} }
} }
@ -889,6 +894,8 @@ namespace gehGassiApp.ViewModels.Subscriptions
HasError = false; HasError = false;
ErrorMessage = string.Empty; ErrorMessage = string.Empty;
_hasShownSuccessPopupThisSession = false;
await TrackPageViewAsync("Subscriptions"); await TrackPageViewAsync("Subscriptions");
ShowSubscriptions = false; ShowSubscriptions = false;
@ -914,6 +921,8 @@ namespace gehGassiApp.ViewModels.Subscriptions
HasError = false; HasError = false;
ErrorMessage = string.Empty; ErrorMessage = string.Empty;
_hasShownSuccessPopupThisSession = false;
return base.DisappearingAsync(sender); return base.DisappearingAsync(sender);
} }

View File

@ -7,81 +7,74 @@
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups" xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups"
x:DataType="viewModels:AGBUpdatePopupViewModel" x:DataType="viewModels:AGBUpdatePopupViewModel"
CanBeDismissedByTappingOutsideOfPopup="False"> BackgroundColor="{AppThemeBinding Light={StaticResource Primary_White},
<!-- Popup Content --> Dark={StaticResource Primary_White_Dark}}"
<Border CanBeDismissedByTappingOutsideOfPopup="False"
VerticalOptions="Center">
<Grid
Padding="0" Padding="0"
BackgroundColor="White" RowDefinitions="Auto,*,Auto"
StrokeShape="RoundRectangle 16"
StrokeThickness="0"
WidthRequest="350"> WidthRequest="350">
<!-- Drop Shadow Effect --> <!-- Header -->
<Border.Shadow> <Border
<Shadow Grid.Row="0"
Brush="{AppThemeBinding Light={StaticResource Grey_Dark}, Padding="20,16"
Dark={StaticResource Grey_Dark_Dark}}" BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Opacity="0.3" Dark={StaticResource Primary_DarkBlue_Dark}}"
Radius="8" StrokeShape="RoundRectangle 16,16,0,0"
Offset="0,4" /> StrokeThickness="0">
</Border.Shadow> <Label
<Grid RowDefinitions="Auto,Auto,Auto"> Style="{StaticResource H4}"
<!-- Header --> Text="{x:Static res:Text.AGB_Popup_Header}"
<Border TextColor="{AppThemeBinding Light={StaticResource Primary_White},
Grid.Row="0" Dark={StaticResource Primary_White_Dark}}"
Padding="20,16" VerticalOptions="Center" />
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue}, </Border>
Dark={StaticResource Primary_DarkBlue_Dark}}"
StrokeShape="RoundRectangle 16,16,0,0" <!-- Content Bereich -->
StrokeThickness="0"> <VerticalStackLayout
Grid.Row="1"
Padding="20,16"
Spacing="16">
<Label
LineHeight="1.4"
Style="{StaticResource BodyS_GreyDark}"
Text="{x:Static res:Text.AGB_Popup_Description}" />
<!-- Link zu den AGB -->
<Label Style="{StaticResource LinkLabelStyle}" Text="{x:Static res:Text.AGB_Popup_LinkButton}">
<Label.GestureRecognizers>
<TapGestureRecognizer Command="{Binding OpenAGBCommand}" />
</Label.GestureRecognizers>
</Label>
<!-- Zustimmungs-Checkbox -->
<HorizontalStackLayout Margin="0,8,0,0" Spacing="12">
<CheckBox
IsChecked="{Binding HasAccepted}"
VerticalOptions="Center"
Color="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
<Label <Label
Style="{StaticResource H4}" LineHeight="1.3"
Text="{x:Static res:Text.AGB_Popup_Header}" MaximumWidthRequest="260"
TextColor="{AppThemeBinding Light={StaticResource Primary_White}, Style="{StaticResource BodyXs_GreyDark}"
Dark={StaticResource Primary_White_Dark}}" Text="{x:Static res:Text.AGB_Popup_CheckBoxText}"
VerticalOptions="Center" /> VerticalOptions="Center" />
</Border> </HorizontalStackLayout>
<!-- Content Bereich --> </VerticalStackLayout>
<VerticalStackLayout
Grid.Row="1" <!-- Action Buttons -->
Padding="20,16" <Button
Spacing="16"> Grid.Row="2"
<Label Margin="20"
LineHeight="1.4" BackgroundColor="{Binding AcceptButtonColor}"
Style="{StaticResource BodyS_GreyDark}" Command="{Binding AcceptCommand}"
Text="{x:Static res:Text.AGB_Popup_Description}" /> CornerRadius="12"
<!-- Link zu den AGB --> FontAttributes="Bold"
<Label Style="{StaticResource LinkLabelStyle}" Text="{x:Static res:Text.AGB_Popup_LinkButton}"> FontSize="{StaticResource FontLabelM}"
<Label.GestureRecognizers> IsEnabled="{Binding HasAccepted}"
<TapGestureRecognizer Command="{Binding OpenAGBCommand}" /> Text="{x:Static res:Text.AGB_Popup_Confirm}"
</Label.GestureRecognizers> TextColor="White" />
</Label> </Grid>
<!-- Zustimmungs-Checkbox -->
<HorizontalStackLayout Margin="0,8,0,0" Spacing="12">
<CheckBox
IsChecked="{Binding HasAccepted}"
VerticalOptions="Center"
Color="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
<Label
LineHeight="1.3"
MaximumWidthRequest="260"
Style="{StaticResource BodyXs_GreyDark}"
Text="{x:Static res:Text.AGB_Popup_CheckBoxText}"
VerticalOptions="Center" />
</HorizontalStackLayout>
</VerticalStackLayout>
<!-- Action Buttons -->
<Button
Grid.Row="2"
Margin="10"
BackgroundColor="{Binding AcceptButtonColor}"
Command="{Binding AcceptCommand}"
CornerRadius="12"
FontAttributes="Bold"
FontSize="{StaticResource FontLabelM}"
IsEnabled="{Binding HasAccepted}"
Text="{x:Static res:Text.AGB_Popup_Confirm}"
TextColor="White" />
</Grid>
</Border>
</toolkit:Popup> </toolkit:Popup>

View File

@ -7,119 +7,101 @@
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups" xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups"
x:DataType="viewModels:SubscriptionOfferPopupViewModel" x:DataType="viewModels:SubscriptionOfferPopupViewModel"
CanBeDismissedByTappingOutsideOfPopup="True"> BackgroundColor="{StaticResource Primary_LightBlue_Dark}"
CanBeDismissedByTappingOutsideOfPopup="True"
VerticalOptions="Center">
<!-- Popup Content --> <Grid
<Border Padding="24"
Padding="0" RowDefinitions="Auto,*,Auto">
BackgroundColor="{StaticResource Primary_LightBlue_Dark}"
HeightRequest="350"
StrokeShape="RoundRectangle 20"
StrokeThickness="0"
WidthRequest="350">
<!-- Drop Shadow Effect --> <!-- Close Button -->
<Border.Shadow> <Button
<Shadow Grid.Row="0"
Brush="{AppThemeBinding Light={StaticResource Grey_Dark}, BackgroundColor="Transparent"
Dark={StaticResource Grey_Dark_Dark}}" Command="{Binding DeclineCommand}"
Opacity="0.3" FontAttributes="Bold"
Radius="12" FontFamily="MaterialIconsRegular"
Offset="0,6" /> FontSize="40"
</Border.Shadow> HorizontalOptions="End"
Style="{StaticResource LinkButton}"
Text="close"
TextColor="White"
VerticalOptions="Start" />
<Grid RowDefinitions="Auto,*,Auto"> <!-- Content Bereich -->
<VerticalStackLayout
Grid.Row="1"
Margin="0,12,0,0"
HorizontalOptions="Center"
Spacing="16"
VerticalOptions="Center">
<!-- Close Button --> <!-- Icon - Gestapelte Napf-Icons -->
<Button <Image
Grid.Row="0" HeightRequest="120"
Margin="0,5,0,-20"
Background="Transparent"
Command="{Binding DeclineCommand}"
FontAttributes="Bold"
FontFamily="MaterialIconsRegular"
FontSize="40"
HorizontalOptions="End"
Text="close"
TextColor="White"
VerticalOptions="Start" />
<!-- Content Bereich -->
<VerticalStackLayout
Grid.Row="1"
Margin="0,-30,0,20"
HorizontalOptions="Center" HorizontalOptions="Center"
Spacing="10" Source="coins.png"
VerticalOptions="Center"> VerticalOptions="Center"
WidthRequest="120" />
<!-- Icon - Gestapelte Napf-Icons --> <!-- Titel -->
<Image <Label
Margin="0,0,0,-20" FontAttributes="Bold"
HeightRequest="120" HorizontalTextAlignment="Center"
HorizontalOptions="Center" Style="{StaticResource H2_Blue}"
Source="coins.png" Text="{x:Static res:Text.SubOffer_Popup_Title}"
VerticalOptions="Center" TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
WidthRequest="120" /> Dark={StaticResource Primary_DarkBlue_Dark}}" />
<!-- Untertitel -->
<!-- Titel --> <VerticalStackLayout Spacing="4">
<Label <Label
FontAttributes="Bold"
HorizontalTextAlignment="Center" HorizontalTextAlignment="Center"
Style="{StaticResource H2_Blue}" Style="{StaticResource BodyM}"
Text="{x:Static res:Text.SubOffer_Popup_Title}" Text="{x:Static res:Text.SubOffer_Popup_Description1}"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue}, TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" /> Dark={StaticResource Primary_DarkBlue_Dark}}" />
<!-- Untertitel --> <HorizontalStackLayout HorizontalOptions="Center" Spacing="4">
<VerticalStackLayout Spacing="4">
<Label
HorizontalTextAlignment="Center"
Style="{StaticResource BodyM}"
Text="{x:Static res:Text.SubOffer_Popup_Description1}"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
<HorizontalStackLayout HorizontalOptions="Center" Spacing="4">
<Label
FontAttributes="Bold"
FontFamily="InterSemiBold"
Style="{StaticResource BodyM}"
Text="STRAYZ"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
<Label
Style="{StaticResource BodyM}"
Text="{x:Static res:Text.SubOffer_Popup_ProductType}"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
</HorizontalStackLayout>
<Label <Label
FontAttributes="Bold" FontAttributes="Bold"
FontFamily="InterSemiBold" FontFamily="InterSemiBold"
HorizontalTextAlignment="Center"
Style="{StaticResource BodyM}" Style="{StaticResource BodyM}"
Text="{x:Static res:Text.SubOffer_Popup_CallToAction}" Text="STRAYZ"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue}, TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" /> Dark={StaticResource Primary_DarkBlue_Dark}}" />
</VerticalStackLayout> <Label
Style="{StaticResource BodyM}"
Text="{x:Static res:Text.SubOffer_Popup_ProductType}"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
</HorizontalStackLayout>
<Label
FontAttributes="Bold"
FontFamily="InterSemiBold"
HorizontalTextAlignment="Center"
Style="{StaticResource BodyM}"
Text="{x:Static res:Text.SubOffer_Popup_CallToAction}"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
</VerticalStackLayout> </VerticalStackLayout>
<!-- Action Button --> </VerticalStackLayout>
<Button
Grid.Row="2"
Margin="30,0,30,20"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
Command="{Binding AcceptCommand}"
CornerRadius="15"
FontAttributes="Bold"
HeightRequest="50"
Text="{x:Static res:Text.SubOffer_Popup_ButtonText}"
TextColor="White" />
</Grid> <!-- Action Button -->
</Border> <Button
Grid.Row="2"
Margin="0,20,0,0"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
Command="{Binding AcceptCommand}"
CornerRadius="15"
FontAttributes="Bold"
HeightRequest="50"
Text="{x:Static res:Text.SubOffer_Popup_ButtonText}"
TextColor="White" />
</Grid>
</toolkit:Popup> </toolkit:Popup>

View File

@ -8,32 +8,16 @@
xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups" xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups"
x:DataType="viewModels:SubscriptionSuccessPopupViewModel" x:DataType="viewModels:SubscriptionSuccessPopupViewModel"
CanBeDismissedByTappingOutsideOfPopup="True" CanBeDismissedByTappingOutsideOfPopup="True"
BackgroundColor="{StaticResource Primary_LightBlue}"
VerticalOptions="Center"> VerticalOptions="Center">
<!-- Popup Content -->
<Border
Padding="0"
BackgroundColor="{StaticResource Primary_LightBlue}"
StrokeShape="RoundRectangle 20"
StrokeThickness="0"
WidthRequest="350">
<!-- Drop Shadow Effect -->
<Border.Shadow>
<Shadow
Brush="{AppThemeBinding Light={StaticResource Grey_Dark},
Dark={StaticResource Grey_Dark_Dark}}"
Opacity="0.3"
Radius="12"
Offset="0,6" />
</Border.Shadow>
<Grid RowDefinitions="Auto,*,Auto"> <Grid RowDefinitions="Auto,*,Auto">
<!-- Close Button --> <!-- Close Button -->
<Button <Button
Grid.Row="0" Grid.Row="0"
Margin="0,20,20,-20"
BackgroundColor="Transparent" BackgroundColor="Transparent"
Command="{Binding CloseCommand}" Command="{Binding CloseCommand}"
FontAttributes="Bold" FontAttributes="Bold"
@ -48,18 +32,18 @@
<!-- Content Bereich --> <!-- Content Bereich -->
<VerticalStackLayout <VerticalStackLayout
Grid.Row="1" Grid.Row="1"
Padding="30,0,30,20"
Spacing="20" Spacing="20"
VerticalOptions="Center"> VerticalOptions="Center">
<!-- Herz Icon --> <!-- Herz Icon -->
<Image <Image
Margin="-20" Margin="-30"
HeightRequest="120" HeightRequest="100"
HorizontalOptions="Center" HorizontalOptions="Center"
Source="heart.png" Source="heart.png"
VerticalOptions="Center" VerticalOptions="Center"
WidthRequest="120" /> WidthRequest="100" />
<!-- Titel --> <!-- Titel -->
<Label <Label
@ -100,8 +84,9 @@
<!-- Action Button --> <!-- Action Button -->
<Button <Button
Margin="0,20,0,0"
Grid.Row="2" Grid.Row="2"
Margin="30,0,30,30"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue}, BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" Dark={StaticResource Primary_DarkBlue_Dark}}"
Command="{Binding OpenStrayzCommand}" Command="{Binding OpenStrayzCommand}"
@ -111,5 +96,4 @@
Text="{x:Static res:Text.SubSuccess_Popup_ButtonText}" Text="{x:Static res:Text.SubSuccess_Popup_ButtonText}"
TextColor="White" /> TextColor="White" />
</Grid> </Grid>
</Border>
</toolkit:Popup> </toolkit:Popup>

View File

@ -521,6 +521,7 @@
AbsoluteLayout.LayoutFlags="PositionProportional" AbsoluteLayout.LayoutFlags="PositionProportional"
Command="{Binding SaveCommand}" Command="{Binding SaveCommand}"
HorizontalOptions="Center" HorizontalOptions="Center"
WidthRequest="300"
IsVisible="{Binding HasChanges}" IsVisible="{Binding HasChanges}"
Text="{x:Static res:Text.Button_Done}" Text="{x:Static res:Text.Button_Done}"
VerticalOptions="End"> VerticalOptions="End">

View File

@ -1028,6 +1028,7 @@
AbsoluteLayout.LayoutFlags="PositionProportional" AbsoluteLayout.LayoutFlags="PositionProportional"
Command="{Binding SaveCommand}" Command="{Binding SaveCommand}"
HorizontalOptions="Center" HorizontalOptions="Center"
WidthRequest="300"
IsVisible="{Binding HasChanges}" IsVisible="{Binding HasChanges}"
Text="{x:Static res:Text.Button_Done}" Text="{x:Static res:Text.Button_Done}"
VerticalOptions="End"> VerticalOptions="End">