From 686c5554b571f1bc3f7bdffdd0d4cbcb86f083d9 Mon Sep 17 00:00:00 2001
From: Emilia <emilia@jumpsca.re>
Date: Thu, 19 Sep 2024 20:36:57 +0300
Subject: [PATCH] dead.png

---
 Blacklight.sln.DotSettings.user         |   4 +++
 Blacklight/App.axaml.cs                 |   1 +
 Blacklight/Assets/dead.png              | Bin 0 -> 3815 bytes
 Blacklight/ViewModels/LoginViewModel.cs |  32 +++++++++++++++++++++++-
 Blacklight/Views/Login/Loading.axaml    |  14 +++++++++--
 Blacklight/Views/MainWindow.axaml       |  10 ++++----
 Lightquark.NET/Client.cs                |   9 ++++---
 Lightquark.NET/ClientMethods/Login.cs   |   9 ++++++-
 8 files changed, 66 insertions(+), 13 deletions(-)
 create mode 100644 Blacklight/Assets/dead.png

diff --git a/Blacklight.sln.DotSettings.user b/Blacklight.sln.DotSettings.user
index 25b17d7..6afa4c6 100644
--- a/Blacklight.sln.DotSettings.user
+++ b/Blacklight.sln.DotSettings.user
@@ -1,8 +1,12 @@
 <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A020002A9pdb321_002Eil_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fda232ecc044f4c3d8e856366253516531d2800_003F71_003F8a186d8b_003F020002A9pdb321_002Eil/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003A020002ACpdb869_002Eil_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003FILViewer_003Fda232ecc044f4c3d8e856366253516531d2800_003F00_003F5a1370d8_003F020002ACpdb869_002Eil/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssetLoader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F6dcc875f2facef5a505e1840bcae49509f5b796e47105cc3205aa92843f4753e_003FAssetLoader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AContentControl_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa0b45743773945a3bb67ca6440ae9eadf9c00_003F50_003F9d315227_003FContentControl_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADockFluentTheme_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc13735b26c914624b4ee4a88a575ae253ae00_003Feb_003F23efc6b0_003FDockFluentTheme_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFactory_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fe8b9e6b427dceb6f436414441b760d4dc52661df17f386ce4caa48aab354989_003FFactory_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AHtmlControl_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F58931fa041a846b53462c4c4c5f52620bf9de09eff582aa4b1ed83c83e4e10ea_003FHtmlControl_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
+	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIAssetLoader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fda232ecc044f4c3d8e856366253516531d2800_003F_005F27262_003FIAssetLoader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIFactory_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F52dbc4b2fb874f79fb4fec0b07cf7f6ca6ac95616e1d164ef210a0645a1aa9_003FIFactory_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkInformation_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5b1b048ea0e94b28ad7cbac8ef6bc4c26e00_003Fb4_003Fff405095_003FNetworkInformation_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AProportionalDock_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F91c655b1795150937d9264ac1431c463ed5e5e8ad0286ad17e16f16175d94_003FProportionalDock_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
diff --git a/Blacklight/App.axaml.cs b/Blacklight/App.axaml.cs
index aa5af35..0f9ba21 100644
--- a/Blacklight/App.axaml.cs
+++ b/Blacklight/App.axaml.cs
@@ -47,6 +47,7 @@ public partial class App : Application
             var path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "blacklight", "login.json");
             try
             {
+                Console.WriteLine("Deleting login.json");
                 File.Delete(path);
             }
             catch (Exception ex)
diff --git a/Blacklight/Assets/dead.png b/Blacklight/Assets/dead.png
new file mode 100644
index 0000000000000000000000000000000000000000..19e04b037576294cc953a9cf6cde12343ff22a1f
GIT binary patch
literal 3815
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
Fng9SnTHpWx

literal 0
HcmV?d00001

diff --git a/Blacklight/ViewModels/LoginViewModel.cs b/Blacklight/ViewModels/LoginViewModel.cs
index 5c3c558..203c6f3 100644
--- a/Blacklight/ViewModels/LoginViewModel.cs
+++ b/Blacklight/ViewModels/LoginViewModel.cs
@@ -2,6 +2,8 @@
 using System.IO;
 using System.Threading;
 using System.Windows.Input;
+using Avalonia.Media.Imaging;
+using Avalonia.Platform;
 using Avalonia.Threading;
 using Blacklight.Util;
 using Blacklight.Views.Login;
@@ -31,6 +33,7 @@ public class LoginViewModel : ViewModelBase
     private string _password = string.Empty;
     private string? _loginError;
     private string _loadingText = "Loading...";
+    private bool _loadingError;
 
     public string Email
     {
@@ -56,6 +59,12 @@ public class LoginViewModel : ViewModelBase
         set => SetProperty(ref _networkError, value);
     }
 
+    public bool LoadingError
+    {
+        get => _loadingError;
+        set => SetProperty(ref _loadingError, value);
+    }
+
     public string? LoginError
     {
         get => _loginError;
@@ -96,6 +105,7 @@ public class LoginViewModel : ViewModelBase
         var network = await Client.GetNetworkAsync(new Uri(persistentData.NetworkBase));
         if (network.success)
         {
+            Client.UseToken(null, "temp");
             Client.NetworkInformation = network.networkInformation;
             Client.UseToken(persistentData.AccessToken, persistentData.RefreshToken);
             Console.WriteLine("Found token, showing ClientView");
@@ -104,7 +114,8 @@ public class LoginViewModel : ViewModelBase
         }
         else
         {
-            LoadingText = $"Failed to connect to network :<  ({network.error})";
+            LoadingText = $"{network.error}";
+            LoadingError = true;
         }
     }
     
@@ -132,7 +143,26 @@ public class LoginViewModel : ViewModelBase
         set => SetProperty(ref _loadingText, value);
     }
 
+    public ICommand ErrorResetCommand => new RelayCommand(ErrorReset);
 
+
+    private void ErrorReset()
+    {
+        Client.LogOut();
+        Client.RunLogOut();
+        var path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "blacklight", "login.json");
+        try
+        {
+            Console.WriteLine("Deleting login.json");
+            File.Delete(path);
+        }
+        catch (Exception ex)
+        {
+            Console.Error.WriteLine(ex);
+        }
+        UseSolstice();
+    }
+    
     private async void Login()
     {
         LoginError = string.Empty;
diff --git a/Blacklight/Views/Login/Loading.axaml b/Blacklight/Views/Login/Loading.axaml
index 3f36c7a..b537e69 100644
--- a/Blacklight/Views/Login/Loading.axaml
+++ b/Blacklight/Views/Login/Loading.axaml
@@ -8,7 +8,7 @@
              x:Class="Blacklight.Views.Login.Loading"
              x:DataType="viewModels:LoginViewModel">
 	<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
-		<gif:GifImage HorizontalAlignment="Center" VerticalAlignment="Center" Source="avares://Blacklight/Assets/loading.gif" >
+		<gif:GifImage IsVisible="{Binding !LoadingError}" HorizontalAlignment="Center" VerticalAlignment="Center" Source="avares://Blacklight/Assets/loading.gif">
 			<gif:GifImage.Effect>
 				<DropShadowEffect Color="#FFFFFF"
 				                  BlurRadius="50"
@@ -16,6 +16,16 @@
 				                  Opacity="0.5"/>
 			</gif:GifImage.Effect>
 		</gif:GifImage>
-		<TextBlock HorizontalAlignment="Center" Text="{Binding LoadingText, FallbackValue='Loading...'}" />
+		<Image IsVisible="{Binding LoadingError}" MaxHeight="219" HorizontalAlignment="Center" VerticalAlignment="Center" Source="avares://Blacklight/Assets/dead.png">
+			<Image.Effect>
+				<DropShadowEffect Color="#FFFFFF"
+				                  BlurRadius="50"
+				                  OffsetX="0" OffsetY="0"
+				                  Opacity="0.5"/>
+			</Image.Effect>
+		</Image>
+		
+		<TextBlock TextWrapping="Wrap" HorizontalAlignment="Center" Text="{Binding LoadingText, FallbackValue='Loading...'}" />
+		<Button HorizontalAlignment="Center" IsVisible="{Binding LoadingError}" Command="{Binding ErrorResetCommand}">Log out</Button>
 	</StackPanel>
 </UserControl>
diff --git a/Blacklight/Views/MainWindow.axaml b/Blacklight/Views/MainWindow.axaml
index 93cddb0..41e4f73 100644
--- a/Blacklight/Views/MainWindow.axaml
+++ b/Blacklight/Views/MainWindow.axaml
@@ -26,14 +26,14 @@
 		<ResourceDictionary>
 			<ResourceDictionary.ThemeDictionaries>
 				<ResourceDictionary x:Key="Light">
-					<SolidColorBrush x:Key="RightBeltColor">#F2e9e9e9</SolidColorBrush>
-					<SolidColorBrush x:Key="NavBarColor">#F2D4DCE2</SolidColorBrush>
+					<SolidColorBrush x:Key="RightBeltColor">#E2e9e9e9</SolidColorBrush>
+					<SolidColorBrush x:Key="NavBarColor">#E2D4DCE2</SolidColorBrush>
 					<SolidColorBrush x:Key="NavBarBorderColor">#e1e0dd</SolidColorBrush>
-					<SolidColorBrush x:Key="ResourceExplorerColor">#F2e9e9e9</SolidColorBrush>
+					<SolidColorBrush x:Key="ResourceExplorerColor">#E2e9e9e9</SolidColorBrush>
 					<SolidColorBrush x:Key="ResourceExplorerBorderColor">#e1e0dd</SolidColorBrush>
 					<SolidColorBrush x:Key="BottomBarColor">#e9e9e9</SolidColorBrush>
-					<SolidColorBrush x:Key="DocumentColor">#E6e9e9e9</SolidColorBrush>
-					<SolidColorBrush x:Key="TabStripColor">#F2e9e9e9</SolidColorBrush>
+					<SolidColorBrush x:Key="DocumentColor">#D6e9e9e9</SolidColorBrush>
+					<SolidColorBrush x:Key="TabStripColor">#E2e9e9e9</SolidColorBrush>
 					<SolidColorBrush x:Key="TabPointerOverColor">#1E00FF00</SolidColorBrush>
 					<SolidColorBrush x:Key="DockApplicationAccentBrushLow">Transparent</SolidColorBrush>
 					<SolidColorBrush x:Key="DockApplicationAccentBrushMed">Transparent</SolidColorBrush>
diff --git a/Lightquark.NET/Client.cs b/Lightquark.NET/Client.cs
index 28731d3..19ddf4f 100644
--- a/Lightquark.NET/Client.cs
+++ b/Lightquark.NET/Client.cs
@@ -78,11 +78,12 @@ public partial class Client : ObservableObject
                 }
             }
         }
-        
-        if (e.PropertyName == "RefreshToken" && RefreshToken == null && OnLogOut != null)
+        Console.WriteLine($"Detected {e.PropertyName} change");
+
+        if (e.PropertyName == "RefreshToken" && RefreshToken == null)
         {
-            OnLogOut.Invoke();
-            _refreshTimer?.Dispose();
+            Console.WriteLine("Detected LogOut");
+            RunLogOut();
         }
         base.OnPropertyChanged(e);
     }
diff --git a/Lightquark.NET/ClientMethods/Login.cs b/Lightquark.NET/ClientMethods/Login.cs
index 9b77f8e..d0be610 100644
--- a/Lightquark.NET/ClientMethods/Login.cs
+++ b/Lightquark.NET/ClientMethods/Login.cs
@@ -46,7 +46,7 @@ public partial class Client
         }
     }
 
-    public async void UseToken(string accessToken, string refreshToken)
+    public void UseToken(string? accessToken, string refreshToken)
     {
         RefreshToken = refreshToken;
         AccessToken = accessToken;
@@ -96,4 +96,11 @@ public partial class Client
         AccessToken = null;
         RefreshToken = null;
     }
+
+    public void RunLogOut()
+    {
+        Console.WriteLine("Logging out!");
+        OnLogOut?.Invoke();
+        _refreshTimer?.Dispose();
+    }
 }
\ No newline at end of file
-- 
GitLab