From dd08b2fc649b40c479aec426cc42acd3e8356b40 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Oct 2025 13:25:17 +0800 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20doTask=20?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/BaseLayout.razor.cs | 2 +- .../Components/Layout/BaseLayout.razor.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs index d089760ff06..1625c8a2257 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs @@ -76,7 +76,7 @@ protected override async Task OnInitializedAsync() await base.OnInitializedAsync(); var module = await JSRuntime.LoadModule($"{WebsiteOption.Value.JSModuleRootPath}Layout/BaseLayout.razor.js"); - await module.InvokeVoidAsync("initTheme"); + await module.InvokeVoidAsync("doTask"); _init = true; } diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js index 6d4599d796a..b4609aee70e 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js @@ -1,6 +1,10 @@ import { getTheme, setTheme } from "../../_content/BootstrapBlazor/modules/utility.js" -export function initTheme() { +function initTheme() { const currentTheme = getTheme(); setTheme(currentTheme, false); } + +export function doTask() { + initTheme(); +} From 2da994b08795dd7f4539371062c1c87fc50adc84 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Oct 2025 13:56:15 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8A=95?= =?UTF-8?q?=E7=A5=A8=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/BaseLayout.razor | 8 +++ .../Components/Layout/BaseLayout.razor.cs | 56 ++++++++++++++++--- .../Components/Layout/BaseLayout.razor.js | 10 +++- 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor index d31966d483f..56978f419a1 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor @@ -15,3 +15,11 @@ Reload 🗙 + +@code { + RenderFragment RenderVote => + @
+

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

+
必须投一票 我知道了
+
; +} diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs index 1625c8a2257..d774d70ebfc 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.cs @@ -5,13 +5,14 @@ using Microsoft.Extensions.Options; using Microsoft.JSInterop; +using System.Globalization; namespace BootstrapBlazor.Server.Components.Layout; /// /// 母版页基类 /// -public partial class BaseLayout : IDisposable +public partial class BaseLayout : IAsyncDisposable { [Inject] [NotNull] @@ -50,6 +51,8 @@ public partial class BaseLayout : IDisposable private string? CancelText { get; set; } private bool _init = false; + private JSModule? _module; + private DotNetObjectReference? _interop; /// /// @@ -71,13 +74,18 @@ protected override void OnInitialized() /// /// /// - protected override async Task OnInitializedAsync() + protected override async Task OnAfterRenderAsync(bool firstRender) { - await base.OnInitializedAsync(); + await base.OnAfterRenderAsync(firstRender); - var module = await JSRuntime.LoadModule($"{WebsiteOption.Value.JSModuleRootPath}Layout/BaseLayout.razor.js"); - await module.InvokeVoidAsync("doTask"); - _init = true; + if (firstRender) + { + _module = await JSRuntime.LoadModule($"{WebsiteOption.Value.JSModuleRootPath}Layout/BaseLayout.razor.js"); + _interop = DotNetObjectReference.Create(this); + await _module.InvokeVoidAsync("doTask", _interop); + _init = true; + StateHasChanged(); + } } private async Task NotifyCommit(DispatchEntry payload) @@ -121,25 +129,55 @@ 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 = "Gitee 评选活动", + IsAutoHide = false, + ChildContent = RenderVote, + PreventDuplicates = true + }; + await Toast.Show(_option); + } + /// /// 释放资源 /// /// - private void Dispose(bool disposing) + private async ValueTask DisposeAsync(bool disposing) { if (disposing) { CommitDispatchService.UnSubscribe(NotifyCommit); RebootDispatchService.UnSubscribe(NotifyReboot); + + if (_module != null) + { + await _module.InvokeVoidAsync("dispose"); + await _module.DisposeAsync(); + } } } /// /// 释放资源 /// - public void Dispose() + public async ValueTask DisposeAsync() { - Dispose(true); + await DisposeAsync(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 b4609aee70e..972afbae5c3 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js @@ -5,6 +5,14 @@ function initTheme() { setTheme(currentTheme, false); } -export function doTask() { +export function doTask(invoke) { initTheme(); + const handler = setTimeout(() => { + clearTimeout(handler); + invoke.invokeMethodAsync("ShowVoteToast"); + }, 1000); +} + +export function dispose() { + } From f68cac1517cd2ab3cde22c020d2bf3da65909acf Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Oct 2025 14:25:00 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/BaseLayout.razor | 5 +++- .../Components/Layout/BaseLayout.razor.js | 29 +++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor index 56978f419a1..dda61a1d6c7 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor @@ -20,6 +20,9 @@ RenderFragment RenderVote => @

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

- +
; } diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js index 972afbae5c3..d7f2b45447e 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js @@ -1,4 +1,5 @@ import { getTheme, setTheme } from "../../_content/BootstrapBlazor/modules/utility.js" +import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js" function initTheme() { const currentTheme = getTheme(); @@ -7,12 +8,34 @@ function initTheme() { export function doTask(invoke) { initTheme(); - const handler = setTimeout(() => { + + 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'); + } + } + const handler = setTimeout(async () => { clearTimeout(handler); - invoke.invokeMethodAsync("ShowVoteToast"); + await invoke.invokeMethodAsync("ShowVoteToast"); }, 1000); + + 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 a34b3284c75f126b0232ec95460406b5e2c81e34 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sun, 26 Oct 2025 14:25:35 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E5=BB=B6?= =?UTF-8?q?=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/BaseLayout.razor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js index d7f2b45447e..f3ec8d6636e 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js +++ b/src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor.js @@ -24,7 +24,7 @@ export function doTask(invoke) { const handler = setTimeout(async () => { clearTimeout(handler); await invoke.invokeMethodAsync("ShowVoteToast"); - }, 1000); + }, 10000); EventHandler.on(document, 'click', '#bb-gitee-vote', e => { const toast = e.delegateTarget.closest('.toast');