Skip to content

Commit

Permalink
Achievement deep link handling
Browse files Browse the repository at this point in the history
  • Loading branch information
akrol95 committed Feb 7, 2025
1 parent 1851ba5 commit 41824f0
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 9 deletions.
1 change: 1 addition & 0 deletions BMM.Api/Framework/HTTP/ApiUris.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public class ApiUris

public static string Achievements = "statistics/achievements{?theme,lang}";
public static string AchievementsToAcknowledge = "statistics/achievements/to/acknowledge{?theme,lang}";
public static string Achievement = "statistics/achievement/{id}/{?theme,lang}";

public static string YearInReview = "statistics/year-in-review/overview";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,6 @@ public interface IStatisticsClient
Task PostListeningEvents(IList<ListeningEvent> listeningEvents);
Task<AchievementsHolder> GetAchievements(AppTheme theme);
Task<IList<Achievement>> GetAchievementsToAcknowledge(AppTheme theme);
Task<Achievement> GetAchievement(string id, AppTheme theme);
}
}
8 changes: 8 additions & 0 deletions BMM.Api/Implementation/Clients/StatisticsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,14 @@ public Task<IList<Achievement>> GetAchievementsToAcknowledge(AppTheme theme)
return Get<IList<Achievement>>(uri);
}

public Task<Achievement> GetAchievement(string id, AppTheme theme)
{
var uri = new UriTemplate(ApiUris.Achievement);
uri.SetParameter("id", id);
uri.SetParameter("theme", theme);
return Get<Achievement>(uri);
}

public Task<ProjectProgress> GetProjectProgress(AppTheme theme)
{
var uri = new UriTemplate(ApiUris.ProjectProgress);
Expand Down
7 changes: 7 additions & 0 deletions BMM.Core/Implementations/DeepLinking/DeepLinkHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class DeepLinkHandler : IDeepLinkHandler
{
public const string PlayTrackRegex = "^/track/(?<id>[0-9]+)(/(?<language>.*))?$";
public const string QuizRegex = "^/question/(?<id>[0-9]+)$";
public const string AchievementRegex = "^/achievement/(?<id>[A-Za-z0-9]+)$";
public static readonly string Music = "music";

private readonly string _baseBrowsePath = "browse/";
Expand Down Expand Up @@ -114,6 +115,7 @@ public DeepLinkHandler(
new RegexDeepLink<GenericDocumentsViewParameters>("^/browse(/(?<path>.*))?$", OpenGenericDocumentsView),
new RegexDeepLink("^/romans-questions$", OpenRomansQuestions),
new RegexDeepLink<IdDeepLinkParameters>(QuizRegex, OpenQuizQuestion),
new RegexDeepLink<StringIdParameters>(AchievementRegex, OpenAchievement),
new RegexDeepLink("^/$", DoNothing)
};
}
Expand Down Expand Up @@ -202,6 +204,11 @@ private async Task OpenQuizQuestion(IdDeepLinkParameters deepLinkParameters)
{
await NavigateTo<QuizQuestionViewModel, IQuizQuestionViewModelParameter>(new QuizQuestionViewModelParameter(deepLinkParameters.Id));
}

private async Task OpenAchievement(StringIdParameters parameters)
{
await NavigateTo<AchievementDetailsViewModel, IAchievementDetailsParameter>(new AchievementDetailsParameter(parameters.Id));
}

private Task DoNothing()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using BMM.Core.Implementations.DeepLinking.Base.Interfaces;

namespace BMM.Core.Implementations.DeepLinking.Parameters;

public class StringIdParameters : IDeepLinkParameters
{
public string Id { get; set; }
}
37 changes: 30 additions & 7 deletions BMM.Core/ViewModels/AchievementDetailsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using BMM.Core.Extensions;
using BMM.Core.GuardedActions.BibleStudy.Interfaces;
using BMM.Core.Helpers;
using BMM.Core.Implementations.Device;
using BMM.Core.Messages.MediaPlayer;
using BMM.Core.Models.POs.Base.Interfaces;
using BMM.Core.Models.POs.BibleStudy;
Expand All @@ -22,6 +23,8 @@ public class AchievementDetailsViewModel : DocumentsViewModel, IBaseViewModel<IA
{
private readonly IAcknowledgeAchievementAction _acknowledgeAchievementAction;
private readonly IMediaPlayer _mediaPlayer;
private readonly IStatisticsClient _statisticsClient;
private readonly IDeviceInfo _deviceInfo;
private AchievementPO _achievementPO;
private IMvxAsyncCommand _buttonClickedCommand;
private bool _shouldShowConfetti;
Expand All @@ -33,17 +36,21 @@ public AchievementDetailsViewModel(
IAcknowledgeAchievementAction acknowledgeAchievementAction,
IActivateRewardAction activateRewardAction,
IMediaPlayer mediaPlayer,
ITracksClient tracksClient)
ITracksClient tracksClient,
IStatisticsClient statisticsClient,
IDeviceInfo deviceInfo)
{
_acknowledgeAchievementAction = acknowledgeAchievementAction;
_mediaPlayer = mediaPlayer;
_statisticsClient = statisticsClient;
_deviceInfo = deviceInfo;
activateRewardAction.AttachDataContext(this);
ButtonClickedCommand = activateRewardAction.Command;
_playbackStatusChangedMessageToken = Messenger.Subscribe<PlaybackStatusChangedMessage>(PlaybackStateChanged);

PlayNextClickedCommand = new ExceptionHandlingCommand(async () =>
{
int? trackId = NavigationParameter.AchievementPO.TrackId;
int? trackId = AchievementPO.TrackId;

if (trackId == null)
return;
Expand Down Expand Up @@ -87,18 +94,34 @@ private void PlaybackStateChanged(PlaybackStatusChangedMessage playbackStatusCha

public override async Task<IEnumerable<IDocumentPO>> LoadItems(CachePolicy policy = CachePolicy.UseCacheAndRefreshOutdated)
{
AchievementPO = NavigationParameter.AchievementPO;
ShouldShowPlayNextButton = NavigationParameter.AchievementPO.TrackId.HasValue;
await _acknowledgeAchievementAction.ExecuteGuarded(NavigationParameter.AchievementPO);
await LoadAchievement();
ShouldShowPlayNextButton = AchievementPO.TrackId.HasValue;
await _acknowledgeAchievementAction.ExecuteGuarded(AchievementPO);
ShouldShowConfetti = AchievementPO.IsActive && !AchievementPO.IsAcknowledged;
RefreshTrack();
return Enumerable.Empty<IDocumentPO>();
}

private async Task LoadAchievement()
{
if (NavigationParameter.AchievementPO != null)
{
AchievementPO = NavigationParameter.AchievementPO;
return;
}

var achievement = await _statisticsClient.GetAchievement(NavigationParameter.Id, await _deviceInfo.GetCurrentTheme());
AchievementPO = new AchievementPO(achievement, NavigationService);
}

public AchievementPO AchievementPO
{
get => _achievementPO;
set => SetProperty(ref _achievementPO, value);
set
{
SetProperty(ref _achievementPO, value);
RaisePropertyChanged(nameof(ButtonTitle));
}
}

public IMvxAsyncCommand ButtonClickedCommand
Expand Down Expand Up @@ -131,7 +154,7 @@ protected override void RefreshTrackWithId(int? currentTrackId)

private void RefreshTrack()
{
int? trackId = NavigationParameter.AchievementPO.TrackId;
int? trackId = AchievementPO.TrackId;

if (trackId == null)
return;
Expand Down
12 changes: 10 additions & 2 deletions BMM.Core/ViewModels/Parameters/AchievementDetailsParameter.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
using System.Runtime.CompilerServices;
using BMM.Core.Models.POs.BibleStudy;
using BMM.Core.ViewModels.Parameters.Interface;

namespace BMM.Core.ViewModels.Parameters;

public class AchievementDetailsParameter : IAchievementDetailsParameter
{
public AchievementDetailsParameter(AchievementPO achievementPO)
public AchievementDetailsParameter(
AchievementPO achievementPO)
{
AchievementPO = achievementPO;
}


public AchievementDetailsParameter(string id)
{
Id = id;
}

public string Id { get; }
public AchievementPO AchievementPO { get; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ namespace BMM.Core.ViewModels.Parameters.Interface;

public interface IAchievementDetailsParameter
{
string Id { get; }
AchievementPO AchievementPO { get; }
}

0 comments on commit 41824f0

Please sign in to comment.