d3271a0405
SocialsDialogViewModel.cs 515 -> 334. Extracted the DialogEntry record + the row-level SocialSlotViewModel (service/logo/lock/edit/validate state, computed Show* flags) into a new SocialSlotViewModel.cs partial. The dialog VM keeps the sign-in gate, validation orchestration, and commit. DialogEntry stays public in the same namespace. Zero behavior change; build 0 warnings; 246 pass, only the 2 known failures. Docs: ViewModels/index.md Phase 3 tracker updated in same commit.
184 lines
5.7 KiB
C#
184 lines
5.7 KiB
C#
using System.ComponentModel;
|
|
using ytLive.Helpers;
|
|
using ytLive.Models;
|
|
using ytLive.ViewModels;
|
|
|
|
namespace ytLive.ViewModels;
|
|
public sealed record DialogEntry(SocialService Service, string Handle, string ProfileUrl, string? FediverseSoftware = null);
|
|
|
|
/// <summary>
|
|
/// One of the six fixed dialog rows. Row 0 is always YouTube (signed-in account
|
|
/// or a sign-in prompt); rows 1-5 hold validated entries, an empty slot, or — on
|
|
/// the free tier — a locked "Premium" slot. Rows are a positional projection of
|
|
/// the dialog's working list, so deleting an entry makes the ones above advance up.
|
|
/// </summary>
|
|
public sealed class SocialSlotViewModel : ViewModelBase
|
|
{
|
|
public int Index { get; }
|
|
public bool IsYoutube => Index == 0;
|
|
|
|
private SocialService _service = SocialService.Link;
|
|
public SocialService Service
|
|
{
|
|
get => _service;
|
|
set { if (SetProperty(ref _service, value)) OnPropertyChanged(nameof(LogoData)); }
|
|
}
|
|
|
|
public string LogoData => Service == SocialService.Fediverse
|
|
? SocialServiceIcons.LogoDataForFediverse(FediverseSoftware)
|
|
: SocialServiceIcons.LogoDataFor(Service);
|
|
public string LockedIconData => SocialServiceIcons.LockedIconData;
|
|
public string DoNotIconData => SocialServiceIcons.DoNotIconData;
|
|
|
|
private bool _isLocked;
|
|
public bool IsLocked
|
|
{
|
|
get => _isLocked;
|
|
set
|
|
{
|
|
if (SetProperty(ref _isLocked, value))
|
|
{
|
|
OnPropertyChanged(nameof(ShowAddButton));
|
|
OnPropertyChanged(nameof(ShowDoNot));
|
|
OnPropertyChanged(nameof(DisplayText));
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isFilled;
|
|
public bool IsFilled
|
|
{
|
|
get => _isFilled;
|
|
set
|
|
{
|
|
if (SetProperty(ref _isFilled, value))
|
|
{
|
|
OnPropertyChanged(nameof(ShowEditButton));
|
|
OnPropertyChanged(nameof(ShowDeleteButton));
|
|
OnPropertyChanged(nameof(ShowAddButton));
|
|
OnPropertyChanged(nameof(ShowDoNot));
|
|
OnPropertyChanged(nameof(DisplayText));
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isSignIn;
|
|
public bool IsSignIn
|
|
{
|
|
get => _isSignIn;
|
|
set
|
|
{
|
|
if (SetProperty(ref _isSignIn, value))
|
|
{
|
|
OnPropertyChanged(nameof(ShowSignInButton));
|
|
OnPropertyChanged(nameof(ShowDeleteButton));
|
|
OnPropertyChanged(nameof(ShowLogo));
|
|
OnPropertyChanged(nameof(DisplayText));
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isEditing;
|
|
public bool IsEditing
|
|
{
|
|
get => _isEditing;
|
|
set
|
|
{
|
|
if (SetProperty(ref _isEditing, value))
|
|
{
|
|
OnPropertyChanged(nameof(ShowEditBox));
|
|
OnPropertyChanged(nameof(ShowDisplay));
|
|
OnPropertyChanged(nameof(ShowEditButton));
|
|
OnPropertyChanged(nameof(ShowDeleteButton));
|
|
OnPropertyChanged(nameof(ShowAddButton));
|
|
OnPropertyChanged(nameof(ShowDoNot));
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isValidating;
|
|
public bool IsValidating
|
|
{
|
|
get => _isValidating;
|
|
set
|
|
{
|
|
if (SetProperty(ref _isValidating, value))
|
|
{
|
|
OnPropertyChanged(nameof(ShowBusy));
|
|
OnPropertyChanged(nameof(ShowDoNot));
|
|
}
|
|
}
|
|
}
|
|
|
|
private string _handle = string.Empty;
|
|
public string Handle
|
|
{
|
|
get => _handle;
|
|
set
|
|
{
|
|
if (SetProperty(ref _handle, value))
|
|
OnPropertyChanged(nameof(DisplayText));
|
|
}
|
|
}
|
|
|
|
private string? _fediverseSoftware;
|
|
public string? FediverseSoftware
|
|
{
|
|
get => _fediverseSoftware;
|
|
set
|
|
{
|
|
if (SetProperty(ref _fediverseSoftware, value))
|
|
OnPropertyChanged(nameof(LogoData));
|
|
}
|
|
}
|
|
|
|
public string ProfileUrl { get; set; } = string.Empty;
|
|
|
|
private string? _error;
|
|
public string? Error
|
|
{
|
|
get => _error;
|
|
set
|
|
{
|
|
if (SetProperty(ref _error, value))
|
|
{
|
|
OnPropertyChanged(nameof(HasError));
|
|
OnPropertyChanged(nameof(ShowError));
|
|
OnPropertyChanged(nameof(ShowDoNot));
|
|
}
|
|
}
|
|
}
|
|
|
|
private string _editText = string.Empty;
|
|
public string EditText
|
|
{
|
|
get => _editText;
|
|
set => SetProperty(ref _editText, value);
|
|
}
|
|
|
|
/// <summary>The last text submitted for validation (used to skip re-validating
|
|
/// identical input — e.g. a LostFocus firing as the user clicks Cancel).</summary>
|
|
public string? LastValidatedInput { get; set; }
|
|
|
|
public string DisplayText =>
|
|
IsYoutube
|
|
? (IsSignIn ? "Sign in to YouTube" : Handle)
|
|
: IsLocked ? "Unlock with Premium"
|
|
: IsFilled ? Handle
|
|
: "No social yet";
|
|
|
|
public bool HasError => !string.IsNullOrEmpty(Error);
|
|
public bool ShowError => HasError;
|
|
public bool ShowLogo => IsYoutube ? !IsSignIn : IsFilled;
|
|
public bool ShowBusy => IsValidating;
|
|
public bool ShowEditBox => IsEditing;
|
|
public bool ShowDisplay => !IsEditing && !IsValidating;
|
|
public bool ShowSignInButton => IsYoutube && IsSignIn && !IsValidating;
|
|
public bool ShowAddButton => !IsYoutube && !IsLocked && !IsFilled && !IsEditing && !IsValidating;
|
|
public bool ShowEditButton => !IsYoutube && IsFilled && !IsEditing && !IsValidating;
|
|
public bool ShowDeleteButton => (IsFilled || IsYoutube) && !IsEditing && !IsValidating;
|
|
public bool ShowDoNot => !IsYoutube && !IsLocked && (!IsFilled || HasError || IsValidating);
|
|
|
|
public SocialSlotViewModel(int index) => Index = index;
|
|
}
|