[frontend] Refactor MessageSvc to implement note deletion (ISH-404)
This commit is contained in:
parent
ce2be3d095
commit
854979b359
5 changed files with 74 additions and 24 deletions
|
@ -15,6 +15,7 @@ public partial class Note : IDisposable
|
||||||
[Parameter] [EditorRequired] public required NoteResponse NoteResponse { get; set; }
|
[Parameter] [EditorRequired] public required NoteResponse NoteResponse { get; set; }
|
||||||
[Parameter] public bool Indented { get; set; }
|
[Parameter] public bool Indented { get; set; }
|
||||||
private bool _shouldRender = false;
|
private bool _shouldRender = false;
|
||||||
|
private IDisposable _noteChangedHandler = null!;
|
||||||
|
|
||||||
public void React(EmojiResponse emoji)
|
public void React(EmojiResponse emoji)
|
||||||
{
|
{
|
||||||
|
@ -122,7 +123,7 @@ public partial class Note : IDisposable
|
||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
MessageSvc.Register(NoteResponse.Id, OnNoteChanged);
|
_noteChangedHandler = MessageSvc.Register(NoteResponse.Id, OnNoteChanged, MessageService.Type.Updated);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reply()
|
public void Reply()
|
||||||
|
@ -176,10 +177,11 @@ public partial class Note : IDisposable
|
||||||
public async Task Delete()
|
public async Task Delete()
|
||||||
{
|
{
|
||||||
await ApiService.Notes.DeleteNote(NoteResponse.Id);
|
await ApiService.Notes.DeleteNote(NoteResponse.Id);
|
||||||
|
await MessageSvc.DeleteNote(NoteResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
MessageSvc.Unregister(NoteResponse.Id, OnNoteChanged);
|
_noteChangedHandler.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -66,10 +66,11 @@
|
||||||
[Parameter] [EditorRequired] public required int Depth { get; set; }
|
[Parameter] [EditorRequired] public required int Depth { get; set; }
|
||||||
[Parameter] [EditorRequired] public required int MaxDepth { get; set; }
|
[Parameter] [EditorRequired] public required int MaxDepth { get; set; }
|
||||||
private bool _indented = false;
|
private bool _indented = false;
|
||||||
|
private IDisposable _noteChangedHandler = null!;
|
||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
MessageService.Register(Note.Id, OnNoteChanged);
|
_noteChangedHandler = MessageService.Register(Note.Id, OnNoteChanged, MessageService.Type.Updated);
|
||||||
if (Depth > 0 || Note.Descendants?.Count > 0)
|
if (Depth > 0 || Note.Descendants?.Count > 0)
|
||||||
{
|
{
|
||||||
_indented = true;
|
_indented = true;
|
||||||
|
@ -99,6 +100,6 @@
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
MessageService.Unregister(Note.Id, OnNoteChanged);
|
_noteChangedHandler.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,27 +5,38 @@ namespace Iceshrimp.Frontend.Core.Services;
|
||||||
internal class MessageService
|
internal class MessageService
|
||||||
{
|
{
|
||||||
public event EventHandler<NoteResponse>? AnyNoteChanged;
|
public event EventHandler<NoteResponse>? AnyNoteChanged;
|
||||||
|
public event EventHandler<NoteResponse>? AnyNoteDeleted;
|
||||||
|
|
||||||
public Dictionary<string, EventHandler<NoteResponse>> NoteChangedHandlers = new();
|
private readonly Dictionary<(string, Type), EventHandler<NoteResponse>> _noteChangedHandlers = new();
|
||||||
|
|
||||||
public void Register(string id, EventHandler<NoteResponse> func)
|
|
||||||
|
public enum Type
|
||||||
{
|
{
|
||||||
if (NoteChangedHandlers.ContainsKey(id))
|
Updated,
|
||||||
|
Deleted
|
||||||
|
}
|
||||||
|
public NoteMessageHandler Register(string id, EventHandler<NoteResponse> func, Type type)
|
||||||
{
|
{
|
||||||
NoteChangedHandlers[id] += func;
|
var tuple = (id, type);
|
||||||
|
if (_noteChangedHandlers.ContainsKey(tuple))
|
||||||
|
{
|
||||||
|
_noteChangedHandlers[tuple] += func;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NoteChangedHandlers.Add(id, func);
|
_noteChangedHandlers.Add(tuple, func);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Unregister(string id, EventHandler<NoteResponse> func)
|
return new NoteMessageHandler(func, id, type, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Unregister(string id, EventHandler<NoteResponse> func, Type type)
|
||||||
{
|
{
|
||||||
if (NoteChangedHandlers.ContainsKey(id))
|
var tuple = (id, type);
|
||||||
|
if (_noteChangedHandlers.ContainsKey(tuple))
|
||||||
{
|
{
|
||||||
#pragma warning disable CS8601
|
#pragma warning disable CS8601
|
||||||
NoteChangedHandlers[id] -= func;
|
_noteChangedHandlers[tuple] -= func;
|
||||||
#pragma warning restore CS8601
|
#pragma warning restore CS8601
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -34,10 +45,39 @@ internal class MessageService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class NoteMessageHandler : IDisposable
|
||||||
|
{
|
||||||
|
private readonly EventHandler<NoteResponse> _handler;
|
||||||
|
private readonly string _id;
|
||||||
|
private readonly Type _type;
|
||||||
|
private readonly MessageService _messageService;
|
||||||
|
|
||||||
|
public NoteMessageHandler(EventHandler<NoteResponse> handler, string id, Type type, MessageService messageService)
|
||||||
|
{
|
||||||
|
_handler = handler;
|
||||||
|
_id = id;
|
||||||
|
_type = type;
|
||||||
|
_messageService = messageService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_messageService.Unregister(_id, _handler, _type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Task UpdateNote(NoteResponse note)
|
public Task UpdateNote(NoteResponse note)
|
||||||
{
|
{
|
||||||
AnyNoteChanged?.Invoke(this, note);
|
AnyNoteChanged?.Invoke(this, note);
|
||||||
NoteChangedHandlers.TryGetValue(note.Id, out var xHandler);
|
_noteChangedHandlers.TryGetValue((note.Id, Type.Updated), out var xHandler);
|
||||||
|
xHandler?.Invoke(this, note);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task DeleteNote(NoteResponse note)
|
||||||
|
{
|
||||||
|
AnyNoteDeleted?.Invoke(this, note);
|
||||||
|
_noteChangedHandlers.TryGetValue((note.Id, Type.Deleted), out var xHandler);
|
||||||
xHandler?.Invoke(this, note);
|
xHandler?.Invoke(this, note);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ internal class TimelineState : IDisposable
|
||||||
Timeline = timeline;
|
Timeline = timeline;
|
||||||
MessageService = messageService;
|
MessageService = messageService;
|
||||||
MessageService.AnyNoteChanged += OnNoteChanged;
|
MessageService.AnyNoteChanged += OnNoteChanged;
|
||||||
|
MessageService.AnyNoteDeleted += OnNoteDeleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnNoteChanged(object? _, NoteResponse note)
|
private void OnNoteChanged(object? _, NoteResponse note)
|
||||||
|
@ -48,12 +48,18 @@ internal class TimelineState : IDisposable
|
||||||
var i = Timeline.FindIndex(p => p.Id == note.Id);
|
var i = Timeline.FindIndex(p => p.Id == note.Id);
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
{
|
{
|
||||||
Timeline[i].Liked = note.Liked;
|
Timeline[i] = note;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnNoteDeleted(object? _, NoteResponse note)
|
||||||
|
{
|
||||||
|
Timeline.Remove(note);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
MessageService.AnyNoteChanged -= OnNoteChanged;
|
MessageService.AnyNoteChanged -= OnNoteChanged;
|
||||||
|
MessageService.AnyNoteDeleted -= OnNoteDeleted;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -62,6 +62,7 @@ else
|
||||||
private int _depth = 20;
|
private int _depth = 20;
|
||||||
private ElementReference Scroller { get; set; }
|
private ElementReference Scroller { get; set; }
|
||||||
private IDisposable? _locationChangingHandlerDisposable;
|
private IDisposable? _locationChangingHandlerDisposable;
|
||||||
|
private IDisposable? _noteChangedHandler;
|
||||||
|
|
||||||
protected override async Task OnParametersSetAsync()
|
protected override async Task OnParametersSetAsync()
|
||||||
{
|
{
|
||||||
|
@ -88,7 +89,7 @@ else
|
||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
if (NoteId != null) MessageService.Register(NoteId, OnNoteChanged);
|
if (NoteId != null) _noteChangedHandler = MessageService.Register(NoteId, OnNoteChanged, MessageService.Type.Updated);
|
||||||
_locationChangingHandlerDisposable = Navigation.RegisterLocationChangingHandler(LocationChangeHandler);
|
_locationChangingHandlerDisposable = Navigation.RegisterLocationChangingHandler(LocationChangeHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +143,7 @@ else
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
if (NoteId != null) MessageService.Unregister(NoteId, OnNoteChanged);
|
if (_noteChangedHandler != null) _noteChangedHandler.Dispose();
|
||||||
SaveState();
|
SaveState();
|
||||||
_locationChangingHandlerDisposable?.Dispose();
|
_locationChangingHandlerDisposable?.Dispose();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue