From 650828273295acbc5a38b44af9dbea0038ece046 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Fri, 3 Jul 2026 10:53:45 +0900 Subject: [PATCH] fix: admin pages stuck on infinite loading - reset data fields when auth transitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptoms: After login, admin pages showed loading spinner forever. Root cause: OnInitializedAsync in 11 admin pages (Dashboard, Blog, Inquiries, Clients, Announcements, FAQs, TaxProfiles, ConsultingActivities, TaxFilingSchedules, Contracts, RevenueTrackings) checked AuthStateTask and loaded data only if authState.User.Identity?.IsAuthenticated == true. If that condition was ever false (e.g., transient auth state resolution timing), the page never reset its data collection from null → []. AdminDataPanel uses "Loading={item == null}" as its loading predicate, so null persisted indefinitely. Fix: Always reset the data collection, whether the auth check passes or fails: - AuthStateTask != null && IsAuthenticated == true: load data (existing) - AuthStateTask != null && IsAuthenticated == false: set data = [] (new else) - AuthStateTask == null: set data = [] (new else) This ensures AdminDataPanel's "Loading" condition becomes false on all code paths, not just the success case. Co-Authored-By: Claude Haiku 4.5 --- .../Admin/Pages/Announcements/AnnouncementList.razor | 8 ++++++++ .../Components/Admin/Pages/Blog/BlogList.razor | 8 ++++++++ .../Components/Admin/Pages/Clients/ClientList.razor | 8 ++++++++ .../Components/Admin/Pages/ConsultingActivities.razor | 8 ++++++++ .../Components/Admin/Pages/Contracts.razor | 8 ++++++++ .../Components/Admin/Pages/Dashboard.razor | 11 +++++++++++ .../Components/Admin/Pages/Faqs/FaqList.razor | 8 ++++++++ .../Admin/Pages/Inquiries/InquiryList.razor | 8 ++++++++ .../Components/Admin/Pages/RevenueTrackings.razor | 8 ++++++++ .../Components/Admin/Pages/TaxFilingSchedules.razor | 8 ++++++++ .../Components/Admin/Pages/TaxProfiles.razor | 8 ++++++++ 11 files changed, 91 insertions(+) diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor index a8ba06a..b68a24d 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Announcements/AnnouncementList.razor @@ -129,6 +129,14 @@ { await LoadAsync(); } + else + { + announcements = []; + } + } + else + { + announcements = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogList.razor index 6dad24b..2a00925 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Blog/BlogList.razor @@ -95,6 +95,14 @@ { await LoadPosts(); } + else + { + isLoading = false; + } + } + else + { + isLoading = false; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor index e9e2f34..039554d 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Clients/ClientList.razor @@ -147,6 +147,14 @@ { await LoadAsync(); } + else + { + clients = []; + } + } + else + { + clients = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor index 36de9f8..c378085 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/ConsultingActivities.razor @@ -145,6 +145,14 @@ { await LoadData(); } + else + { + activities = []; + } + } + else + { + activities = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor index 994132e..f7cf302 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Contracts.razor @@ -176,6 +176,14 @@ else await LoadData(); PrepareCreate(); } + else + { + contracts = []; + } + } + else + { + contracts = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor index e1b30b5..120b80a 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Dashboard.razor @@ -185,6 +185,17 @@ isLoading = false; } } + else + { + // AuthorizeRouteView already gates this page, so this branch is + // only a transient auth-state resolution timing gap - but without + // resetting isLoading here, AdminDataPanel would spin forever. + isLoading = false; + } + } + else + { + isLoading = false; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor index 3e44bf9..103ca97 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqList.razor @@ -133,6 +133,14 @@ { await LoadAsync(); } + else + { + faqs = []; + } + } + else + { + faqs = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryList.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryList.razor index 449d916..b0a722b 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryList.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/Inquiries/InquiryList.razor @@ -52,6 +52,14 @@ { await LoadData(); } + else + { + isLoading = false; + } + } + else + { + isLoading = false; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor index 45958ae..837453f 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/RevenueTrackings.razor @@ -141,6 +141,14 @@ { await LoadData(); } + else + { + revenues = []; + } + } + else + { + revenues = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilingSchedules.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilingSchedules.razor index 52cb455..399967d 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilingSchedules.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxFilingSchedules.razor @@ -198,6 +198,14 @@ else await LoadData(); PrepareCreate(); } + else + { + schedules = []; + } + } + else + { + schedules = []; } } diff --git a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxProfiles.razor b/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxProfiles.razor index b2c5d95..22e8186 100644 --- a/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxProfiles.razor +++ b/src/TaxBaik.Web.Client/Components/Admin/Pages/TaxProfiles.razor @@ -151,6 +151,14 @@ else await LoadData(); PrepareCreate(); } + else + { + profiles = []; + } + } + else + { + profiles = []; } }