Przeglądaj źródła

Logged in events

Krzysztof Krysiński 2 tygodni temu
rodzic
commit
d15574dd23

+ 2 - 0
src/PixiEditor.Extensions.CommonApi/User/IUserDataProvider.cs

@@ -6,4 +6,6 @@ public interface IUserDataProvider
     public string Username { get; }
     public string AccountProviderName { get; }
     public string[] GetOwnedContent();
+    public event Action UserLoggedIn;
+    public event Action UserLoggedOut;
 }

+ 13 - 0
src/PixiEditor.Extensions.Sdk/Api/UserData/UserDataProvider.cs

@@ -5,6 +5,9 @@ namespace PixiEditor.Extensions.Sdk.Api.UserData;
 
 public class UserDataProvider : IUserDataProvider
 {
+    public event Action UserLoggedIn;
+    public event Action UserLoggedOut;
+
     public bool IsLoggedIn => Native.is_user_logged_in();
     public string Username => Native.get_username();
     public string AccountProviderName => Native.get_account_provider_name();
@@ -12,4 +15,14 @@ public class UserDataProvider : IUserDataProvider
     {
         return Interop.GetOwnedContent();
     }
+
+    internal void OnUserLoggedIn()
+    {
+        UserLoggedIn?.Invoke();
+    }
+
+    internal void OnUserLoggedOut()
+    {
+        UserLoggedOut?.Invoke();
+    }
 }

+ 12 - 0
src/PixiEditor.Extensions.Sdk/Bridge/Native.User.cs

@@ -15,4 +15,16 @@ internal static partial class Native
 
     [MethodImpl(MethodImplOptions.InternalCall)]
     public static extern IntPtr get_owned_content();
+
+    [ApiExport("on_user_logged_in")]
+    internal static void OnUserLoggedIn()
+    {
+        PixiEditorExtension.Api.UserDataProvider.OnUserLoggedIn();
+    }
+
+    [ApiExport("on_user_logged_out")]
+    internal static void OnUserLoggedOut()
+    {
+        PixiEditorExtension.Api.UserDataProvider.OnUserLoggedOut();
+    }
 }

+ 20 - 0
src/PixiEditor.Extensions.WasmRuntime/Api/Modules/EventsModule.cs

@@ -0,0 +1,20 @@
+namespace PixiEditor.Extensions.WasmRuntime.Api.Modules;
+
+public class EventsModule : ApiModule
+{
+    public EventsModule(WasmExtensionInstance extension) : base(extension)
+    {
+        extension.Api.UserDataProvider.UserLoggedIn += OnUserLoggedIn;
+        extension.Api.UserDataProvider.UserLoggedOut += OnUserLoggedOut;
+    }
+
+    private void OnUserLoggedIn()
+    {
+        Extension.Instance?.GetAction("on_user_logged_in")?.Invoke();
+    }
+
+    private void OnUserLoggedOut()
+    {
+        Extension.Instance?.GetAction("on_user_logged_out")?.Invoke();
+    }
+}

+ 1 - 0
src/PixiEditor.Extensions.WasmRuntime/WasmExtensionInstance.cs

@@ -72,6 +72,7 @@ public partial class WasmExtensionInstance : Extension
         modules.Add(new PreferencesModule(this, Api.Preferences));
         modules.Add(new CommandModule(this, Api.Commands,
             (ICommandSupervisor)Api.Services.GetService(typeof(ICommandSupervisor))));
+        modules.Add(new EventsModule(this));
         LayoutBuilder = new LayoutBuilder(new ExtensionResourceStorage(this), (ElementMap)Api.Services.GetService(typeof(ElementMap)));
         //SetElementMap();
         Instance.GetAction("initialize")?.Invoke();

+ 11 - 0
src/PixiEditor.Extensions/FlyUI/Elements/StatefulElement.cs

@@ -1,6 +1,7 @@
 using System.Collections.Immutable;
 using Avalonia.Controls;
 using Avalonia.Controls.Presenters;
+using Avalonia.Threading;
 using PixiEditor.Extensions.CommonApi.FlyUI;
 using PixiEditor.Extensions.CommonApi.FlyUI.State;
 
@@ -58,6 +59,16 @@ public abstract class StatefulElement<TState> : LayoutElement,
     // React seems not to do that, so there might be a reason for that, however, it would be good to check out the topic more
     public void ContentFromLayout(ILayoutElement<Control> newTree)
     {
+        if (_content == null)
+        {
+            Dispatcher.UIThread.Invoke(() =>
+            {
+                CreateNativeControl();
+            });
+
+            return;
+        }
+
         PerformDiff(_content, newTree);
     }
 

+ 8 - 2
src/PixiEditor.IdentityProvider.PixiAuth/PixiAuthIdentityProvider.cs

@@ -1,4 +1,5 @@
-using PixiEditor.OperatingSystem;
+using Avalonia.Threading;
+using PixiEditor.OperatingSystem;
 using PixiEditor.PixiAuth;
 using PixiEditor.PixiAuth.Exceptions;
 using PixiEditor.PixiAuth.Utils;
@@ -21,6 +22,7 @@ public class PixiAuthIdentityProvider : IIdentityProvider
     public event Action<string>? UsernameUpdated;
     public event Action<PixiUser>? LoginRequestSuccessful;
     public event Action<double>? LoginTimeout;
+    public event Action<IUser>? OnLoggedIn;
     public event Action? LoggedOut;
 
     IUser IIdentityProvider.User => User;
@@ -50,6 +52,7 @@ public class PixiAuthIdentityProvider : IIdentityProvider
     }
 
 
+
     public async Task RequestLogin(string email)
     {
         if (!apiValid) return;
@@ -269,7 +272,9 @@ public class PixiAuthIdentityProvider : IIdentityProvider
                     OwnedProductsUpdated?.Invoke(new List<ProductData>(User.OwnedProducts));
                 }
 
-                Task.Run(async () =>
+                OnLoggedIn?.Invoke(User);
+
+                Dispatcher.UIThread.InvokeAsync(async () =>
                 {
                     string username = User.Username;
                     User.Username = await TryFetchUserName(User.EmailHash);
@@ -278,6 +283,7 @@ public class PixiAuthIdentityProvider : IIdentityProvider
                         UsernameUpdated?.Invoke(User.Username);
                         SaveUserInfo();
                     }
+
                 });
 
                 SaveUserInfo();

+ 2 - 0
src/PixiEditor.IdentityProvider/IIdentityProvider.cs

@@ -13,4 +13,6 @@ public interface IIdentityProvider
     public event Action<string> UsernameUpdated;
 
     public void Initialize();
+    public event Action<IUser> OnLoggedIn;
+    public event Action LoggedOut;
 }

+ 17 - 0
src/PixiEditor/Models/ExtensionServices/UserDataProvider.cs

@@ -12,10 +12,27 @@ internal class UserDataProvider : IUserDataProvider
     public string Username => UserViewModel.Username;
     public string AccountProviderName => UserViewModel.IdentityProvider?.ProviderName ?? string.Empty;
 
+    public event Action? UserLoggedIn;
+    public event Action? UserLoggedOut;
+
     public UserDataProvider(UserViewModel userViewModel, AdditionalContentViewModel additionalContentViewModel)
     {
         UserViewModel = userViewModel;
         AdditionalContentViewModel = additionalContentViewModel;
+        if (UserViewModel.IdentityProvider == null)
+        {
+            return;
+        }
+
+        UserViewModel.IdentityProvider.OnLoggedIn += (u) =>
+        {
+            UserLoggedIn?.Invoke();
+        };
+
+        UserViewModel.IdentityProvider.LoggedOut += () =>
+        {
+            UserLoggedOut?.Invoke();
+        };
     }
 
     public string[] GetOwnedContent()

+ 4 - 1
src/PixiEditor/ViewModels/SubViewModels/UserViewModel.cs

@@ -88,6 +88,7 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
     public bool NonDefaultIdentityProvider => IdentityProvider is not PixiAuthIdentityProvider;
     public bool AnyUpdateAvailable => OwnedProducts.Any(x => x.UpdateAvailable);
 
+    private IDisposable? timerCancelable;
 
     public static string FoundersBundleLink =>
 #if STEAM
@@ -243,7 +244,9 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
             },
             TimeSpan.FromSeconds(timeLeft));
 
-        DispatcherTimer.Run(() =>
+        timerCancelable?.Dispose();
+        timerCancelable = DispatcherTimer.Run(
+            () =>
         {
             NotifyProperties();
             return TimeToEndTimeout != null;