Skip to content

Commit 0f3b193

Browse files
authored
feat: deals - display time remaining until deals expire (#268)
* Converters - | create a time until converter * Deals - page | display time until it expires * Deals page | improving time until display * TimeUntilConverter - correction * TimeUntilConverter - converters | improve * Deal page - expiration | dynamically change the colour * Converters - time until| correct a big mistake * App -| make sure to refresh the Deals when resuming the app * converters - TimeUntil | remove minutes when it's not relevant Resolves #260
1 parent d223c2f commit 0f3b193

File tree

7 files changed

+103
-4
lines changed

7 files changed

+103
-4
lines changed

App/App.xaml.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,13 @@ protected override void OnResume()
157157

158158
((NewsPage)currentPage).OnResume();
159159
}
160-
}
160+
161+
if (currentPage.ToString() == "GamHubApp.Views.DealsPage")
162+
{
163+
164+
((DealsPage)currentPage).Resume();
165+
}
166+
}
161167
/// <summary>
162168
/// Open any popup
163169
/// </summary>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+

2+
3+
using System.Globalization;
4+
5+
namespace GamHubApp.Helpers;
6+
7+
public class TimeUntilColourConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10+
{
11+
if (value is DateTime enddate)
12+
{
13+
var timeremaining = enddate - DateTime.Now;
14+
15+
if (timeremaining < TimeSpan.Zero)
16+
return App.Current.Resources["DealExpiringColor"];
17+
else if (timeremaining.Days < 0)
18+
return timeremaining.Hours < 20? App.Current.Resources["DealExpiringColor"]: App.Current.Resources["DealExpiresVerySoonColor"];
19+
else if (timeremaining < new TimeSpan(days: 30, 0, 0, 0))
20+
return App.Current.Resources["DealExpiresSoonColor"];
21+
22+
}
23+
return App.Current.Resources["FontColor"];
24+
}
25+
26+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
27+
{
28+
throw new NotImplementedException();
29+
}
30+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+

2+
3+
using System.Globalization;
4+
5+
namespace GamHubApp.Helpers;
6+
7+
public class TimeUntilConverter : IValueConverter
8+
{
9+
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
10+
{
11+
if (value is DateTime enddate)
12+
{
13+
var timeremaining = enddate - DateTime.Now;
14+
15+
if (timeremaining < TimeSpan.Zero)
16+
return "expired";
17+
else if (timeremaining.TotalHours < 0)
18+
return $"{timeremaining.Minutes} minutes";
19+
else if (timeremaining.TotalDays < 0)
20+
return $"{timeremaining.Days} hours {timeremaining.Minutes} minutes ";
21+
else if (timeremaining.TotalDays < 30)
22+
return $"{timeremaining.Days} days {timeremaining.Hours} hours";
23+
24+
}
25+
return null;
26+
}
27+
28+
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
29+
{
30+
throw new NotImplementedException();
31+
}
32+
}

App/Resources/Styles/Colors.xaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
<Color x:Key="BgBannerColor" >#262626</Color>
2121
<Color x:Key="DiscordPurple" >#5d6af2</Color>
2222
<Color x:Key="DiscountColor" >#FF5733</Color>
23-
</ResourceDictionary>
23+
<!-- deals -->
24+
<Color x:Key="DealExpiresSoonColor" >#FFEEEA</Color>
25+
<Color x:Key="DealExpiresVerySoonColor" >#FFAB99</Color>
26+
<Color x:Key="DealExpiringColor" >#FF6747</Color>
27+
</ResourceDictionary>
2428

2529
</ResourceDictionary>

App/Resources/Styles/Styles.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
<helpers:BoolInverseConverter x:Key="BoolInverseConverter"/>
1919
<helpers:ZeroToFalseConverter x:Key="ZeroToFalseConverter"/>
2020
<helpers:ZeroToTrueConverter x:Key="ZeroToTrueConverter"/>
21+
<helpers:TimeUntilConverter x:Key="TimeUntilConverter"/>
22+
<helpers:TimeUntilColourConverter x:Key="TimeUntilColourConverter"/>
2123
<helpers:NotNullOrEmptyStringConverter x:Key="NotNullOrEmptyStringConverter"/>
2224
<helpers:NullOrEmptyStringConverter x:Key="NullOrEmptyStringConverter"/>
2325

App/Views/DealsPage.xaml

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
xmlns:models="clr-namespace:GamHubApp.Models"
77
xmlns:viewmodels="clr-namespace:GamHubApp.ViewModels"
88
x:DataType="viewmodels:DealsViewModel"
9-
xmlns:stroked="https://vapolia.eu/Vapolia.StrokedLabel"
10-
Title="DealsPage">
9+
xmlns:stroked="https://vapolia.eu/Vapolia.StrokedLabel">
1110
<Shell.TitleView>
1211
<Grid ColumnDefinitions="4*,*">
1312
<Label Text="My Deals"
@@ -65,6 +64,28 @@
6564
HorizontalOptions="Fill"
6665
VerticalOptions="Fill"/>
6766
</Border>
67+
<Border Grid.Row="0"
68+
StrokeShape="RoundRectangle 10"
69+
HorizontalOptions="Start"
70+
VerticalOptions="Start"
71+
HeightRequest="30"
72+
BackgroundColor="{StaticResource BackgroundColor}"
73+
StrokeThickness="1"
74+
Stroke="{Binding Expires, Converter={StaticResource TimeUntilColourConverter}}"
75+
Margin="2,5"
76+
Padding="5,2">
77+
<Label TextColor="{StaticResource FontColor}"
78+
VerticalTextAlignment="Center">
79+
<Label.FormattedText>
80+
<FormattedString>
81+
<Span FontFamily="P-Medium" Text="Ends in "/>
82+
<Span FontFamily="P-Bold"
83+
Text="{Binding Expires, Converter={StaticResource TimeUntilConverter}}"
84+
TextColor="{Binding Expires, Converter={StaticResource TimeUntilColourConverter}}"/>
85+
</FormattedString>
86+
</Label.FormattedText>
87+
</Label>
88+
</Border>
6889
<Label Grid.Row="1"
6990
HorizontalOptions="Center"
7091
HorizontalTextAlignment="Center"

App/Views/DealsPage.xaml.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ protected override void OnAppearing()
1818
BadgeCounterService.SetCount(0);
1919
(App.Current as App).ShowLoadingIndicator();
2020

21+
Resume();
22+
}
23+
public void Resume()
24+
{
2125
_vm.UpdateDeals().GetAwaiter();
2226
}
2327
}

0 commit comments

Comments
 (0)