@page "/my-decks" @using Model @using Web.Services @inject UserDecksService UserDecksService @inject AuthService AuthService @inject NavigationManager Navigation @inject NetworkStatusService NetworkStatus @implements IDisposable Chrono CCG - My Decks
@if (!AuthService.IsLoggedIn) {

Authentication Required

Please log in to your Chrono CCG account to view and manage your saved decks.

Log In
} else {

My Decks

Manage and edit your custom PostgreSQL-persisted decks.

@if (!string.IsNullOrEmpty(statusMessage)) { }
@if (!string.IsNullOrEmpty(searchTerm)) { }
Showing @FilteredDecks.Count deck(s)
@if (isLoading) {
Loading your saved decks...
} else if (!FilteredDecks.Any()) {

No Decks Found

@(string.IsNullOrEmpty(searchTerm) ? "You haven't built any decks yet." : "No decks match your search criteria.")

Open Deck Builder
} else {
@foreach (var deck in FilteredDecks) {
@deck.Name
@(string.IsNullOrEmpty(deck.Season) ? "Season 1" : deck.Season) @(deck.IsValid ? "Valid" : "Incomplete")
@deck.Cards.Count/40 cards
@deck.Divers.Count/2 divers
@if (deck.Divers.Count > 0) {
DIVERS
@foreach (var diver in deck.Divers) { @diver }
} @if (!string.IsNullOrEmpty(deck.Notes)) {
NOTES
@deck.Notes
}
Updated @deck.UpdatedAt.ToLocalTime().ToString("MMM dd, yyyy HH:mm")
}
} }
@code { private List decks = []; private string searchTerm = ""; private bool isLoading = true; private bool isDeleting; private string? statusMessage; private bool statusIsError; private List FilteredDecks => string.IsNullOrWhiteSpace(searchTerm) ? decks : decks.Where(d => (d.Name?.Contains(searchTerm, StringComparison.OrdinalIgnoreCase) ?? false) || (d.Season?.Contains(searchTerm, StringComparison.OrdinalIgnoreCase) ?? false) || (d.Notes?.Contains(searchTerm, StringComparison.OrdinalIgnoreCase) ?? false) || d.Cards.Any(c => c.Contains(searchTerm, StringComparison.OrdinalIgnoreCase)) || d.Divers.Any(div => div.Contains(searchTerm, StringComparison.OrdinalIgnoreCase)) ).ToList(); protected override async Task OnInitializedAsync() { AuthService.AuthStateChanged += OnAuthStateChanged; await AuthService.InitializeAsync(); if (AuthService.IsLoggedIn) { await LoadDecksAsync(); } else { isLoading = false; } } private void OnAuthStateChanged() { _ = InvokeAsync(async () => { if (AuthService.IsLoggedIn) { await LoadDecksAsync(); } StateHasChanged(); }); } private async Task LoadDecksAsync() { isLoading = true; statusMessage = null; try { decks = await UserDecksService.GetDecksAsync(); } catch (Exception ex) { statusMessage = $"Failed to load decks: {ex.Message}"; statusIsError = true; } finally { isLoading = false; } } private async Task DeleteDeckAsync(Guid id) { isDeleting = true; statusMessage = null; try { var success = await UserDecksService.DeleteDeckAsync(id); if (success) { decks.RemoveAll(d => d.Id == id); statusMessage = "Deck deleted successfully."; statusIsError = false; } else { statusMessage = "Failed to delete deck."; statusIsError = true; } } catch (Exception ex) { statusMessage = $"Error deleting deck: {ex.Message}"; statusIsError = true; } finally { isDeleting = false; } } public void Dispose() { AuthService.AuthStateChanged -= OnAuthStateChanged; } }