Skip to content

Commit

Permalink
Added contact edit page for TgDownloaderDesktop
Browse files Browse the repository at this point in the history
  • Loading branch information
DamianMorozov committed Jan 5, 2025
1 parent ca2c874 commit baffe44
Show file tree
Hide file tree
Showing 11 changed files with 784 additions and 195 deletions.
2 changes: 2 additions & 0 deletions Clients/TgDownloaderDesktop/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ public App()
services.AddTransient<TgLoadDataPage>();
services.AddTransient<TgContactsViewModel>();
services.AddTransient<TgContactsPage>();
services.AddTransient<TgContactDetailsViewModel>();
services.AddTransient<TgContactDetailsPage>();
services.AddTransient<TgSourcesViewModel>();
services.AddTransient<TgSourcesPage>();
services.AddTransient<TgFiltersViewModel>();
Expand Down
17 changes: 9 additions & 8 deletions Clients/TgDownloaderDesktop/Services/PageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,21 @@ public sealed class PageService : IPageService

public PageService()
{
Configure<TgMainViewModel, TgMainPage>();
Configure<TgLoadDataViewModel, TgLoadDataPage>();
Configure<ContentGridDetailViewModel, ContentGridDetailPage>();
Configure<ContentGridViewModel, ContentGridPage>();
Configure<DataGridViewModel, DataGridPage>();
Configure<ListDetailsViewModel, ListDetailsPage>();
Configure<TgConnectViewModel, TgConnectPage>();
Configure<TgContactDetailsViewModel, TgContactDetailsPage>();
Configure<TgContactsViewModel, TgContactsPage>();
Configure<TgFiltersViewModel, TgFiltersPage>();
Configure<TgLoadDataViewModel, TgLoadDataPage>();
Configure<TgMainViewModel, TgMainPage>();
Configure<TgProxiesViewModel, TgProxiesPage>();
Configure<TgSettingsViewModel, TgSettingsPage>();
Configure<TgSourcesViewModel, TgSourcesPage>();
Configure<TgStoriesViewModel, TgStoriesPage>();
Configure<TgProxiesViewModel, TgProxiesPage>();
Configure<WebViewViewModel, WebViewPage>();
Configure<ListDetailsViewModel, ListDetailsPage>();
Configure<ContentGridViewModel, ContentGridPage>();
Configure<ContentGridDetailViewModel, ContentGridDetailPage>();
Configure<DataGridViewModel, DataGridPage>();
Configure<TgSettingsViewModel, TgSettingsPage>();
}

public Type GetPageType(string key)
Expand Down
48 changes: 48 additions & 0 deletions Clients/TgDownloaderDesktop/Strings/en-us/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@
<data name="Shell_Contacts.Content" xml:space="preserve">
<value>Contacts</value>
</data>
<data name="Shell_ContactDetails.Content" xml:space="preserve">
<value>Edit contact</value>
</data>
<data name="Shell_Filters.Content" xml:space="preserve">
<value>Filters</value>
</data>
Expand Down Expand Up @@ -750,4 +753,49 @@
<data name="RpcErrorFloodWait" xml:space="preserve">
<value>A wait is required</value>
</data>
<data name="FieldUid.Text" xml:space="preserve">
<value>UID</value>
</data>
<data name="FieldId.Text" xml:space="preserve">
<value>ID</value>
</data>
<data name="FieldDtChanged.Text" xml:space="preserve">
<value>Changed</value>
</data>
<data name="FieldAccessHash.Text" xml:space="preserve">
<value>Access hash</value>
</data>
<data name="FieldIsActive.Text" xml:space="preserve">
<value>Active</value>
</data>
<data name="FieldIsBot.Text" xml:space="preserve">
<value>Bot</value>
</data>
<data name="FieldFirstName.Text" xml:space="preserve">
<value>First name</value>
</data>
<data name="FieldLastName.Text" xml:space="preserve">
<value>Last name</value>
</data>
<data name="FieldUserName.Text" xml:space="preserve">
<value>User name</value>
</data>
<data name="FieldUserNames.Text" xml:space="preserve">
<value>User names</value>
</data>
<data name="FieldPhoneNumber.Text" xml:space="preserve">
<value>Phone number</value>
</data>
<data name="FieldStatus.Text" xml:space="preserve">
<value>Status</value>
</data>
<data name="FieldRestrictionReason.Text" xml:space="preserve">
<value>Restriction reason</value>
</data>
<data name="FieldLangCode.Text" xml:space="preserve">
<value>Language code</value>
</data>
<data name="FieldStoriesMaxId.Text" xml:space="preserve">
<value>Maximum Id storis</value>
</data>
</root>
48 changes: 48 additions & 0 deletions Clients/TgDownloaderDesktop/Strings/ru-RU/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@
<data name="Shell_Contacts.Content" xml:space="preserve">
<value>Контакты</value>
</data>
<data name="Shell_ContactDetails.Content" xml:space="preserve">
<value>Редактирование контакта</value>
</data>
<data name="Shell_Filters.Content" xml:space="preserve">
<value>Фильтры</value>
</data>
Expand Down Expand Up @@ -812,4 +815,49 @@
<data name="RpcErrorFloodWait" xml:space="preserve">
<value>Необходимо подождать</value>
</data>
<data name="FieldUid.Text" xml:space="preserve">
<value>УИД</value>
</data>
<data name="FieldId.Text" xml:space="preserve">
<value>ИД</value>
</data>
<data name="FieldDtChanged.Text" xml:space="preserve">
<value>Изменено</value>
</data>
<data name="FieldAccessHash.Text" xml:space="preserve">
<value>Хэш доступа</value>
</data>
<data name="FieldIsActive.Text" xml:space="preserve">
<value>Активно</value>
</data>
<data name="FieldIsBot.Text" xml:space="preserve">
<value>Бот</value>
</data>
<data name="FieldFirstName.Text" xml:space="preserve">
<value>Имя</value>
</data>
<data name="FieldLastName.Text" xml:space="preserve">
<value>Фамилия</value>
</data>
<data name="FieldUserName.Text" xml:space="preserve">
<value>Имя пользователя</value>
</data>
<data name="FieldUserNames.Text" xml:space="preserve">
<value>Имена пользователя</value>
</data>
<data name="FieldPhoneNumber.Text" xml:space="preserve">
<value>Номер телефона</value>
</data>
<data name="FieldStatus.Text" xml:space="preserve">
<value>Статус</value>
</data>
<data name="FieldRestrictionReason.Text" xml:space="preserve">
<value>Причина ограничения</value>
</data>
<data name="FieldLangCode.Text" xml:space="preserve">
<value>Код языка</value>
</data>
<data name="FieldStoriesMaxId.Text" xml:space="preserve">
<value>Максимальный Id сторис</value>
</data>
</root>
3 changes: 3 additions & 0 deletions Clients/TgDownloaderDesktop/TgDownloaderDesktop.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@
<Page Update="Views\TgConnectPage.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Views\TgContactDetailsPage.xaml">
<SubType>Designer</SubType>
</Page>
<Page Update="Views\TgFiltersPage.xaml">
<SubType>Designer</SubType>
</Page>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// This is an independent project of an individual developer. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com

namespace TgDownloaderDesktop.ViewModels;

[DebuggerDisplay("{ToDebugString()}")]
public sealed partial class TgContactDetailsViewModel : TgPageViewModelBase
{
#region Public and private fields, properties, constructor

private TgEfContactRepository Repository { get; } = new(TgEfUtils.EfContext);
[ObservableProperty]
public partial Guid Uid { get; set; } = default!;
[ObservableProperty]
public partial TgEfContactDto Dto { get; set; } = default!;
public IRelayCommand LoadDataStorageCommand { get; }
public IRelayCommand ClearDataStorageCommand { get; }
public IRelayCommand UpdateOnlineCommand { get; }

public TgContactDetailsViewModel(ITgSettingsService settingsService) : base(settingsService)
{
// Commands
ClearDataStorageCommand = new AsyncRelayCommand(ClearDataStorageAsync);
LoadDataStorageCommand = new AsyncRelayCommand(LoadDataStorageAsync);
UpdateOnlineCommand = new AsyncRelayCommand(UpdateOnlineAsync);
}

#endregion

#region Public and private methods

public override async Task OnNavigatedToAsync(NavigationEventArgs e) => await LoadDataAsync(async () =>
{
TgEfUtils.AppStorage = SettingsService.AppStorage;
TgEfUtils.RecreateEfContext();
Uid = e.Parameter is Guid uid ? uid : Guid.Empty;
await LoadDataStorageCoreAsync();
await ReloadUiAsync();
});

private async Task ReloadUiAsync()
{
ConnectionDt = string.Empty;
ConnectionMsg = string.Empty;
Exception.Default();
await TgDesktopUtils.TgClient.CheckClientIsReadyAsync();
IsOnlineReady = TgDesktopUtils.TgClient.IsReady;
await Task.CompletedTask;
}

private async Task ClearDataStorageAsync() => await ContentDialogAsync(ClearDataStorageCoreAsync, TgResourceExtensions.AskDataClear());

private async Task ClearDataStorageCoreAsync()
{
Dto = new();
await Task.CompletedTask;
}

private async Task LoadDataStorageAsync() => await ContentDialogAsync(LoadDataStorageCoreAsync, TgResourceExtensions.AskDataLoad(), useLoadData: true);

private async Task LoadDataStorageCoreAsync()
{
if (!SettingsService.IsExistsAppStorage) return;
Dto = await Repository.GetDtoAsync(x => x.Uid == Uid);
}

private async Task UpdateOnlineAsync() => await ContentDialogAsync(UpdateOnlineCoreAsync, TgResourceExtensions.AskUpdateOnline());

private async Task UpdateOnlineCoreAsync()
{
await LoadDataAsync(async () => {
if (!await TgDesktopUtils.TgClient.CheckClientIsReadyAsync()) return;
var tgDownloadSettings = new TgDownloadSettingsViewModel();
await TgDesktopUtils.TgClient.SearchSourcesTgAsync(tgDownloadSettings, TgEnumSourceType.Contact);
await LoadDataStorageCoreAsync();
});
}

#endregion
}
16 changes: 13 additions & 3 deletions Clients/TgDownloaderDesktop/ViewModels/TgContactsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,20 @@ namespace TgDownloaderDesktop.ViewModels;
[DebuggerDisplay("{ToDebugString()}")]
public sealed partial class TgContactsViewModel : TgPageViewModelBase
{
#region Public and private fields, properties, constructor
#region Public and private fields, properties, constructor

private TgEfContactRepository Repository { get; } = new(TgEfUtils.EfContext);
private readonly INavigationService _navigationService;
private TgEfContactRepository Repository { get; } = new(TgEfUtils.EfContext);
[ObservableProperty]
public partial ObservableCollection<TgEfContactDto> Dtos { get; set; } = [];
public IRelayCommand LoadDataStorageCommand { get; }
public IRelayCommand ClearDataStorageCommand { get; }
public IRelayCommand DefaultSortCommand { get; }
public IRelayCommand UpdateOnlineCommand { get; }

public TgContactsViewModel(ITgSettingsService settingsService) : base(settingsService)
public TgContactsViewModel(ITgSettingsService settingsService, INavigationService navigationService) : base(settingsService)
{
_navigationService = navigationService;
// Commands
ClearDataStorageCommand = new AsyncRelayCommand(ClearDataStorageAsync);
DefaultSortCommand = new AsyncRelayCommand(DefaultSortAsync);
Expand Down Expand Up @@ -94,5 +96,13 @@ await LoadDataAsync(async () => {
});
}

public void DataGrid_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
if (sender is not DataGrid dataGrid) return;
if (dataGrid.SelectedItem is not TgEfContactDto dto) return;

_navigationService.NavigateTo(typeof(TgContactDetailsViewModel).FullName!, dto.Uid);
}

#endregion
}
Loading

0 comments on commit baffe44

Please sign in to comment.