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); /// /// 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. /// 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); } /// The last text submitted for validation (used to skip re-validating /// identical input — e.g. a LostFocus firing as the user clicks Cancel). 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; }