< Summary

Information
Class: Chronicis.Client.Components.Characters.CharacterClaimButton
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Components/Characters/CharacterClaimButton.razor
Line coverage
0%
Covered lines: 0
Uncovered lines: 57
Coverable lines: 57
Total lines: 160
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
BuildRenderTree(...)0%7280%
get_CharacterId()100%210%
get_OnClaimChanged()100%210%
OnParametersSetAsync()100%210%
LoadClaimStatus()100%210%
ClaimCharacter()0%620%
UnclaimCharacter()0%620%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Components/Characters/CharacterClaimButton.razor

#LineLine coverage
 1@inject ICharacterApiService CharacterApi
 2@inject ISnackbar Snackbar
 3
 4@code {
 5    private readonly ILogger<CharacterClaimButton> _logger;
 6
 7    // Direct constructor injection
 08    public CharacterClaimButton(ILogger<CharacterClaimButton> logger)
 9    {
 010        _logger = logger;
 011    }
 12}
 13
 014@if (_isLoading)
 15{
 16    <MudProgressCircular Size="Size.Small" Indeterminate="true" />
 17}
 018else if (_claimStatus != null)
 19{
 020    @if (_claimStatus.IsClaimedByMe)
 21    {
 22        <MudButton Variant="Variant.Outlined"
 23                   Color="Color.Success"
 24                   Size="Size.Small"
 25                   StartIcon="@Icons.Material.Filled.CheckCircle"
 26                   OnClick="UnclaimCharacter"
 27                   Disabled="_isProcessing">
 028            @if (_isProcessing)
 29            {
 30                <MudProgressCircular Size="Size.Small" Indeterminate="true" Class="mr-2" />
 31            }
 32            My Character
 33        </MudButton>
 34    }
 035    else if (_claimStatus.IsClaimed)
 36    {
 37        <MudTooltip Text="@($"Claimed by {_claimStatus.ClaimedByName}")">
 38            <MudChip T="string"
 39                     Size="Size.Small"
 40                     Variant="Variant.Outlined"
 41                     Icon="@Icons.Material.Filled.Person">
 042                @_claimStatus.ClaimedByName's Character
 43            </MudChip>
 44        </MudTooltip>
 45    }
 46    else
 47    {
 48        <MudButton Variant="Variant.Outlined"
 49                   Color="Color.Primary"
 50                   Size="Size.Small"
 51                   StartIcon="@Icons.Material.Filled.PersonAdd"
 52                   OnClick="ClaimCharacter"
 53                   Disabled="_isProcessing">
 054            @if (_isProcessing)
 55            {
 56                <MudProgressCircular Size="Size.Small" Indeterminate="true" Class="mr-2" />
 57            }
 58            Claim as My Character
 59        </MudButton>
 60    }
 61}
 62
 63@code {
 64    [Parameter, EditorRequired]
 065    public Guid CharacterId { get; set; }
 66
 67    [Parameter]
 068    public EventCallback OnClaimChanged { get; set; }
 69
 70    private CharacterClaimStatusDto? _claimStatus;
 071    private bool _isLoading = true;
 72    private bool _isProcessing = false;
 73
 74    protected override async Task OnParametersSetAsync()
 75    {
 076        await LoadClaimStatus();
 077    }
 78
 79    private async Task LoadClaimStatus()
 80    {
 081        _isLoading = true;
 082        StateHasChanged();
 83
 84        try
 85        {
 086            _claimStatus = await CharacterApi.GetClaimStatusAsync(CharacterId);
 087        }
 088        catch (Exception ex)
 89        {
 090            _logger.LogErrorSanitized(ex, "Error loading claim status for character {CharacterId}", CharacterId);
 091        }
 92        finally
 93        {
 094            _isLoading = false;
 095            StateHasChanged();
 96        }
 097    }
 98
 99    private async Task ClaimCharacter()
 100    {
 0101        _isProcessing = true;
 0102        StateHasChanged();
 103
 104        try
 105        {
 0106            var success = await CharacterApi.ClaimCharacterAsync(CharacterId);
 0107            if (success)
 108            {
 0109                Snackbar.Add("Character claimed! This is now your character.", Severity.Success);
 0110                await LoadClaimStatus();
 0111                await OnClaimChanged.InvokeAsync();
 112            }
 113            else
 114            {
 0115                Snackbar.Add("Failed to claim character", Severity.Error);
 116            }
 0117        }
 0118        catch (Exception ex)
 119        {
 0120            _logger.LogErrorSanitized(ex, "Error claiming character {CharacterId}", CharacterId);
 0121            Snackbar.Add("An error occurred", Severity.Error);
 0122        }
 123        finally
 124        {
 0125            _isProcessing = false;
 0126            StateHasChanged();
 127        }
 0128    }
 129
 130    private async Task UnclaimCharacter()
 131    {
 0132        _isProcessing = true;
 0133        StateHasChanged();
 134
 135        try
 136        {
 0137            var success = await CharacterApi.UnclaimCharacterAsync(CharacterId);
 0138            if (success)
 139            {
 0140                Snackbar.Add("Character unclaimed", Severity.Info);
 0141                await LoadClaimStatus();
 0142                await OnClaimChanged.InvokeAsync();
 143            }
 144            else
 145            {
 0146                Snackbar.Add("Failed to unclaim character", Severity.Error);
 147            }
 0148        }
 0149        catch (Exception ex)
 150        {
 0151            _logger.LogErrorSanitized(ex, "Error unclaiming character {CharacterId}", CharacterId);
 0152            Snackbar.Add("An error occurred", Severity.Error);
 0153        }
 154        finally
 155        {
 0156            _isProcessing = false;
 0157            StateHasChanged();
 158        }
 0159    }
 160}