mh_custom/wtmProject.Shared/App.razor
2024-05-17 13:43:36 +08:00

124 lines
3.9 KiB
Plaintext

@using System.Text.RegularExpressions;
@inherits BasePage
@inject NavigationManager NavigationManager
<BootstrapBlazorRoot>
@if (hasToken == true || IsPublic == true)
{
<Router AppAssembly="@typeof(Program).Assembly" OnNavigateAsync="OnNavigateAsync">
<Found Context="routeData">
<CascadingValue Value="User" IsFixed="true">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</CascadingValue>
</Found>
<NotFound>
<LayoutView Layout="@typeof(EmptyLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
}
else if (hasToken == false)
{
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<CascadingValue Value="User" IsFixed="false">
<Login @bind-LoginSuccess="hasToken" OnUserInfoSet="async ()=> {User = await GetUserInfo(); }" />
</CascadingValue>
</Found>
<NotFound>
<LayoutView Layout="@typeof(EmptyLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
}
</BootstrapBlazorRoot>
@code {
private LoginUserInfo User;
private bool? hasToken { get; set; }
private bool? IsPublic { get; set; }
protected override void OnInitialized()
{
IsPublicPage();
base.OnInitialized();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
await JSRuntime.InvokeAsync<string>("commonFuncs.loadFinish");
var token = await GetToken();
if (string.IsNullOrEmpty(token))
{
hasToken = false;
}
else
{
var refreshtoken = await GetRefreshToken();
var rv = await WtmBlazor.Api.CallAPI<DynamicData>($"/api/_account/RefreshToken?refreshToken={refreshtoken}", HttpMethodEnum.POST, new { });
if (rv.StatusCode == System.Net.HttpStatusCode.OK)
{
var t = rv.Data.Fields["access_token"].ToString();
var r = rv.Data.Fields["refresh_token"].ToString();
await SetToken(t, r);
var userinfo = await WtmBlazor.Api.CallAPI<LoginUserInfo>("/api/_account/CheckUserInfo", HttpMethodEnum.GET, new { });
if (userinfo.StatusCode == System.Net.HttpStatusCode.OK)
{
await SetUserInfo(userinfo.Data);
User = await GetUserInfo();
hasToken = true;
}
else
{
//await WtmBlazor.Toast.Error(WtmBlazor.Localizer["Sys.Error"], rv.Errors.Message[0]);
hasToken = false;
}
}
else
{
await DeleteToken();
hasToken = false;
}
}
StateHasChanged();
}
}
private void OnNavigateAsync(NavigationContext args)
{
IsPublicPage();
if (args.Path.ToLower().StartsWith("login"))
{
NavigationManager.NavigateTo("/");
}
}
private void IsPublicPage()
{
var url = NavigationManager.ToBaseRelativePath(NavigationManager.Uri?.ToLower());
var i = url.IndexOf('?');
if(i >= 0)
{
url = url[0..i];
}
if (this.WtmBlazor.PublicPages.Any(x => Regex.IsMatch(url, x)))
{
IsPublic = true;
}
else
{
IsPublic = false;
}
}
}