|
| 1 | +using FwLiteShared.Services; |
1 | 2 | using Microsoft.AspNetCore.Components.WebView; |
2 | | -using Microsoft.Extensions.Hosting; |
3 | 3 | using Microsoft.Extensions.Logging; |
4 | | -using Microsoft.Extensions.Options; |
| 4 | +using Microsoft.JSInterop; |
5 | 5 |
|
6 | 6 | namespace FwLiteMaui; |
7 | 7 |
|
8 | 8 | public partial class MainPage : ContentPage |
9 | 9 | { |
10 | | - public MainPage() |
| 10 | + private readonly ILogger<MainPage> _logger; |
| 11 | + |
| 12 | + public MainPage(IPreferencesService preferences, ILogger<MainPage> logger) |
11 | 13 | { |
| 14 | + _logger = logger; |
12 | 15 | InitializeComponent(); |
| 16 | + var lastUrlFromPrefs = preferences.Get(nameof(PreferenceKey.AppLastUrl)); |
13 | 17 | blazorWebView.BlazorWebViewInitializing += BlazorWebViewInitializing; |
14 | 18 | blazorWebView.BlazorWebViewInitialized += BlazorWebViewInitialized; |
| 19 | + blazorWebView.BlazorWebViewInitialized += (s, e) => |
| 20 | + { |
| 21 | + // Decide initial StartPath here (after Android intent is processed) to avoid cold-start race |
| 22 | + var initial = App.OverrideStartupUrl ?? lastUrlFromPrefs ?? "/"; |
| 23 | + //only change it if it's still the default, might have been changed already, for example when opening a new window |
| 24 | + if (blazorWebView.StartPath == "/") |
| 25 | + blazorWebView.StartPath = initial; |
| 26 | + App.OverrideStartupUrl = null; |
| 27 | + }; |
15 | 28 | blazorWebView.UrlLoading += BlazorWebViewOnUrlLoading; |
16 | 29 | } |
17 | 30 |
|
18 | | - |
19 | | - |
20 | 31 | internal string StartPath |
21 | 32 | { |
22 | 33 | get => blazorWebView.StartPath; |
23 | 34 | set => blazorWebView.StartPath = value; |
24 | 35 | } |
25 | 36 |
|
| 37 | + internal void LoadAppUrl(string url) |
| 38 | + { |
| 39 | + blazorWebView.StartPath = url; |
| 40 | + _ = blazorWebView.TryDispatchAsync(services => |
| 41 | + { |
| 42 | + var jsRuntime = services.GetService<IJSRuntime>(); |
| 43 | + if (jsRuntime != null) |
| 44 | + _ = NavigateAsync(jsRuntime, url); |
| 45 | + }); |
| 46 | + } |
| 47 | + |
| 48 | + private async Task NavigateAsync(IJSRuntime jsRuntime, string url) |
| 49 | + { |
| 50 | + try |
| 51 | + { |
| 52 | + await jsRuntime.InvokeVoidAsync("lexbox.SvelteNavigate", url, new { replace = true }); |
| 53 | + } |
| 54 | + catch (Exception e) |
| 55 | + { |
| 56 | + _logger.LogError(e, "Failed to navigate to {Url} via SvelteNavigate", url); |
| 57 | + } |
| 58 | + } |
| 59 | + |
26 | 60 | #if ANDROID || WINDOWS |
27 | 61 | private partial void BlazorWebViewInitializing(object? sender, BlazorWebViewInitializingEventArgs e); |
28 | 62 | private partial void BlazorWebViewInitialized(object? sender, BlazorWebViewInitializedEventArgs e); |
|
0 commit comments