ant-design-blazor/site/AntDesign.Docs/Pages/Components.razor.cs
Weihan Li 9fa391449a
chore: Enable some code analyze rules (#4126)
* style: update editorconfig

- update editorconfig encoding to utf8
- add CA1852 and IDE0005 rules

* style: apply dotnet-format

* style: add IDE0040 rule

* style: apply dotnet-format

* refactor: sealed SimpleEmbeddedJsonLocalizerFactory

* style: add style rule for modifiers

* fix: resolve dotnet-format unmerged issue

* fix: add back translation

---------

Co-authored-by: James Yeung <shunjiey@hotmail.com>
2024-08-28 00:54:33 +08:00

174 lines
5.6 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using AntDesign.Docs.Services;
using AntDesign.Docs.Shared;
using AntDesign.Extensions.Localization;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.Extensions.Localization;
namespace AntDesign.Docs.Pages
{
public partial class Components : ComponentBase, IDisposable
{
[Parameter]
public string Locale { get; set; }
[Parameter]
public string Name { get; set; }
[Inject]
private DemoService DemoService { get; set; }
[Inject]
private ILocalizationService LocalizationService { get; set; }
[Inject]
private IStringLocalizer Localizer { get; set; }
[Inject]
private NavigationManager NavigationManager { get; set; }
[CascadingParameter]
public MainLayout MainLayout { get; set; }
private DemoComponent _demoComponent;
private bool _expanded;
private bool _expandAllCode;
private string CurrentLanguage => LocalizationService.CurrentCulture.Name;
private string _filePath;
private List<string> _filePaths;
private bool _rendered;
private bool _changed = true;
private string EditUrl => $"https://github.com/ant-design-blazor/ant-design-blazor/edit/master/{_filePath}";
private List<DemoItem> _demos = [];
private (string Name, string Title)[] _anchors = [];
private string _currentPageName;
private string _currentLocale;
protected override void OnInitialized()
{
LocalizationService.LanguageChanged += OnLanguageChanged;
NavigationManager.LocationChanged += OnLocationChanged;
}
private void OnLanguageChanged(object sender, CultureInfo args)
{
if (!string.IsNullOrEmpty(Name))
{
_changed = true;
InvokeAsync(StateHasChanged);
}
}
private void OnLocationChanged(object sender, LocationChangedEventArgs args)
{
_changed = true;
InvokeAsync(StateHasChanged);
}
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
_rendered = true;
StateHasChanged();
return;
}
if (_rendered && _changed)
{
_changed = false;
_ = HandleNavigate();
}
}
private async Task HandleNavigate()
{
var fullPageName = NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
fullPageName = fullPageName.IndexOf('/') > 0 ? fullPageName.Substring(fullPageName.IndexOf('/') + 1) : fullPageName;
fullPageName = fullPageName.IndexOf('#') > 0 ? fullPageName.Substring(0, fullPageName.IndexOf('#')) : fullPageName;
if (fullPageName.StartsWith("docs"))
{
return;
}
if (_currentPageName == fullPageName && _currentLocale == Locale)
{
return;
}
_currentPageName = fullPageName;
_currentLocale = Locale;
if (fullPageName.Split("/").Length != 2)
{
var menus = await DemoService.GetMenuAsync();
var current = menus.FirstOrDefault(x => x.Url == fullPageName.ToLowerInvariant());
if (current != null)
{
NavigationManager.NavigateTo($"{CurrentLanguage}/{current.Children[0].Children[0].Url}");
}
}
else
{
_demoComponent = await DemoService.GetComponentAsync($"{fullPageName}");
StateHasChanged();
_filePath = $"site/AntDesign.Docs/Demos/Components/{_demoComponent?.Title}/doc/index.{CurrentLanguage}.md";
await LoadDemos(_currentPageName);
await MainLayout.ChangePrevNextNav(Name);
if (NavigationManager.Uri.Contains("#"))
{
NavigationManager.NavigateTo(NavigationManager.Uri);
}
}
}
private async Task LoadDemos(string pageName)
{
var showDemos = _demoComponent.DemoList?.Where(x => !x.Debug && !x.Docs.HasValue).OrderBy(x => x.Order) ?? Enumerable.Empty<DemoItem>();
_anchors = showDemos.Select(x => (x.Name, x.Title)).ToArray();
_demos = [];
_filePaths = new() { _filePath };
foreach (var item in showDemos)
{
// compoennt is changed
if (pageName != _currentPageName)
{
return;
}
_filePaths.Add($"site/AntDesign.Docs/Demos/Components/{_demoComponent?.Title}/demo/{item.Name}.md");
_filePaths.Add($"site/AntDesign.Docs/{item.Type.Replace(".", "/")}.razor");
_demos.Add(item);
StateHasChanged();
await Task.Delay(100);
}
}
public void Dispose()
{
LocalizationService.LanguageChanged -= OnLanguageChanged;
NavigationManager.LocationChanged -= OnLocationChanged;
}
}
}