This repository has been archived by the owner on Jun 21, 2023. It is now read-only.
/
PullRequestCheckViewModel.cs
119 lines (103 loc) · 4.21 KB
/
PullRequestCheckViewModel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using System.Windows.Media.Imaging;
using GitHub.Extensions;
using GitHub.Factories;
using GitHub.Models;
using GitHub.Services;
using ReactiveUI;
namespace GitHub.ViewModels.GitHubPane
{
[Export(typeof(IPullRequestCheckViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class PullRequestCheckViewModel: ViewModelBase, IPullRequestCheckViewModel
{
private readonly IUsageTracker usageTracker;
const string DefaultAvatar = "pack://application:,,,/GitHub.App;component/Images/default_user_avatar.png";
private string title;
private string description;
private PullRequestCheckStatusEnum status;
private Uri detailsUrl;
private string avatarUrl;
private BitmapImage avatar;
public static IEnumerable<IPullRequestCheckViewModel> Build(IViewViewModelFactory viewViewModelFactory, PullRequestDetailModel pullRequest)
{
return pullRequest.Statuses?.Select(model =>
{
var statusStateEnum = model.State;
PullRequestCheckStatusEnum checkStatus;
switch (statusStateEnum)
{
case StatusStateEnum.Expected:
case StatusStateEnum.Error:
case StatusStateEnum.Failure:
checkStatus = PullRequestCheckStatusEnum.Failure;
break;
case StatusStateEnum.Pending:
checkStatus = PullRequestCheckStatusEnum.Pending;
break;
case StatusStateEnum.Success:
checkStatus = PullRequestCheckStatusEnum.Success;
break;
default:
throw new InvalidOperationException("Unkown PullRequestCheckStatusEnum");
}
var pullRequestCheckViewModel = viewViewModelFactory.CreateViewModel<IPullRequestCheckViewModel>();
pullRequestCheckViewModel.Title = model.Context;
pullRequestCheckViewModel.Description = model.Description;
pullRequestCheckViewModel.Status = checkStatus;
pullRequestCheckViewModel.DetailsUrl = new Uri(model.TargetUrl);
pullRequestCheckViewModel.AvatarUrl = model.AvatarUrl ?? DefaultAvatar;
pullRequestCheckViewModel.Avatar = model.AvatarUrl != null
? new BitmapImage(new Uri(model.AvatarUrl))
: AvatarProvider.CreateBitmapImage(DefaultAvatar);
return pullRequestCheckViewModel;
}) ?? new PullRequestCheckViewModel[0];
}
[ImportingConstructor]
public PullRequestCheckViewModel(IUsageTracker usageTracker)
{
this.usageTracker = usageTracker;
OpenDetailsUrl = ReactiveCommand.Create().OnExecuteCompleted(DoOpenDetailsUrl);
}
private void DoOpenDetailsUrl(object obj)
{
usageTracker.IncrementCounter(x => x.NumberOfPRCheckStatusesOpenInGitHub).Forget();
}
public string Title
{
get { return title; }
set { this.RaiseAndSetIfChanged(ref title, value); }
}
public string Description
{
get { return description; }
set { this.RaiseAndSetIfChanged(ref description, value); }
}
public PullRequestCheckStatusEnum Status
{
get { return status; }
set { this.RaiseAndSetIfChanged(ref status, value); }
}
public Uri DetailsUrl
{
get { return detailsUrl; }
set { this.RaiseAndSetIfChanged(ref detailsUrl, value); }
}
public string AvatarUrl
{
get { return avatarUrl; }
set { this.RaiseAndSetIfChanged(ref avatarUrl, value); }
}
public BitmapImage Avatar
{
get { return avatar; }
set { this.RaiseAndSetIfChanged(ref avatar, value); }
}
public ReactiveCommand<object> OpenDetailsUrl { get; }
}
}