Making refresh behaviour more solid
This commit is contained in:
parent
65276d4984
commit
ce21244517
13 changed files with 70 additions and 17 deletions
|
@ -72,6 +72,7 @@
|
|||
if (!string.IsNullOrEmpty(Pic?.Id)) {
|
||||
await api.DeletePic(State.SelectedAddressName, Pic.Id);
|
||||
await State.RefreshPics();
|
||||
State.SendRefresh();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
|
@ -92,6 +93,7 @@
|
|||
if(!string.IsNullOrEmpty(Pic?.Id)) {
|
||||
await api.PostPicDescription(State.SelectedAddressName, Pic.Id, Description);
|
||||
await State.RefreshPics();
|
||||
State.SendRefresh();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
|
|
|
@ -91,6 +91,7 @@
|
|||
if (!string.IsNullOrEmpty(Status?.Id)) {
|
||||
await api.DeleteStatus(State.SelectedAddressName, Status.Id);
|
||||
await State.RefreshStatuses();
|
||||
State.SendRefresh();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
|
@ -112,6 +113,7 @@
|
|||
if (!string.IsNullOrEmpty(Status?.Id)) {
|
||||
await api.PatchStatus(State.SelectedAddressName, Status.Id, Content, Emoji);
|
||||
await State.RefreshStatuses();
|
||||
State.SendRefresh();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
|
|
|
@ -19,13 +19,13 @@
|
|||
}
|
||||
|
||||
public async Task Reload() {
|
||||
if (Html == null){
|
||||
// if (Html == null){
|
||||
Html = await api.GetHtml(Url);
|
||||
string? HtmlString = Html?.ToString();
|
||||
HtmlString = HtmlString?.Replace("</head>", "<base target='_blank'></head>");
|
||||
HtmlString = HtmlString?.Replace("</body>", "<script src='https://cdn.jsdelivr.net/npm/@iframe-resizer/child'></script></body>");
|
||||
Html = (MarkupString)HtmlString;
|
||||
}
|
||||
// }
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@
|
|||
if(!string.IsNullOrEmpty(Description) && response != null && !string.IsNullOrEmpty(response.Id)) {
|
||||
await api.PostPicDescription(State.SelectedAddressName, response.Id, Description);
|
||||
await State.RefreshPics();
|
||||
State.SendRefresh();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
|
|
|
@ -81,8 +81,9 @@
|
|||
var result = await api.StatusPost(State!.SelectedAddressName!, post);
|
||||
if(result != null){
|
||||
await State.RefreshStatuses();
|
||||
State.SendRefresh();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
navigationManager.NavigateTo("/statuslog/latest");
|
||||
// navigationManager.NavigateTo("/statuslog/latest");
|
||||
}
|
||||
|
||||
this.Active = false;
|
||||
|
|
|
@ -65,9 +65,11 @@ else {
|
|||
|
||||
private async void StateChanged(object? sender, PropertyChangedEventArgs e) {
|
||||
if (e.PropertyName == nameof(State.IsRefreshing) && State.IsRefreshing) {
|
||||
addresses = await State.GetDirectory(true);
|
||||
GroupAddresses();
|
||||
State.IsRefreshing = false;
|
||||
using (State.GetRefreshToken()) {
|
||||
addresses = await State.GetDirectory(true);
|
||||
GroupAddresses();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,8 +36,10 @@
|
|||
|
||||
private async void StateChanged(object? sender, PropertyChangedEventArgs e) {
|
||||
if (e.PropertyName == nameof(State.IsRefreshing) && State.IsRefreshing) {
|
||||
messages = await State.GetEphemeralMessages(true);
|
||||
State.IsRefreshing = false;
|
||||
using (State.GetRefreshToken()) {
|
||||
messages = await State.GetEphemeralMessages(true);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -43,8 +43,10 @@
|
|||
|
||||
private async void StateChanged(object? sender, PropertyChangedEventArgs e) {
|
||||
if (e.PropertyName == nameof(State.IsRefreshing) && State.IsRefreshing) {
|
||||
garden = await State.GetNowGarden(true);
|
||||
State.IsRefreshing = false;
|
||||
using (State.GetRefreshToken()){
|
||||
garden = await State.GetNowGarden(true);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -129,6 +129,18 @@
|
|||
if (fragment.EndsWith("now")) await ReloadNow();
|
||||
else if (fragment.EndsWith("profile")) await ReloadProfile();
|
||||
bio = await State.GetBio(Address);
|
||||
State.PropertyChanged += StateChanged;
|
||||
}
|
||||
|
||||
private async void StateChanged(object? sender, PropertyChangedEventArgs e) {
|
||||
if (e.PropertyName == nameof(State.IsRefreshing) && State.IsRefreshing) {
|
||||
using (State.GetRefreshToken()){
|
||||
await ReloadNow();
|
||||
await ReloadProfile();
|
||||
bio = await State.GetBio(Address);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ReloadNow() {
|
||||
|
|
|
@ -34,8 +34,10 @@
|
|||
|
||||
private async void StateChanged(object? sender, PropertyChangedEventArgs e) {
|
||||
if (e.PropertyName == nameof(State.IsRefreshing) && State.IsRefreshing) {
|
||||
pics = await PicsFunc(true);
|
||||
State.IsRefreshing = false;
|
||||
using (State.GetRefreshToken()){
|
||||
pics = await PicsFunc(true);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
@inject State State
|
||||
|
||||
<button id="refreshButton" class="absolute transparent circle top right margin" @onclick="() => State.IsRefreshing = true">
|
||||
<button id="refreshButton" class="absolute transparent circle top right margin" @onclick="() => State.SendRefresh()">
|
||||
<i class="fa-solid fa-arrow-rotate-right @(State.IsRefreshing ? "fa-spin" : "")"></i>
|
||||
</button>
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
public bool Editable { get; set; } = false;
|
||||
|
||||
public EditStatusDialog? Dialog { get; set; }
|
||||
|
||||
|
||||
private List<Status>? statuses;
|
||||
|
||||
protected override async Task OnInitializedAsync() {
|
||||
|
@ -33,8 +33,10 @@
|
|||
|
||||
private async void StateChanged(object? sender, PropertyChangedEventArgs e) {
|
||||
if (e.PropertyName == nameof(State.IsRefreshing) && State.IsRefreshing) {
|
||||
statuses = await StatusFunc(true);
|
||||
State.IsRefreshing = false;
|
||||
using (State.GetRefreshToken()) {
|
||||
statuses = await StatusFunc(true);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -70,12 +70,37 @@ namespace Neighbourhood.omg.lol.Models {
|
|||
private bool _isRefreshing;
|
||||
public bool IsRefreshing {
|
||||
get => _isRefreshing;
|
||||
set {
|
||||
private set {
|
||||
_isRefreshing = value;
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsRefreshing)));
|
||||
}
|
||||
}
|
||||
|
||||
public void SendRefresh() => IsRefreshing = true;
|
||||
|
||||
private static int _refresherCount = 0;
|
||||
private static Mutex mutex = new Mutex();
|
||||
|
||||
public class RefreshToken : IDisposable {
|
||||
public event EventHandler? Disposed;
|
||||
public void Dispose() => Disposed?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
public RefreshToken GetRefreshToken() {
|
||||
mutex.WaitOne();
|
||||
_refresherCount++;
|
||||
mutex.ReleaseMutex();
|
||||
RefreshToken token = new RefreshToken();
|
||||
token.Disposed += RefreshToken_Disposed;
|
||||
return token;
|
||||
}
|
||||
|
||||
private void RefreshToken_Disposed(object? sender, EventArgs e) {
|
||||
mutex.WaitOne();
|
||||
_refresherCount--;
|
||||
if (_refresherCount == 0) IsRefreshing = false;
|
||||
mutex.ReleaseMutex();
|
||||
}
|
||||
|
||||
private bool _canRefresh;
|
||||
public bool CanRefresh {
|
||||
get => _canRefresh;
|
||||
|
|
Loading…
Reference in a new issue