+
@CultureInfo.CurrentCulture.TextInfo.ToTitleCase(context[0].PlayTime.ToString(Localizer["DateFormat"]))
@@ -104,7 +102,7 @@
@songHistoryData.MusicArtist
-
*@
diff --git a/TaikoWebUI/Pages/PlayHistory.razor.cs b/TaikoWebUI/Pages/PlayHistory.razor.cs
index c0d29a1..d8638a8 100644
--- a/TaikoWebUI/Pages/PlayHistory.razor.cs
+++ b/TaikoWebUI/Pages/PlayHistory.razor.cs
@@ -1,5 +1,6 @@
using System.Globalization;
using Microsoft.JSInterop;
+using SharedProject.Models;
namespace TaikoWebUI.Pages;
@@ -15,10 +16,9 @@ public partial class PlayHistory
private string? songNameLanguage;
private SongHistoryResponse? response;
+ private UserSetting? userSetting;
private Dictionary
> songHistoryDataMap = new();
-
- private readonly List breadcrumbs = new();
private Dictionary musicDetailDictionary = new();
@@ -34,7 +34,9 @@ public partial class PlayHistory
response = await Client.GetFromJsonAsync($"api/PlayHistory/{(uint)Baid}");
response.ThrowIfNull();
-
+
+ userSetting = await Client.GetFromJsonAsync($"api/UserSettings/{Baid}");
+
songNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage");
musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
@@ -54,6 +56,14 @@ public partial class PlayHistory
{
songHistoryDataList.Sort((data1, data2) => data1.SongNumber.CompareTo(data2.SongNumber));
}
+
+ //breadcrumbs
+ BreadcrumbsStateContainer.breadcrumbs.Clear();
+ if (AuthService.IsLoggedIn && !AuthService.IsAdmin) BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
+ else BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Play History"], href: $"/Users/{Baid}/PlayHistory", disabled: false));
+ BreadcrumbsStateContainer.NotifyStateChanged();
}
private static string GetCrownText(CrownType crown)
diff --git a/TaikoWebUI/Pages/Profile.razor b/TaikoWebUI/Pages/Profile.razor
index 5b5f8ca..d71b68e 100644
--- a/TaikoWebUI/Pages/Profile.razor
+++ b/TaikoWebUI/Pages/Profile.razor
@@ -5,6 +5,7 @@
@inject AuthService AuthService
@inject IJSRuntime JsRuntime
@inject NavigationManager NavigationManager
+@inject BreadcrumbsStateContainer BreadcrumbsStateContainer
@if (response is not null)
{
@@ -21,8 +22,6 @@
}
else
{
-
- @Localizer["Profile"]
diff --git a/TaikoWebUI/Pages/Profile.razor.cs b/TaikoWebUI/Pages/Profile.razor.cs
index 5364e7e..7578a11 100644
--- a/TaikoWebUI/Pages/Profile.razor.cs
+++ b/TaikoWebUI/Pages/Profile.razor.cs
@@ -169,8 +169,6 @@ public partial class Profile
"Not Cleared", "Not Full Combo", "Not Donderful Combo"
};
- private readonly List breadcrumbs = new();
-
private Dictionary> songBestDataMap = new();
private Difficulty highestDifficulty = Difficulty.Easy;
@@ -208,17 +206,19 @@ public partial class Profile
musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
+ BreadcrumbsStateContainer.breadcrumbs.Clear();
if (AuthService.IsLoggedIn && !AuthService.IsAdmin)
{
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
}
else
{
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
}
- breadcrumbs.Add(new BreadcrumbItem($"{response.MyDonName}", href: null, disabled: true));
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Profile"], href: $"/Users/{Baid}/Profile", disabled: false));
-
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem($"{response.MyDonName}", href: null, disabled: true));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Profile"], href: $"/Users/{Baid}/Profile", disabled: false));
+ BreadcrumbsStateContainer.NotifyStateChanged();
+
costumeList = await GameDataService.GetCostumeList();
titleDictionary = await GameDataService.GetTitleDictionary();
lockedCostumeDataDictionary = await GameDataService.GetLockedCostumeDataDictionary();
@@ -374,7 +374,7 @@ public partial class Profile
// Adjust breadcrumb if name is changed
if (response != null)
{
- breadcrumbs[^2] = new BreadcrumbItem($"{response.MyDonName}", href: null, disabled: true);
+ BreadcrumbsStateContainer.breadcrumbs[^2] = new BreadcrumbItem($"{response.MyDonName}", href: null, disabled: true);
}
}
diff --git a/TaikoWebUI/Pages/Register.razor b/TaikoWebUI/Pages/Register.razor
index 4f00d99..01e4d3c 100644
--- a/TaikoWebUI/Pages/Register.razor
+++ b/TaikoWebUI/Pages/Register.razor
@@ -1,6 +1,7 @@
@inject IDialogService DialogService
@inject AuthService AuthService
@inject NavigationManager NavigationManager
+@inject BreadcrumbsStateContainer BreadcrumbsStateContainer
@page "/Register"
diff --git a/TaikoWebUI/Pages/Register.razor.cs b/TaikoWebUI/Pages/Register.razor.cs
index 5514ef0..68027fa 100644
--- a/TaikoWebUI/Pages/Register.razor.cs
+++ b/TaikoWebUI/Pages/Register.razor.cs
@@ -16,6 +16,10 @@ public partial class Register
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
+
+ BreadcrumbsStateContainer.breadcrumbs.Clear();
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Register"], href: "/Register"));
+ BreadcrumbsStateContainer.NotifyStateChanged();
}
private async Task OnRegister()
diff --git a/TaikoWebUI/Pages/Song.razor b/TaikoWebUI/Pages/Song.razor
index a8b4a34..0db1846 100644
--- a/TaikoWebUI/Pages/Song.razor
+++ b/TaikoWebUI/Pages/Song.razor
@@ -7,16 +7,22 @@
@inject AuthService AuthService
@inject NavigationManager NavigationManager
@inject ILocalStorageService LocalStorage
+@inject BreadcrumbsStateContainer BreadcrumbsStateContainer
-@if (AuthService.LoginRequired && (!AuthService.IsLoggedIn || (AuthService.GetLoggedInBaid() != Baid && !AuthService.IsAdmin)))
+@if (response is null)
{
- NavigationManager.NavigateTo(AuthService.IsLoggedIn ? "/" : "/Login");
+
+
+
}
else
{
- if (response is not null)
+ @if (AuthService.LoginRequired && (!AuthService.IsLoggedIn || (AuthService.GetLoggedInBaid() != Baid && !AuthService.IsAdmin)))
+ {
+ NavigationManager.NavigateTo(AuthService.IsLoggedIn ? "/" : "/Login");
+ }
+ else
{
-
@songTitle
@songArtist
diff --git a/TaikoWebUI/Pages/Song.razor.cs b/TaikoWebUI/Pages/Song.razor.cs
index c447a6a..70e5476 100644
--- a/TaikoWebUI/Pages/Song.razor.cs
+++ b/TaikoWebUI/Pages/Song.razor.cs
@@ -11,7 +11,6 @@ public partial class Song
private UserSetting? userSetting;
private SongHistoryResponse? response;
private List? songHistoryData;
- private readonly List breadcrumbs = new();
private string songTitle = string.Empty;
private string songArtist = string.Empty;
@@ -19,7 +18,7 @@ public partial class Song
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
-
+
if (AuthService.LoginRequired && !AuthService.IsLoggedIn)
{
await AuthService.LoginWithAuthToken();
@@ -32,7 +31,7 @@ public partial class Song
// Get user settings
userSetting = await Client.GetFromJsonAsync($"api/UserSettings/{Baid}");
-
+
var musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
// Get song title and artist
@@ -42,21 +41,14 @@ public partial class Song
// Breadcrumbs
var formattedSongTitle = songTitle;
- if (formattedSongTitle.Length > 20)
- {
- formattedSongTitle = string.Concat(formattedSongTitle.AsSpan(0, 20), "...");
- }
+ if (formattedSongTitle.Length > 20) formattedSongTitle = string.Concat(formattedSongTitle.AsSpan(0, 20), "...");
- if (AuthService.IsLoggedIn && !AuthService.IsAdmin)
- {
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
- }
- else
- {
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
- };
- breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Song List"], href: $"/Users/{Baid}/Songs", disabled: false));
- breadcrumbs.Add(new BreadcrumbItem(formattedSongTitle, href: $"/Users/{Baid}/Songs/{SongId}", disabled: false));
+ BreadcrumbsStateContainer.breadcrumbs.Clear();
+ if (AuthService.IsLoggedIn && !AuthService.IsAdmin) BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
+ else BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Song List"], href: $"/Users/{Baid}/Songs", disabled: false));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(formattedSongTitle, href: $"/Users/{Baid}/Songs/{SongId}", disabled: false));
+ BreadcrumbsStateContainer.NotifyStateChanged();
}
}
\ No newline at end of file
diff --git a/TaikoWebUI/Pages/SongList.razor b/TaikoWebUI/Pages/SongList.razor
index 8b9f3d7..88b97ac 100644
--- a/TaikoWebUI/Pages/SongList.razor
+++ b/TaikoWebUI/Pages/SongList.razor
@@ -6,12 +6,10 @@
@inject AuthService AuthService
@inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager
+@inject BreadcrumbsStateContainer BreadcrumbsStateContainer
@page "/Users/{baid:int}/Songs"
-
-@Localizer["Song List"]
-
@if (response is null)
{
diff --git a/TaikoWebUI/Pages/SongList.razor.cs b/TaikoWebUI/Pages/SongList.razor.cs
index d581e3e..aa50ea5 100644
--- a/TaikoWebUI/Pages/SongList.razor.cs
+++ b/TaikoWebUI/Pages/SongList.razor.cs
@@ -11,8 +11,6 @@ public partial class SongList
private SongBestResponse? response;
private UserSetting? userSetting;
-
- private readonly List breadcrumbs = new();
private Dictionary musicDetailDictionary = new();
@@ -38,16 +36,18 @@ public partial class SongList
if (best.SongId == song.Value.SongId)
song.Value.IsFavorite = best.IsFavorite;
+ BreadcrumbsStateContainer.breadcrumbs.Clear();
if (AuthService.IsLoggedIn && !AuthService.IsAdmin)
{
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
}
else
{
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
};
- breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
- breadcrumbs.Add(new BreadcrumbItem(Localizer["Song List"], href: $"/Users/{Baid}/Songs", disabled: false));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Song List"], href: $"/Users/{Baid}/Songs", disabled: false));
+ BreadcrumbsStateContainer.NotifyStateChanged();
}
private bool FilterSongs(MusicDetail musicDetail)
diff --git a/TaikoWebUI/Pages/Users.razor b/TaikoWebUI/Pages/Users.razor
index ac087c7..80dbdc9 100644
--- a/TaikoWebUI/Pages/Users.razor
+++ b/TaikoWebUI/Pages/Users.razor
@@ -1,12 +1,12 @@
@inject HttpClient Client
@inject AuthService AuthService
@inject NavigationManager NavigationManager
+@inject BreadcrumbsStateContainer BreadcrumbsStateContainer
@using TaikoWebUI.Components;
@page "/Users"
-@Localizer["Users"]
@if (!AuthService.LoginRequired || (AuthService.LoginRequired && AuthService.IsAdmin)) {
diff --git a/TaikoWebUI/Pages/Users.razor.cs b/TaikoWebUI/Pages/Users.razor.cs
index c6729f8..718ee73 100644
--- a/TaikoWebUI/Pages/Users.razor.cs
+++ b/TaikoWebUI/Pages/Users.razor.cs
@@ -32,6 +32,10 @@ public partial class Users
{
await GetUsersData();
}
+
+ BreadcrumbsStateContainer.breadcrumbs.Clear();
+ BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
+ BreadcrumbsStateContainer.NotifyStateChanged();
}
private async Task OnPageChange(int page)
diff --git a/TaikoWebUI/Program.cs b/TaikoWebUI/Program.cs
index f23faad..1f9de19 100644
--- a/TaikoWebUI/Program.cs
+++ b/TaikoWebUI/Program.cs
@@ -35,6 +35,7 @@ builder.Services.AddLocalization();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
+builder.Services.AddSingleton();
builder.Services.AddBlazoredLocalStorage();
var host = builder.Build();
diff --git a/TaikoWebUI/Services/BreadcrumbsStateContainer.cs b/TaikoWebUI/Services/BreadcrumbsStateContainer.cs
new file mode 100644
index 0000000..a27e44d
--- /dev/null
+++ b/TaikoWebUI/Services/BreadcrumbsStateContainer.cs
@@ -0,0 +1,17 @@
+namespace TaikoWebUI.Services
+{
+ public class BreadcrumbsStateContainer
+ {
+ public List breadcrumbs = new();
+
+ public event Action? OnChange;
+
+ public void SetBreadcrumbs(List _breadcrumbs)
+ {
+ breadcrumbs = _breadcrumbs;
+ NotifyStateChanged();
+ }
+
+ public void NotifyStateChanged() => OnChange?.Invoke();
+ }
+}