Add capability-first account and calendar setup flow

This commit is contained in:
Burak Kaan Köse
2026-04-20 19:38:30 +02:00
parent 54148716bb
commit d85812ed7b
41 changed files with 1369 additions and 333 deletions
@@ -1,6 +1,7 @@
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
@@ -9,6 +10,7 @@ using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Navigation;
using Wino.Core.ViewModels.Data;
using Wino.Mail.ViewModels.Data;
using Wino.Messaging.Client.Navigation;
@@ -17,6 +19,7 @@ namespace Wino.Core.ViewModels;
public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewModel
{
public ObservableCollection<IAccountProviderDetailViewModel> Accounts { get; set; } = [];
public IEnumerable<IAccountProviderDetailViewModel> StartupAccounts => Accounts.Where(IsStartupEligible);
public bool IsPurchasePanelVisible => !HasUnlimitedAccountProduct;
public bool IsAccountCreationAlmostOnLimit => Accounts != null && Accounts.Count == FREE_ACCOUNT_COUNT - 1;
@@ -130,10 +133,21 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM
private void AccountsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged(nameof(HasAccountsDefined));
OnPropertyChanged(nameof(StartupAccounts));
}
private static string GetAccountDetailsTitle(MailAccount account)
=> !string.IsNullOrWhiteSpace(account?.Address)
? string.Format(Translator.SettingsAccountDetails_NavigationTitle, account.Address)
: account?.Name ?? Translator.AccountDetailsPage_Title;
private static bool IsStartupEligible(IAccountProviderDetailViewModel account)
{
return account switch
{
AccountProviderDetailViewModel accountViewModel => accountViewModel.Account.IsMailAccessGranted,
MergedAccountProviderDetailViewModel mergedAccountViewModel => mergedAccountViewModel.HoldingAccounts.Any(a => a.Account.IsMailAccessGranted),
_ => true
};
}
}
@@ -1,5 +1,6 @@
using System;
using CommunityToolkit.Mvvm.ComponentModel;
using Wino.Core.Domain;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces;
@@ -9,6 +10,8 @@ public partial class AccountProviderDetailViewModel : ObservableObject, IAccount
{
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(CapabilitySummary))]
[NotifyPropertyChangedFor(nameof(DescriptionText))]
private MailAccount account;
public IProviderDetail ProviderDetail { get; set; }
@@ -20,6 +23,10 @@ public partial class AccountProviderDetailViewModel : ObservableObject, IAccount
public int Order => Account.Order;
public string StartupEntityAddresses => Account.Address;
public string CapabilitySummary => BuildCapabilitySummary(Account);
public string DescriptionText => string.IsNullOrWhiteSpace(Account.Address)
? CapabilitySummary
: $"{CapabilitySummary} | {Account.Address}";
public int HoldingAccountCount => 1;
@@ -30,4 +37,15 @@ public partial class AccountProviderDetailViewModel : ObservableObject, IAccount
ProviderDetail = providerDetail;
Account = account;
}
private static string BuildCapabilitySummary(MailAccount account)
{
if (account?.IsMailAccessGranted == true && account.IsCalendarAccessGranted)
return Translator.AccountCapability_MailAndCalendar;
if (account?.IsMailAccessGranted == true)
return Translator.AccountCapability_MailOnly;
return Translator.AccountCapability_CalendarOnly;
}
}