From 2f0d52205bc5e62276749a364e4de4db27c20cef Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 10 Jan 2026 11:09:56 +0800 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20=E6=92=A4=E9=94=80=E5=AF=B9=20B?= =?UTF-8?q?aseLayout=20=E7=9A=84=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/BaseLayout.razor.cs | 57 +++---------------- .../Components/Layout/BaseLayout.razor.js | 40 +------------ 2 files changed, 10 insertions(+), 87 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs index c58ff812ff2..764276ff03b 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs @@ -5,14 +5,13 @@ using Microsoft.Extensions.Options; using Microsoft.JSInterop; -using System.Globalization; namespace BootstrapBlazor.Server.Components.Layout; /// /// 母版页基类 /// -public partial class BaseLayout : IAsyncDisposable +public partial class BaseLayout : IDisposable { [Inject] [NotNull] @@ -51,8 +50,6 @@ public partial class BaseLayout : IAsyncDisposable private string? CancelText { get; set; } private bool _init = false; - private JSModule? _module; - private DotNetObjectReference? _interop; /// /// @@ -74,18 +71,13 @@ protected override void OnInitialized() /// /// /// - protected override async Task OnAfterRenderAsync(bool firstRender) + protected override async Task OnInitializedAsync() { - await base.OnAfterRenderAsync(firstRender); + await base.OnInitializedAsync(); - if (firstRender) - { - _module = await JSRuntime.LoadModule($"{WebsiteOption.Value.JSModuleRootPath}Layout/BaseLayout.razor.js"); - _interop = DotNetObjectReference.Create(this); - await _module.InvokeVoidAsync("doTask", _interop, WebsiteOption.Value.IsDevelopment); - _init = true; - StateHasChanged(); - } + var module = await JSRuntime.LoadModule($"{WebsiteOption.Value.JSModuleRootPath}Layout/BaseLayout.razor.js"); + await module.InvokeVoidAsync("initTheme"); + _init = true; } private async Task NotifyCommit(DispatchEntry payload) @@ -129,56 +121,25 @@ private async Task NotifyReboot(DispatchEntry payload) } } - /// - /// 显示投票弹窗 - /// - /// - [JSInvokable] - public async Task ShowVoteToast() - { - // 英文环境不投票 - if (CultureInfo.CurrentUICulture.Name == "en-US") - { - return; - } - - _option = new ToastOption() - { - Category = ToastCategory.Information, - Title = "邀请您支持 BB 参与 Gitee 项目评选活动", - IsAutoHide = false, - ChildContent = RenderVote, - PreventDuplicates = true, - ClassString = "bb-vote-toast" - }; - await Toast.Show(_option); - } - /// /// 释放资源 /// /// - private async ValueTask DisposeAsync(bool disposing) + private void Dispose(bool disposing) { if (disposing) { CommitDispatchService.UnSubscribe(NotifyCommit); RebootDispatchService.UnSubscribe(NotifyReboot); - - if (_module != null) - { - await _module.InvokeVoidAsync("dispose"); - await _module.DisposeAsync(); - } } } /// /// 释放资源 /// - public async ValueTask DisposeAsync() + public void Dispose() { - await DisposeAsync(true); + Dispose(true); GC.SuppressFinalize(this); } } diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js index 0489d590128..b143375ae13 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js @@ -1,44 +1,6 @@ import { getTheme, setTheme } from "../../_content/BootstrapBlazor/modules/utility.js" -import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js" -function initTheme() { +export function initTheme() { const currentTheme = getTheme(); setTheme(currentTheme, false); } - -export function doTask(invoke, debug) { - initTheme(); - - const v = localStorage.getItem('bb-gitee-vote'); - if (v) { - try { - const differ = new Date().getTime() - v; - if (differ < 86400000) { - return; - } - } - catch { - localStorage.removeItem('bb-gitee-vote'); - } - } - - if (debug !== true) { - const handler = setTimeout(async () => { - clearTimeout(handler); - await invoke.invokeMethodAsync("ShowVoteToast"); - }, 10000); - } - - EventHandler.on(document, 'click', '#bb-gitee-vote', e => { - const toast = e.delegateTarget.closest('.toast'); - if (toast) { - toast.classList.remove('show'); - - localStorage.setItem('bb-gitee-vote', new Date().getTime()); - } - }); -} - -export function dispose() { - EventHandler.off(document, 'click', '#bb-gitee-vote'); -} From 1894c60a5cf37a1c27f22135f070be19675af058 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 10 Jan 2026 11:10:13 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20GlobalToast=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Components/GlobalToast.razor | 1 + .../Components/GlobalToast.razor.cs | 15 ++++++++ .../Components/GlobalToast.razor.js | 36 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor create mode 100644 src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs create mode 100644 src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js diff --git a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor new file mode 100644 index 00000000000..0f0a24964fa --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor @@ -0,0 +1 @@ +@inherits WebSiteModuleComponentBase diff --git a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs new file mode 100644 index 00000000000..9c4ee362089 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs @@ -0,0 +1,15 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace BootstrapBlazor.Server.Components.Components; + +/// +/// 正站通知组件 +/// +[JSModuleAutoLoader("Components/GlobalToast.razor.js")] +public partial class GlobalToast +{ + +} diff --git a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js new file mode 100644 index 00000000000..67cd3d8e356 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js @@ -0,0 +1,36 @@ +import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js" + +export function init(invoke, debug) { + const v = localStorage.getItem('bb-gitee-vote'); + if (v) { + try { + const differ = new Date().getTime() - v; + if (differ < 86400000) { + return; + } + } + catch { + localStorage.removeItem('bb-gitee-vote'); + } + } + + if (debug !== true) { + const handler = setTimeout(async () => { + clearTimeout(handler); + await invoke.invokeMethodAsync("ShowVoteToast"); + }, 10000); + } + + EventHandler.on(document, 'click', '#bb-gitee-vote', e => { + const toast = e.delegateTarget.closest('.toast'); + if (toast) { + toast.classList.remove('show'); + + localStorage.setItem('bb-gitee-vote', new Date().getTime()); + } + }); +} + +export function dispose() { + EventHandler.off(document, 'click', '#bb-gitee-vote'); +} From 953acb98ddfdf8e3c823a38b2519ffc195efd4a4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 10 Jan 2026 11:24:06 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20RenderVote?= =?UTF-8?q?=20=E4=BB=A3=E7=A0=81=E7=89=87=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/BaseLayout.razor | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor index 626831ce89e..86a69bf08c0 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor @@ -15,16 +15,3 @@ Reload 🗙 - -@code { - RenderFragment RenderVote => - @
-
🏆
-

正在参加 Gitee 2025 最受欢迎的开源软件 投票活动,快来给我投票吧!

-
您的每一票都是对开源社区的支持,感谢您的参与!
- -
; -} From 768407b94896fbbbde937b7fb582635640c48202 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 10 Jan 2026 11:24:17 +0800 Subject: [PATCH 4/4] =?UTF-8?q?doc:=20=E5=AE=8C=E5=96=84=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Components/GlobalToast.razor | 13 +++++++ .../Components/GlobalToast.razor.cs | 37 ++++++++++++++++++- .../Components/GlobalToast.razor.js | 15 ++++---- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor index 0f0a24964fa..ed7c68b60d1 100644 --- a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor +++ b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor @@ -1 +1,14 @@ @inherits WebSiteModuleComponentBase + +@code { + RenderFragment RenderVote => + @
+
🏆
+

正在参加 Gitee 2025 最受欢迎的开源软件 投票活动,快来给我投票吧!

+
您的每一票都是对开源社区的支持,感谢您的参与!
+ +
; +} diff --git a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs index 9c4ee362089..121db43b0ec 100644 --- a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.cs @@ -3,13 +3,48 @@ // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone +using Microsoft.JSInterop; +using System.Globalization; + namespace BootstrapBlazor.Server.Components.Components; /// /// 正站通知组件 /// -[JSModuleAutoLoader("Components/GlobalToast.razor.js")] +[JSModuleAutoLoader("Components/GlobalToast.razor.js", JSObjectReference = true)] public partial class GlobalToast { + [Inject] + [NotNull] + private ToastService? Toast { get; set; } + + /// + /// + /// + /// + protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Interop, nameof(ShowToast)); + + /// + /// 显示通知窗口 + /// + /// + [JSInvokable] + public async Task ShowToast() + { + // 英文环境不通知 + if (CultureInfo.CurrentUICulture.Name == "en-US") + { + return; + } + var option = new ToastOption() + { + Category = ToastCategory.Information, + Title = "Gitee 评选活动", + IsAutoHide = false, + ChildContent = RenderVote, + PreventDuplicates = true + }; + await Toast.Show(option); + } } diff --git a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js index 67cd3d8e356..bf8fabb8c86 100644 --- a/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js +++ b/src/BootstrapBlazor.Server/Components/Components/GlobalToast.razor.js @@ -1,7 +1,8 @@ import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js" -export function init(invoke, debug) { - const v = localStorage.getItem('bb-gitee-vote'); +export function init(invoke, method, debug) { + const localstorageKey = 'bb-g-toast' + const v = localStorage.getItem(localstorageKey); if (v) { try { const differ = new Date().getTime() - v; @@ -10,27 +11,27 @@ export function init(invoke, debug) { } } catch { - localStorage.removeItem('bb-gitee-vote'); + localStorage.removeItem(localstorageKey); } } if (debug !== true) { const handler = setTimeout(async () => { clearTimeout(handler); - await invoke.invokeMethodAsync("ShowVoteToast"); + await invoke.invokeMethodAsync(method); }, 10000); } - EventHandler.on(document, 'click', '#bb-gitee-vote', e => { + EventHandler.on(document, 'click', '#bb-g-toast', e => { const toast = e.delegateTarget.closest('.toast'); if (toast) { toast.classList.remove('show'); - localStorage.setItem('bb-gitee-vote', new Date().getTime()); + localStorage.setItem(localstorageKey, new Date().getTime()); } }); } export function dispose() { - EventHandler.off(document, 'click', '#bb-gitee-vote'); + EventHandler.off(document, 'click', '#bb-g-toast'); }