diff --git a/Iceshrimp.Frontend/Core/Schemas/StoredUser.cs b/Iceshrimp.Frontend/Core/Schemas/StoredUser.cs index 46bfc1e0..6103d907 100644 --- a/Iceshrimp.Frontend/Core/Schemas/StoredUser.cs +++ b/Iceshrimp.Frontend/Core/Schemas/StoredUser.cs @@ -8,4 +8,10 @@ public class StoredUser : UserResponse [JsonPropertyName("token")] public required string Token { get; set; } public bool IsAdmin { get; set; } public bool IsModerator { get; set; } +} + +public class MinimalStoredUser { + [JsonPropertyName("token")] public required string Token { get; set; } + public required string Id { get; set; } + public required string Username { get; set; } } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Core/Services/SessionService.cs b/Iceshrimp.Frontend/Core/Services/SessionService.cs index adebd757..799208b5 100644 --- a/Iceshrimp.Frontend/Core/Services/SessionService.cs +++ b/Iceshrimp.Frontend/Core/Services/SessionService.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using Blazored.LocalStorage; using Iceshrimp.Frontend.Core.Schemas; using Iceshrimp.Shared.Schemas.Web; @@ -15,7 +16,15 @@ internal class SessionService LocalStorage = localStorage; Js = js; Logger = logger; - Users = LocalStorage.GetItem>("Users") ?? []; + try + { + Users = LocalStorage.GetItem>("Users") ?? []; + } + catch (JsonException e) + { + Logger.LogError($"Stored users are malformed, reconstructing to a minimal form: {e.Message}"); + Users = ReconstructUsers(); + } var lastUser = LocalStorage.GetItem("last_user"); if (lastUser != null) { @@ -79,6 +88,51 @@ internal class SessionService } } + private Dictionary ReconstructUsers() + { + var newUsers = new Dictionary(); + + var users = new Dictionary(); + try + { + users = LocalStorage.GetItem>("Users") ?? []; + } + catch (JsonException e) + { + Logger.LogWarning($"Users couldn't be reconstructed to a minimum state: {e.Message}"); + } + + foreach (var user in users.Values) + { + var stored = new StoredUser + { + Id = user.Id, + Username = user.Username, + Host = null, + DisplayName = null, + AvatarUrl = $"/identicon/{user.Id}", + AvatarAlt = null, + BannerUrl = null, + BannerAlt = null, + InstanceName = null, + InstanceIconUrl = null, + IsBot = false, + IsCat = false, + Emojis = [], + MovedTo = null, + Token = user.Token, + IsAdmin = false, + IsModerator = false + }; + + newUsers.Add(user.Id, stored); + } + + LocalStorage.SetItem("Users", newUsers); + LocalStorage.RemoveItem("last_user"); + return newUsers; + } + public void DeleteUser(string id) { if (id == Current?.Id) throw new ArgumentException("Cannot remove current user.");