-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSignInForm.cs
102 lines (84 loc) · 3.83 KB
/
SignInForm.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
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.Globalization;
using GitHubExtension.DeveloperId;
using GitHubExtension.Helpers;
using Microsoft.CommandPalette.Extensions;
using Microsoft.CommandPalette.Extensions.Toolkit;
namespace GitHubExtension.Controls.Forms;
public partial class SignInForm : FormContent, IGitHubForm
{
public static event EventHandler<SignInStatusChangedEventArgs>? SignInAction;
public event EventHandler<bool>? LoadingStateChanged;
public event EventHandler<FormSubmitEventArgs>? FormSubmitted;
private readonly IDeveloperIdProvider _developerIdProvider;
private readonly IResources _resources;
private bool _isButtonEnabled = true;
private string IsButtonEnabled =>
_isButtonEnabled.ToString(CultureInfo.InvariantCulture).ToLower(CultureInfo.InvariantCulture);
public SignInForm(IDeveloperIdProvider developerIdProvider, IResources resources)
{
_resources = resources;
_developerIdProvider = developerIdProvider;
_developerIdProvider.OAuthRedirected += DeveloperIdProvider_OAuthRedirected;
}
private void DeveloperIdProvider_OAuthRedirected(object? sender, Exception? e)
{
if (e is not null)
{
SetButtonEnabled(true);
LoadingStateChanged?.Invoke(this, false);
SignInAction?.Invoke(this, new SignInStatusChangedEventArgs(false, e));
FormSubmitted?.Invoke(this, new FormSubmitEventArgs(false, e));
}
else
{
SetButtonEnabled(false);
}
}
public void SetButtonEnabled(bool isEnabled)
{
_isButtonEnabled = isEnabled;
TemplateJson = TemplateHelper.LoadTemplateJsonFromTemplateName("AuthTemplate", TemplateSubstitutions);
OnPropertyChanged(nameof(TemplateJson));
}
public Dictionary<string, string> TemplateSubstitutions => new()
{
{ "{{AuthTitle}}", _resources.GetResource("Forms_Sign_In") },
{ "{{AuthButtonTitle}}", _resources.GetResource("Forms_Sign_In") },
{ "{{AuthIcon}}", $"data:image/png;base64,{GitHubIcon.GetBase64Icon("logo")}" },
{ "{{AuthButtonTooltip}}", _resources.GetResource("Forms_Sign_In_Tooltip") },
{ "{{ButtonIsEnabled}}", IsButtonEnabled },
};
public override string TemplateJson => TemplateHelper.LoadTemplateJsonFromTemplateName("AuthTemplate", TemplateSubstitutions);
public override ICommandResult SubmitForm(string inputs, string data)
{
LoadingStateChanged?.Invoke(this, true);
Task.Run(() =>
{
try
{
var signInSucceeded = HandleSignIn().Result;
LoadingStateChanged?.Invoke(this, false);
SignInAction?.Invoke(this, new SignInStatusChangedEventArgs(signInSucceeded, null));
FormSubmitted?.Invoke(this, new FormSubmitEventArgs(signInSucceeded, null));
}
catch (Exception ex)
{
LoadingStateChanged?.Invoke(this, false);
SetButtonEnabled(true);
SignInAction?.Invoke(this, new SignInStatusChangedEventArgs(false, ex));
FormSubmitted?.Invoke(this, new FormSubmitEventArgs(false, ex));
}
});
return CommandResult.KeepOpen();
}
private async Task<bool> HandleSignIn()
{
var numPreviousDevIds = _developerIdProvider.GetLoggedInDeveloperIdsInternal().Count();
await _developerIdProvider.LoginNewDeveloperIdAsync();
var numDevIds = _developerIdProvider.GetLoggedInDeveloperIdsInternal().Count();
return numDevIds > numPreviousDevIds;
}
}