Skip to content

Commit 427560d

Browse files
authored
Fix Pop-In in LazyRouter (#32)
Closes #31
1 parent 00975dc commit 427560d

File tree

1 file changed

+36
-14
lines changed

1 file changed

+36
-14
lines changed

src/LazyComponents/LazyRoute/LazyRouter.cs

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ public class LazyRouter : IComponent, IHandleAfterRender, IDisposable
2727

2828
[Inject] private IAssemblyLoader _assemblyLoader { get; set; } = null!;
2929

30-
[Parameter] public RenderFragment<string> Loading { get; set; } = null!;
30+
[Parameter] public RenderFragment<string?> Loading { get; set; } = null!;
31+
32+
private bool isFirstRender = true;
3133

3234
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3335

@@ -77,6 +79,7 @@ public void Attach(RenderHandle renderHandle)
7779
_renderHandle = renderHandle;
7880
_baseUri = NavigationManager.BaseUri;
7981
_locationAbsolute = NavigationManager.Uri;
82+
8083
NavigationManager.LocationChanged += OnLocationChanged;
8184
}
8285

@@ -113,7 +116,8 @@ public async Task SetParametersAsync(ParameterView parameters)
113116
throw new InvalidOperationException($"The {nameof(LazyRouter)} component requires a value for the parameter {nameof(NotFound)}.");
114117
}
115118

116-
await RefreshRouteTable().ConfigureAwait(true); // only render thread
119+
await PerformInitialRouting();
120+
await RefreshLazyRouteTableAsync();
117121
}
118122

119123
public void Dispose()
@@ -163,7 +167,7 @@ private async Task PerformModuleLoadAsync(string moduleName)
163167

164168
if (lazyPageAssembly == null)
165169
{
166-
_renderHandle.Render(Loading(moduleName)); // show loading RenderFragment
170+
Render(Loading(moduleName)); // show loading RenderFragment
167171

168172
lazyPageAssembly = await _assemblyLoader
169173
.LoadAssemblyByNameAsync(new AssemblyName
@@ -183,12 +187,23 @@ private async Task PerformModuleLoadAsync(string moduleName)
183187
? new[] { lazyPageAssembly }
184188
: AdditionalAssemblies.Concat(new[] { lazyPageAssembly });
185189

186-
await RefreshRouteTable(); // from render thread
190+
await RefreshLazyRouteTableAsync();
187191
}
188192

189-
private async Task RefreshRouteTable()
193+
private Task PerformInitialRouting()
190194
{
191-
var createLazyRoutesTask = GetLazyRoutes().ConfigureAwait(true); // continue in render thread
195+
var assemblies = AdditionalAssemblies == null
196+
? new[] { AppAssembly }
197+
: new[] { AppAssembly }.Concat(AdditionalAssemblies);
198+
199+
Routes = RouteTableFactory.Create(assemblies);
200+
201+
return PerformNavigationAsync(isNavigationIntercepted: false); // from render thread
202+
}
203+
204+
private async Task RefreshLazyRouteTableAsync()
205+
{
206+
var createLazyRoutesTask = GetLazyRoutes(); // continue in render thread
192207

193208
var assemblies = AdditionalAssemblies == null
194209
? new[] { AppAssembly }
@@ -258,7 +273,7 @@ private Task PerformNavigationAsync(bool isNavigationIntercepted)
258273
typeHandler,
259274
context.Parameters ?? _emptyParametersDictionary);
260275

261-
_renderHandle.Render(Found(routeData));
276+
Render(Found(routeData));
262277
return Task.CompletedTask;
263278
}
264279

@@ -270,20 +285,27 @@ private Task PerformNavigationAsync(bool isNavigationIntercepted)
270285
}
271286
}
272287

273-
if (!isNavigationIntercepted)
288+
if (isFirstRender)
274289
{
275-
// We did not find a Component that matches the route.
276-
// Only show the NotFound content if the application developer programatically got us here i.e we did not
277-
// intercept the navigation. In all other cases, force a browser navigation since this could be non-Blazor content.
278-
_renderHandle.Render(NotFound);
290+
Render(Loading(null));
291+
return Task.CompletedTask;
279292
}
280-
else
293+
294+
if (!isNavigationIntercepted)
281295
{
282-
NavigationManager.NavigateTo(_locationAbsolute, forceLoad: true);
296+
Render(NotFound);
283297
}
284298

299+
NavigationManager.NavigateTo(_locationAbsolute, forceLoad: true);
300+
285301
return Task.CompletedTask;
286302
}
303+
304+
private void Render(RenderFragment fragment)
305+
{
306+
_renderHandle.Render(fragment);
307+
isFirstRender = false;
308+
}
287309
}
288310

289311
internal class LazyRouteHandler

0 commit comments

Comments
 (0)