179 lines
8.0 KiB
C#
179 lines
8.0 KiB
C#
using RpgRoller.Components.Pages.HomeControls;
|
|
using RpgRoller.Contracts;
|
|
using RpgRoller.Domain;
|
|
|
|
namespace RpgRoller.Components.Pages;
|
|
|
|
public sealed class WorkspaceState
|
|
{
|
|
public string OwnerLabel(Guid ownerUserId)
|
|
{
|
|
if (User is not null && ownerUserId == User.Id)
|
|
return "You";
|
|
|
|
if (SelectedCampaign is null)
|
|
return "Unknown owner";
|
|
|
|
if (ownerUserId == SelectedCampaign.Gm.Id)
|
|
return $"{SelectedCampaign.Gm.DisplayName} (GM)";
|
|
|
|
var ownerDisplayName = SelectedCampaign.Characters.Where(character => character.OwnerUserId == ownerUserId).Select(character => character.OwnerDisplayName).FirstOrDefault(displayName => !string.IsNullOrWhiteSpace(displayName));
|
|
|
|
return string.IsNullOrWhiteSpace(ownerDisplayName) ? "Unknown owner" : ownerDisplayName;
|
|
}
|
|
|
|
public string SkillDefinitionLabel(CharacterSheetSkill skill)
|
|
{
|
|
if (!string.Equals(SelectedCampaign?.RulesetId, "d6", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
if (string.Equals(SelectedCampaign?.RulesetId, RulesetFormHelpers.RulesetIds.Rolemaster, StringComparison.OrdinalIgnoreCase))
|
|
return RulesetFormHelpers.DescribeRolemasterExpression(skill.DiceRollDefinition, skill.FumbleRange, skill.RolemasterAutoRetry);
|
|
|
|
return skill.DiceRollDefinition;
|
|
}
|
|
|
|
var fumbleLabel = skill.AllowFumble ? "fumble on" : "fumble off";
|
|
return $"{skill.DiceRollDefinition}, wild {skill.WildDice}, {fumbleLabel}";
|
|
}
|
|
|
|
public UserSummary? User { get; set; }
|
|
public Guid? ActiveCharacterId { get; set; }
|
|
public Guid? SelectedCampaignId { get; set; }
|
|
public CampaignRoster? SelectedCampaign { get; set; }
|
|
public List<CampaignSummary> Campaigns { get; set; } = [];
|
|
public List<CampaignOption> CharacterCampaignOptions { get; set; } = [];
|
|
public List<CharacterSheetSkill> SelectedCharacterSkills { get; set; } = [];
|
|
public List<CharacterSheetSkillGroup> SelectedCharacterSkillGroups { get; set; } = [];
|
|
public List<CampaignLogListEntry> CampaignLog { get; set; } = [];
|
|
public List<RulesetDefinition> Rulesets { get; set; } = [];
|
|
public List<AdminUserSummary> AdminUsers { get; set; } = [];
|
|
public Guid? SelectedCharacterId { get; set; }
|
|
public RollResult? LastRoll { get; set; }
|
|
public List<string> KnownUsernames { get; set; } = [];
|
|
public string RollVisibility { get; set; } = "public";
|
|
|
|
public bool IsMutating { get; set; }
|
|
public bool IsCampaignDataLoading { get; set; }
|
|
public bool IsAdminDataLoading { get; set; }
|
|
public bool HasLoadedAdminUsers { get; set; }
|
|
public bool HasHealthIssue { get; set; }
|
|
public string HealthIssueMessage { get; set; } = "Retry to restore the API connection.";
|
|
public List<WorkspaceToast> Toasts { get; } = [];
|
|
public string CurrentScreen { get; set; } = "play";
|
|
public string MobilePanel { get; set; } = "character";
|
|
public string ConnectionState { get; set; } = "offline";
|
|
public string LiveAnnouncement { get; set; } = string.Empty;
|
|
public bool IsScreenMenuOpen { get; set; }
|
|
|
|
public bool ShowCreateCharacterModal { get; set; }
|
|
public bool ShowEditCharacterModal { get; set; }
|
|
public bool ShowRolemasterSkillRollModal { get; set; }
|
|
public bool CanEditCharacterOwner { get; set; }
|
|
public Guid? EditingCharacterId { get; set; }
|
|
public CharacterSheetSkill? PendingRolemasterSkillRoll { get; set; }
|
|
public string PendingRolemasterSituationalModifier { get; set; } = string.Empty;
|
|
public string? PendingRolemasterSkillRollError { get; set; }
|
|
public bool IsSubmittingRolemasterSkillRoll { get; set; }
|
|
public CharacterFormModel CreateCharacterInitialModel { get; set; } = new();
|
|
public CharacterFormModel EditCharacterInitialModel { get; set; } = new();
|
|
public int CreateCharacterFormVersion { get; set; }
|
|
public int EditCharacterFormVersion { get; set; }
|
|
public bool StateRefreshInProgress { get; set; }
|
|
public bool HasInteractiveRenderStarted { get; set; }
|
|
public CampaignStateSnapshot? CurrentCampaignState { get; set; }
|
|
public Guid? CampaignLogCursor { get; set; }
|
|
public Guid? ExpandedCampaignLogRollId { get; set; }
|
|
public Guid? FreshCampaignLogRollId { get; set; }
|
|
public Dictionary<Guid, CampaignRollDetail> CampaignLogDetails { get; } = [];
|
|
public HashSet<Guid> CampaignLogDetailsLoading { get; } = [];
|
|
public Dictionary<Guid, string> CampaignLogDetailErrors { get; } = [];
|
|
|
|
public string? SelectedCampaignName => SelectedCampaign?.Name ?? Campaigns.FirstOrDefault(campaign => campaign.Id == SelectedCampaignId)?.Name;
|
|
|
|
public CharacterSummary? SelectedCharacter =>
|
|
SelectedCampaign?.Characters.FirstOrDefault(character => character.Id == SelectedCharacterId);
|
|
|
|
public CampaignRoster? PlaySelectedCampaign
|
|
{
|
|
get
|
|
{
|
|
if (SelectedCampaign is null)
|
|
return null;
|
|
|
|
if (User is null)
|
|
return new(SelectedCampaign.Id, SelectedCampaign.Name, SelectedCampaign.RulesetId, SelectedCampaign.Gm, []);
|
|
|
|
var ownedCharacters = SelectedCampaign.Characters.Where(character => character.OwnerUserId == User.Id).ToArray();
|
|
|
|
return new(SelectedCampaign.Id, SelectedCampaign.Name, SelectedCampaign.RulesetId, SelectedCampaign.Gm, ownedCharacters);
|
|
}
|
|
}
|
|
|
|
public CharacterSummary? PlaySelectedCharacter
|
|
{
|
|
get
|
|
{
|
|
var playSelectedCampaign = PlaySelectedCampaign;
|
|
if (playSelectedCampaign is null || playSelectedCampaign.Characters.Length == 0)
|
|
return null;
|
|
|
|
if (SelectedCharacterId.HasValue)
|
|
{
|
|
var selectedCharacter = playSelectedCampaign.Characters.FirstOrDefault(character => character.Id == SelectedCharacterId.Value);
|
|
if (selectedCharacter is not null)
|
|
return selectedCharacter;
|
|
}
|
|
|
|
if (ActiveCharacterId.HasValue)
|
|
{
|
|
var activeCharacter = playSelectedCampaign.Characters.FirstOrDefault(character => character.Id == ActiveCharacterId.Value);
|
|
if (activeCharacter is not null)
|
|
return activeCharacter;
|
|
}
|
|
|
|
return playSelectedCampaign.Characters[0];
|
|
}
|
|
}
|
|
|
|
public Guid? PlaySelectedCharacterId => PlaySelectedCharacter?.Id;
|
|
|
|
public List<CharacterSheetSkill> PlaySelectedCharacterSkills =>
|
|
PlaySelectedCampaign is null || !PlaySelectedCharacterId.HasValue ? [] : SelectedCharacterSkills;
|
|
|
|
public List<CharacterSheetSkillGroup> PlaySelectedCharacterSkillGroups =>
|
|
PlaySelectedCampaign is null || !PlaySelectedCharacterId.HasValue ? [] : SelectedCharacterSkillGroups;
|
|
|
|
public List<CampaignLogListEntry> PlayVisibleCampaignLog => CampaignLog;
|
|
|
|
public bool IsCurrentUserGm =>
|
|
SelectedCampaign is not null && User is not null && SelectedCampaign.Gm.Id == User.Id;
|
|
|
|
public bool IsCurrentUserAdmin =>
|
|
User is not null && User.Roles.Contains(UserRoles.Admin, StringComparer.OrdinalIgnoreCase);
|
|
|
|
public bool CanDeleteSelectedCampaign =>
|
|
SelectedCampaign is not null && User is not null && (SelectedCampaign.Gm.Id == User.Id || IsCurrentUserAdmin);
|
|
|
|
public bool IsSelectedCampaignD6 =>
|
|
string.Equals(SelectedCampaign?.RulesetId, "d6", StringComparison.OrdinalIgnoreCase);
|
|
|
|
public bool IsPlayScreen => string.Equals(CurrentScreen, "play", StringComparison.OrdinalIgnoreCase);
|
|
public bool IsManagementScreen => string.Equals(CurrentScreen, "management", StringComparison.OrdinalIgnoreCase);
|
|
public bool IsAdminScreen => string.Equals(CurrentScreen, "admin", StringComparison.OrdinalIgnoreCase);
|
|
|
|
public string ConnectionStateLabel => ConnectionState switch
|
|
{
|
|
"connected" => "Connected",
|
|
"reconnecting" => "Reconnecting",
|
|
_ => "Offline fallback"
|
|
};
|
|
|
|
public string ConnectionStateCssClass => ConnectionState switch
|
|
{
|
|
"connected" => "ok",
|
|
"reconnecting" => "warn",
|
|
_ => "offline"
|
|
};
|
|
|
|
public string AppCssClass => IsPlayScreen ? "rr-app app-play" : "rr-app";
|
|
} |