Skip to content

Commit 896795f

Browse files
committed
feat(Avalonia): add Flickr uploader settings
1 parent 432c257 commit 896795f

2 files changed

Lines changed: 182 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<UserControl
2+
x:Class="SnapX.Avalonia.Views.Settings.Views.ImageUploaders.FlickrUploaderSettingsView"
3+
x:DataType="img:FlickrUploader"
4+
xmlns="https://github.com/avaloniaui"
5+
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
6+
xmlns:fluent="clr-namespace:FluentIcons.Avalonia.Fluent;assembly=FluentIcons.Avalonia.Fluent"
7+
xmlns:img="clr-namespace:SnapX.Core.Upload.Img;assembly=SnapX.Core"
8+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
9+
10+
<StackPanel Spacing="4">
11+
<controls:SettingsExpander
12+
Header="Account Authentication"
13+
IconSource="Contact"
14+
IsExpanded="True">
15+
<controls:SettingsExpanderItem Content="Connect">
16+
<controls:SettingsExpanderItem.Footer>
17+
<Button Name="ConnectButton">
18+
<fluent:SymbolIcon FontSize="18" Symbol="PersonAccounts" />
19+
</Button>
20+
</controls:SettingsExpanderItem.Footer>
21+
</controls:SettingsExpanderItem>
22+
23+
<controls:SettingsExpanderItem Content="Verification Code" Description="Enter the code received from your provider to link your account.">
24+
<controls:SettingsExpanderItem.Footer>
25+
<StackPanel Orientation="Horizontal" Spacing="8">
26+
<TextBox
27+
PasswordChar="*"
28+
VerticalAlignment="Center"
29+
Watermark="Paste authorization code here"
30+
Width="250"
31+
x:Name="AuthCodeTextBox" />
32+
33+
<Button
34+
Content="Login"
35+
VerticalAlignment="Center"
36+
x:Name="CompleteAuthButton" />
37+
</StackPanel>
38+
</controls:SettingsExpanderItem.Footer>
39+
</controls:SettingsExpanderItem>
40+
41+
<controls:SettingsExpanderItem Content="Status: ???" Name="LoginStatus">
42+
<controls:SettingsExpanderItem.Footer>
43+
<StackPanel>
44+
<Button
45+
Classes="accent"
46+
Content="Disconnect"
47+
x:Name="DisconnectButton" />
48+
</StackPanel>
49+
</controls:SettingsExpanderItem.Footer>
50+
</controls:SettingsExpanderItem>
51+
</controls:SettingsExpander>
52+
53+
<controls:SettingsExpanderItem Content="Direct Link">
54+
<controls:SettingsExpanderItem.Footer>
55+
<ToggleSwitch Theme="{StaticResource CompactToggleSwitchStyle}" x:Name="DirectLinkSwitch" />
56+
</controls:SettingsExpanderItem.Footer>
57+
</controls:SettingsExpanderItem>
58+
59+
</StackPanel>
60+
</UserControl>
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
2+
using Avalonia.Controls;
3+
using Avalonia.Media;
4+
using FluentAvalonia.UI.Controls;
5+
using SnapX.Core;
6+
using SnapX.Core.Upload;
7+
using SnapX.Core.Upload.Img;
8+
using SnapX.Core.Upload.OAuth;
9+
using SnapX.Core.Utils;
10+
using SnapX.Core.Utils.Extensions;
11+
12+
namespace SnapX.Avalonia.Views.Settings.Views.ImageUploaders;
13+
14+
public partial class FlickrUploaderSettingsView : UserControl
15+
{
16+
public FlickrUploaderSettingsView()
17+
{
18+
InitializeComponent();
19+
}
20+
21+
protected override void OnDataContextChanged(EventArgs e)
22+
{
23+
base.OnDataContextChanged(e);
24+
25+
if (DataContext is not FlickrUploader) return;
26+
var Config = SnapX.Core.SnapXL.UploadersConfig;
27+
AuthCodeTextBox.Text = Config.FlickrOAuthInfo?.AuthVerifier;
28+
DirectLinkSwitch.IsChecked = Config.FlickrSettings?.DirectLink;
29+
30+
CalculateAccessibility();
31+
AuthCodeTextBox.TextChanged += (Sender, Args) => { CalculateAccessibility(); };
32+
33+
ConnectButton.Click += async (s, ev) =>
34+
{
35+
try
36+
{
37+
var oauth = new OAuthInfo(APIKeys.FlickrKey, APIKeys.FlickrSecret);
38+
// In development, this hanged Avalonia without Task.Run! Cooool!
39+
var url = await Task.Run(() => new FlickrUploader(oauth).GetAuthorizationURL());
40+
41+
if (!string.IsNullOrEmpty(url))
42+
{
43+
Config.FlickrOAuthInfo = oauth;
44+
URLHelpers.OpenURL(url);
45+
DebugHelper.WriteLine("FlickrAuthOpen - Authorization URL is opened: " + url);
46+
}
47+
else
48+
{
49+
DebugHelper.WriteLine("FlickrAuthOpen - Authorization URL is empty.");
50+
}
51+
}
52+
catch (Exception ex)
53+
{
54+
ex.ShowError();
55+
}
56+
};
57+
CompleteAuthButton.Click += async (s, ev) =>
58+
{
59+
try
60+
{
61+
var code = AuthCodeTextBox.Text;
62+
if (string.IsNullOrWhiteSpace(code) || Config.FlickrOAuthInfo == null) return;
63+
var result = await Task.Run(() => new FlickrUploader(Config.FlickrOAuthInfo).GetAccessToken(code));
64+
65+
var dialog = new ContentDialog
66+
{
67+
Title = result ? "Success" : "Login Failed",
68+
Content = result ? "Login Successful" : "Login Failed",
69+
CloseButtonText = "OK",
70+
DefaultButton = ContentDialogButton.Close
71+
};
72+
73+
LoginStatus.Content = result ? $"Status: {OAuthLoginStatus.LoginSuccessful}" : $"Status: {OAuthLoginStatus.LoginFailed}";
74+
LoginStatus.Foreground = result ? Brushes.LawnGreen : Brushes.Red;
75+
AuthCodeTextBox.Text = string.Empty;
76+
77+
var topLevel = TopLevel.GetTopLevel(this);
78+
if (topLevel != null)
79+
{
80+
await dialog.ShowAsync();
81+
}
82+
}
83+
catch (Exception ex)
84+
{
85+
var errorDialog = new ContentDialog
86+
{
87+
Title = "Error",
88+
Content = ex.Message,
89+
CloseButtonText = "OK"
90+
};
91+
92+
var topLevel = TopLevel.GetTopLevel(this);
93+
if (topLevel != null)
94+
{
95+
await errorDialog.ShowAsync();
96+
}
97+
}
98+
};
99+
DisconnectButton.Click += (Sender, Args) =>
100+
{
101+
Config.FlickrOAuthInfo = null;
102+
CalculateAccessibility();
103+
};
104+
105+
DirectLinkSwitch.IsCheckedChanged += (s, ev) =>
106+
Config.FlickrSettings?.DirectLink = DirectLinkSwitch.IsChecked ?? false;
107+
108+
109+
110+
}
111+
112+
void CalculateAccessibility()
113+
{
114+
var Config = SnapX.Core.SnapXL.UploadersConfig;
115+
var oAuthSuccess = OAuthInfo.CheckOAuth(Config.FlickrOAuthInfo);
116+
117+
DisconnectButton.IsEnabled = oAuthSuccess;
118+
LoginStatus.Content = oAuthSuccess ? "Status: Logged in." : $"Status: {OAuthLoginStatus.LoginRequired}";
119+
LoginStatus.Foreground = oAuthSuccess ? Brushes.LawnGreen : Brushes.Red;
120+
CompleteAuthButton.IsEnabled = !string.IsNullOrWhiteSpace(AuthCodeTextBox.Text);
121+
}
122+
}

0 commit comments

Comments
 (0)