Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions tests/IgniteUI.Blazor.Lite.TestBed/Components/Pages/Home.razor
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
private Dictionary<string, object> componentParameters = new();
private List<string> errorMessages = new List<string>();
private string eventMessage = string.Empty;
private TaskCompletionSource<bool>? pendingRender;

private IConfigurationRoot config;

Expand All @@ -40,6 +41,10 @@

protected override async Task OnAfterRenderAsync(bool firstRender)
{
var renderTcs = this.pendingRender;
this.pendingRender = null;
renderTcs?.TrySetResult(true);

Comment on lines 42 to +47
if (firstRender)
{
await JS.InvokeVoidAsync("onAfterRender");
Expand Down Expand Up @@ -300,8 +305,7 @@
}
// set prop and wait for state to change
parameters.Add(p.Name, value!);
StateHasChanged();
await Task.Delay(1);
await WaitForRenderAsync(p.Name);

var clientPropName = ReflectionUtils.GetActualPropertyName(p);
var clientValue = await GetClientPropValue(clientPropName);
Expand All @@ -316,6 +320,31 @@
}
}

private async Task WaitForRenderAsync(string propName, int timeoutMs = 1000)
{
var renderTcs = this.pendingRender;
if (renderTcs == null || renderTcs.Task.IsCompleted)
{
renderTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
this.pendingRender = renderTcs;
}

// trigger StateHasChanged to request a render.
await InvokeAsync(StateHasChanged);

// when render task finishes in OnAfterRenderAsync (or on timeout) continue.
var completed = await Task.WhenAny(renderTcs.Task, Task.Delay(timeoutMs));
if (completed != renderTcs.Task)
{
if (ReferenceEquals(this.pendingRender, renderTcs))
{
this.pendingRender = null;
}

this.errorMessages.Add("Timed out waiting for component render after setting property: " + propName);
}
}

// in cases of slower operations, connection closes and execution stops, hence adding a try catch with a 5 second timeout and retry if needed.
public async Task<string> GetClientPropValue(string propName, int retry = 1)
{
Expand Down
Loading