Skip to content

Commit 0b8625f

Browse files
committed
feat(Avalonia): add ImageShack uploader settings
1 parent 12aa391 commit 0b8625f

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<UserControl
2+
x:Class="SnapX.Avalonia.Views.Settings.Views.ImageUploaders.ImageShackUploaderSettingsView"
3+
x:DataType="img:ImageShackUploader"
4+
xmlns="https://github.com/avaloniaui"
5+
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
6+
xmlns:img="clr-namespace:SnapX.Core.Upload.Img;assembly=SnapX.Core"
7+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
8+
9+
<StackPanel Spacing="4">
10+
<controls:InfoBar
11+
IsClosable="False"
12+
IsOpen="True"
13+
Margin="0,0,0,8"
14+
Message="ImageShack's Login API is broken. We are in the process of contacting support regarding this issue. This means uploading with SnapX using ImageShack is currently impossible."
15+
Severity="Warning"
16+
Title="ImageShack Logins Unavailable" />
17+
<controls:SettingsExpander
18+
Header="Account Authentication"
19+
IconSource="Contact"
20+
IsExpanded="False">
21+
<controls:SettingsExpanderItem Content="Username">
22+
<controls:SettingsExpanderItem.Footer>
23+
<TextBox
24+
Watermark="Username/Email"
25+
Width="200"
26+
x:Name="UsernameTextBox" />
27+
</controls:SettingsExpanderItem.Footer>
28+
</controls:SettingsExpanderItem>
29+
30+
<controls:SettingsExpanderItem Content="Password">
31+
<controls:SettingsExpanderItem.Footer>
32+
<TextBox
33+
PasswordChar="*"
34+
Watermark="Password"
35+
Width="200"
36+
x:Name="PasswordTextBox" />
37+
</controls:SettingsExpanderItem.Footer>
38+
</controls:SettingsExpanderItem>
39+
40+
<controls:SettingsExpanderItem>
41+
<controls:SettingsExpanderItem.Footer>
42+
<Button
43+
Classes="accent"
44+
Content="Login"
45+
x:Name="LoginButton" />
46+
</controls:SettingsExpanderItem.Footer>
47+
</controls:SettingsExpanderItem>
48+
</controls:SettingsExpander>
49+
50+
<controls:SettingsExpanderItem Content="Public Upload" ToolTip.Tip="Will it show on ImageShack's homepage?">
51+
<controls:SettingsExpanderItem.Footer>
52+
<ToggleSwitch Theme="{StaticResource CompactToggleSwitchStyle}" x:Name="PublicUploadSwitch" />
53+
</controls:SettingsExpanderItem.Footer>
54+
</controls:SettingsExpanderItem>
55+
<controls:SettingsExpanderItem Content="External Links">
56+
<controls:SettingsExpanderItem.Footer>
57+
<StackPanel Orientation="Horizontal" Spacing="8">
58+
<Button Content="My Images" x:Name="OpenImagesButton" />
59+
<Button Content="Public Profile" x:Name="OpenProfileButton" />
60+
</StackPanel>
61+
</controls:SettingsExpanderItem.Footer>
62+
</controls:SettingsExpanderItem>
63+
64+
</StackPanel>
65+
</UserControl>
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
using Avalonia.Controls;
2+
using FluentAvalonia.UI.Controls;
3+
using SnapX.Core.Upload;
4+
using SnapX.Core.Upload.Img;
5+
using SnapX.Core.Utils;
6+
7+
namespace SnapX.Avalonia.Views.Settings.Views.ImageUploaders;
8+
9+
public partial class ImageShackUploaderSettingsView : UserControl
10+
{
11+
public ImageShackUploaderSettingsView()
12+
{
13+
InitializeComponent();
14+
}
15+
16+
protected override void OnDataContextChanged(EventArgs e)
17+
{
18+
base.OnDataContextChanged(e);
19+
20+
if (DataContext is not ImageShackUploader) return;
21+
var config = SnapX.Core.SnapXL.UploadersConfig;
22+
23+
UsernameTextBox.Text = config.ImageShackSettings?.Username;
24+
PasswordTextBox.Text = config.ImageShackSettings?.Password;
25+
PublicUploadSwitch.IsChecked = config.ImageShackSettings?.IsPublic;
26+
27+
UsernameTextBox.TextChanged += (s, ev) => config.ImageShackSettings?.Username = UsernameTextBox.Text;
28+
PasswordTextBox.TextChanged += (s, ev) => config.ImageShackSettings?.Password = PasswordTextBox.Text;
29+
30+
LoginButton.Click += async (s, ev) =>
31+
{
32+
var imageShackUploader = new ImageShackUploader(APIKeys.ImageShackKey, config.ImageShackSettings);
33+
34+
try
35+
{
36+
var success = await Task.Run(imageShackUploader.GetAccessToken);
37+
38+
var dialog = new ContentDialog
39+
{
40+
Title = success ? "Success" : "Login Failed",
41+
Content = success ? "Login successful!" : "Please check your username and password.",
42+
CloseButtonText = "OK",
43+
DefaultButton = ContentDialogButton.Close
44+
};
45+
46+
var topLevel = TopLevel.GetTopLevel(this);
47+
if (topLevel != null)
48+
{
49+
await dialog.ShowAsync(topLevel);
50+
}
51+
else
52+
{
53+
await dialog.ShowAsync();
54+
}
55+
}
56+
catch (Exception ex)
57+
{
58+
ContentDialog errorDialog = new ContentDialog
59+
{
60+
Title = "Error",
61+
Content = ex.ToString(),
62+
CloseButtonText = "OK"
63+
};
64+
var topLevel = TopLevel.GetTopLevel(this);
65+
if (topLevel != null)
66+
{
67+
await errorDialog.ShowAsync(topLevel);
68+
}
69+
else
70+
{
71+
await errorDialog.ShowAsync();
72+
}
73+
}
74+
};
75+
76+
OpenImagesButton.Click += (s, ev) => URLHelpers.OpenURL("https://imageshack.com/my/images");
77+
OpenProfileButton.Click += (s, ev) =>
78+
{
79+
if (!string.IsNullOrEmpty(config.ImageShackSettings?.Username))
80+
URLHelpers.OpenURL($"https://imageshack.com/user/{config.ImageShackSettings?.Username}");
81+
else UsernameTextBox.Focus();
82+
};
83+
84+
PublicUploadSwitch.IsCheckedChanged += (s, ev) =>
85+
config.ImageShackSettings?.IsPublic = PublicUploadSwitch.IsChecked ?? false;
86+
87+
88+
89+
}
90+
}

0 commit comments

Comments
 (0)