сырой проект

This commit is contained in:
2026-09-14 20:24:13 +02:00
commit 81b806cfed
14 changed files with 953 additions and 0 deletions
+129
View File
@@ -0,0 +1,129 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using SpotXInstaller.Models;
using SpotXInstaller.Services;
namespace SpotXInstaller.ViewModels;
public partial class MainViewModel : ViewModelBase
{
private readonly InstallerService _installer = new();
private CancellationTokenSource? _cts;
// --- СОСТОЯНИЯ ЭКРАНОВ ---
[ObservableProperty] private bool _isStepLoading = true;
[ObservableProperty] private bool _isStepHome;
[ObservableProperty] private bool _isStepSettings;
[ObservableProperty] private bool _isStepProgress;
// --- POPUP ---
[ObservableProperty] private bool _showPopup;
[ObservableProperty] private string _popupTitle = "";
[ObservableProperty] private string _popupMessage = "";
[ObservableProperty] private string _popupColor = "#8B5CF6";
// --- ГАЛОЧКИ ---
[ObservableProperty] private bool _blockUpdates = true;
[ObservableProperty] private bool _hidePodcasts = true;
[ObservableProperty] private bool _hidePremium = true;
[ObservableProperty] private bool _clearCache;
// --- ПРОГРЕСС ---
[ObservableProperty] private double _progressValue;
[ObservableProperty] private string _progressStatus = "Подготовка...";
[ObservableProperty] private string _miniLog = "";
public MainViewModel() => _ = BootAsync();
private async Task BootAsync()
{
await Task.Delay(3000);
SwitchTo(home: true);
}
private void SwitchTo(bool loading = false, bool home = false, bool settings = false, bool progress = false)
{
IsStepLoading = loading;
IsStepHome = home;
IsStepSettings = settings;
IsStepProgress = progress;
}
[RelayCommand] private void GoToSettings() => SwitchTo(settings: true);
[RelayCommand] private void GoBackToHome() => SwitchTo(home: true);
[RelayCommand] private void ClosePopup() => ShowPopup = false;
[RelayCommand]
private async Task StartInstallAsync()
{
await RunInstallerAsync(isUninstall: false);
}
[RelayCommand]
private async Task StartUninstallAsync()
{
await RunInstallerAsync(isUninstall: true);
}
private async Task RunInstallerAsync(bool isUninstall)
{
ProgressValue = 0;
MiniLog = "";
ProgressStatus = isUninstall ? "Подготовка восстановления..." : "Подготовка установки...";
SwitchTo(progress: true);
_cts?.Dispose();
_cts = new CancellationTokenSource();
var progress = new Progress<(int Percent, string Status)>(p =>
{
ProgressValue = p.Percent;
ProgressStatus = p.Status;
});
var log = new Progress<string>(l => MiniLog = l);
try
{
int code = isUninstall
? await _installer.UninstallAsync(progress, log, _cts.Token)
: await _installer.InstallAsync(
new InstallOptions(BlockUpdates, HidePodcasts, HidePremium, ClearCache),
progress, log, _cts.Token);
SwitchTo(home: true);
if (code == 0)
ShowNotification(
isUninstall ? "ГОТОВО" : "УСПЕХ",
isUninstall
? "Оригинальный клиент Spotify восстановлен."
: "SpotX успешно установлен.",
isUninstall ? "#8B5CF6" : "#00E676");
else
ShowNotification("ОШИБКА",
$"Скрипт завершился с кодом {code}.\n\n{MiniLog[..Math.Min(200, MiniLog.Length)]}",
"#FF3B30");
}
catch (OperationCanceledException)
{
SwitchTo(home: true);
ShowNotification("ОТМЕНЕНО", "Операция прервана.", "#FFB300");
}
catch (Exception ex)
{
SwitchTo(home: true);
ShowNotification("ОШИБКА", ex.Message, "#FF3B30");
}
}
private void ShowNotification(string title, string message, string hexColor)
{
PopupTitle = title;
PopupMessage = message;
PopupColor = hexColor;
ShowPopup = true;
}
}
+7
View File
@@ -0,0 +1,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
namespace SpotXInstaller.ViewModels;
public abstract class ViewModelBase : ObservableObject
{
}