兼容win7版应用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

528 lines
17 KiB

using AIK.Common.Enum;
using AIK.Common.Interface;
using AIK.Common.Language;
using AIK.Models.ApiModels;
using AIK.Models.ApiModels.Integral;
using AIK.Models.ApiModels.Membership;
using AIK.Models.Menus;
using AIK.Models.SystemSettings;
using AIK.Service.IService;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace AIK.ViewModels
{
public partial class MainViewModel : ObservableObject
{
private object _viewContent;
public object ViewContent
{
get => _viewContent;
set => SetProperty(ref _viewContent, value);
}
public ObservableCollection<MenuModel> Menus { get; } = new ObservableCollection<MenuModel>();
private readonly ILocalizationService _localization;
private readonly IConfigurationService _configurationService;
private readonly IDataCacheService _dataCacheService;
private readonly IMembershipService _membershipService;
private readonly ISettingsService _settingsService;
private readonly IUserSessionCoordinator _userSessionCoordinator;
private readonly ILogger<MainViewModel> _logger;
[ObservableProperty]
private byte[]? _qrCodeUserBytes;
[ObservableProperty]
private bool _isQrCodeExpired;
[ObservableProperty]
private string _statusText = "等待扫码登录...";
public string QrCodeText { get; private set; } = string.Empty;
[ObservableProperty]
private bool _isLoggedIn;
public bool IsVisibilityQrCode => !IsLoggedIn;
[ObservableProperty]
private UserModel? _userInfo;
[ObservableProperty]
private UserStatus _userStatus = UserStatus.NotLoggedIn;
[ObservableProperty]
private IntegralModel? _integralInfo;
public MainViewModel(
ILocalizationService localization,
IConfigurationService configurationService,
IQRCodeService qRCodeService,
IDataCacheService dataCacheService,
IAikDataService aikDataService,
IMembershipService membershipService,
ISettingsService settingsService,
IUserSessionCoordinator userSessionCoordinator,
ILogger<MainViewModel> logger)
{
if (!IsInDesignMode())
{
_logger = logger;
_settingsService = settingsService;
_localization = localization;
_configurationService = configurationService;
_dataCacheService = dataCacheService;
_membershipService = membershipService;
_userSessionCoordinator = userSessionCoordinator;
_ = qRCodeService;
_ = aikDataService;
_localization.InitializeAsync(_settingsService.Load().Language);
_localization.LanguageChanged += OnLanguageChanged;
_userSessionCoordinator.StateChanged += OnUserSessionStateChanged;
Initialize();
_ = _userSessionCoordinator.InitializeAsync();
}
}
private bool IsInDesignMode()
{
return DesignerProperties.GetIsInDesignMode(new DependencyObject());
}
partial void OnIsLoggedInChanged(bool value)
{
OnPropertyChanged(nameof(IsVisibilityQrCode));
}
private async void OnUserSessionStateChanged(object? sender, UserSessionStateChangedEventArgs e)
{
if (Application.Current?.Dispatcher is { } dispatcher && !dispatcher.CheckAccess())
{
await dispatcher.InvokeAsync(() => ApplyUserSessionState(e.State));
return;
}
ApplyUserSessionState(e.State);
}
private void ApplyUserSessionState(UserSessionState state)
{
QrCodeUserBytes = state.QrCodeUserBytes;
IsQrCodeExpired = state.IsQrCodeExpired;
StatusText = state.StatusText;
IsLoggedIn = state.IsLoggedIn;
UserInfo = state.UserInfo;
UserStatus = state.UserStatus;
IntegralInfo = state.IntegralInfo;
AuthorizeMenus(state.CanShowAuthorizedMenus);
}
private void Initialize()
{
AiKLanguage.GetLanguage(_settingsService.Load().Language);
AiKLanguage.LanguageKey.TryGetValue("HomePage", out string k1Name);
var homeMenu = new MenuModel
{
Key = 1,
MenuHeader = k1Name,
MenuIcon = "\ue644",
TargetView = "Home.HomePage",
ResourceKey = "HomePage",
IsSelected = true
};
AiKLanguage.LanguageKey.TryGetValue("Settings", out string k2Name);
var settingsMenu = new MenuModel
{
Key = 2,
MenuHeader = k2Name,
MenuIcon = "\ue69d",
TargetView = "SettingsPage",
ResourceKey = "Settings"
};
AiKLanguage.LanguageKey.TryGetValue("RemoteGeneration", out string k3Name);
var remoteGenerationMenu = new MenuModel
{
Key = 3,
MenuHeader = k3Name,
MenuIcon = "\ue6c7",
TargetView = "RemoteGeneration.RemoteGenerationPage",
ResourceKey = "RemoteGeneration",
IsSelected = false,
IsAuthorized = false,
IsShow = true
};
AiKLanguage.LanguageKey.TryGetValue("RemoteCopy", out string k4Name);
var remoteCopyMenu = new MenuModel
{
Key = 4,
MenuHeader = k4Name,
MenuIcon = "\ue613",
TargetView = "RemoteCopy.RemoteCopyPage",
ResourceKey = "RemoteCopy",
IsAuthorized = true,
IsShow = true
};
AiKLanguage.LanguageKey.TryGetValue("RemoteControlDetector", out string k5Name);
var remoteDetectionMenu = new MenuModel
{
Key = 5,
MenuHeader = k5Name,
MenuIcon = "\ue600",
TargetView = "RemoteControlDetector.RemoteControlDetectorPage",
ResourceKey = "RemoteControlDetector",
IsAuthorized = true,
IsShow = true
};
AiKLanguage.LanguageKey.TryGetValue("ChipIdentificationCopy", out string k6Name);
var chipIdentificationCopyMenu = new MenuModel
{
Key = 6,
MenuHeader = k6Name,
MenuIcon = "\ue632",
TargetView = "ChipIdentificationCopy.ChipIdentificationCopyPage",
ResourceKey = "ChipIdentificationCopy",
IsAuthorized = true,
IsShow = true
};
AiKLanguage.LanguageKey.TryGetValue("ChipGeneration", out string k7Name);
var chipGenerationMenu = new MenuModel
{
Key = 7,
MenuHeader = k7Name,
MenuIcon = "\ue626",
TargetView = "ChipGeneration.ChipGenerationPage",
ResourceKey = "ChipGeneration"
};
AiKLanguage.LanguageKey.TryGetValue("AccessCardCopy", out string k8Name);
var accessCardCopyMenu = new MenuModel
{
Key = 8,
MenuHeader = k8Name,
MenuIcon = "\ue63d",
TargetView = "IDCardCopy.AccessCardCopyPage",
ResourceKey = "AccessCardCopy"
};
AiKLanguage.LanguageKey.TryGetValue("KeyUnlock", out string k9Name);
var keyUnlockMenu = new MenuModel
{
Key = 9,
MenuHeader = k9Name,
MenuIcon = "\ue61c",
TargetView = "KeyUnlock.KeyUnlockPage",
ResourceKey = "KeyUnlock"
};
AiKLanguage.LanguageKey.TryGetValue("TirePressure", out string k10Name);
var tirePressureMenu = new MenuModel
{
Key = 10,
MenuHeader = k10Name,
MenuIcon = "\ue630",
TargetView = "TirePressure.TirePressurePage",
ResourceKey = "TirePressure",
IsAuthorized = false,
IsShow = true
};
AiKLanguage.LanguageKey.TryGetValue("MatchingFunction", out string k11Name);
var matchingFunctionMenu = new MenuModel
{
Key = 11,
MenuHeader = k11Name,
MenuIcon = "\ue64b",
TargetView = "MatchingFunctionPage",
ResourceKey = "MatchingFunction"
};
AiKLanguage.LanguageKey.TryGetValue("ChipWriteStart", out string k12Name);
var chipWriteStartMenu = new MenuModel
{
Key = 12,
MenuHeader = k12Name,
MenuIcon = "\ue680",
TargetView = "ChipWriteStart.ChipWriteStartPage",
ResourceKey = "ChipWriteStart",
IsAuthorized = false,
IsShow = true
};
AiKLanguage.LanguageKey.TryGetValue("Programmer", out string k13Name);
var programmerMenu = new MenuModel
{
Key = 13,
MenuHeader = k13Name,
MenuIcon = "\ue631",
TargetView = "ProgrammerPage",
ResourceKey = "Programmer"
};
AiKLanguage.LanguageKey.TryGetValue("AntiTheftData", out string k14Name);
var antiTheftDataMenu = new MenuModel
{
Key = 14,
MenuHeader = k14Name,
MenuIcon = "\ue60c;",
TargetView = "AntiTheftDataPage",
ResourceKey = "AntiTheftData"
};
AiKLanguage.LanguageKey.TryGetValue("UpdateCenter", out string k15Name);
var updateCenterMenu = new MenuModel
{
Key = 15,
MenuHeader = k15Name,
MenuIcon = "\ue619",
TargetView = "UpdateCenter.UpdateCenterPage",
ResourceKey = "UpdateCenter"
};
remoteGenerationMenu.SubItems.Add(new MenuModel
{
Key = 31,
MenuHeader = "汽车遥控",
MenuIcon = "\ue709",
TargetView = "CarRemotePage"
});
remoteGenerationMenu.SubItems.Add(new MenuModel
{
Key = 32,
MenuHeader = "车库门",
MenuIcon = "\ue709",
TargetView = "GarageDoorPage"
});
remoteGenerationMenu.SubItems.Add(new MenuModel
{
Key = 33,
MenuHeader = "视频演示",
MenuIcon = "\ue709",
TargetView = "VideoDemoPage"
});
remoteGenerationMenu.SubItems.Add(new MenuModel
{
Key = 34,
MenuHeader = "烧录记录",
MenuIcon = "\ue709",
TargetView = "BurnRecordPage"
});
AiKLanguage.LanguageKey.TryGetValue("CloudData", out string k16Name);
var cloudDataMenu = new MenuModel
{
Key = 16,
MenuHeader = k16Name,
MenuIcon = "\ue60c;",
TargetView = "CloudData.CloudDataPage",
ResourceKey = "CloudData",
IsAuthorized = true,
IsShow = true
};
Menus.Add(homeMenu);
Menus.Add(remoteGenerationMenu);
//Menus.Add(remoteCopyMenu);
//Menus.Add(remoteDetectionMenu);
Menus.Add(tirePressureMenu);
Menus.Add(updateCenterMenu);
Menus.Add(settingsMenu);
Menus.Add(cloudDataMenu);
//Menus.Add(chipWriteStartMenu);
if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
{
ShowPage(Menus[0]);
}
_ = chipIdentificationCopyMenu;
_ = chipGenerationMenu;
_ = accessCardCopyMenu;
_ = keyUnlockMenu;
_ = matchingFunctionMenu;
_ = programmerMenu;
_ = antiTheftDataMenu;
}
private void AuthorizeMenus(bool isShow)
{
if (Menus.Count > 0)
{
Menus.Where(a => a.IsAuthorized).ToList().ForEach(a => a.IsShow = isShow);
}
}
private void OnLanguageChanged(object sender, EventArgs e)
{
var languagecode = ((dynamic)sender).Name;
UpdateMenuTexts(languagecode);
}
private void UpdateMenuTexts(string languagecode)
{
if (Menus.Count > 0)
{
AiKLanguage.GetLanguage(languagecode);
foreach (var item in Menus)
{
if (item.ResourceKey != null)
{
Application.Current.Dispatcher.Invoke(() =>
{
item.MenuHeader = AiKLanguage.LanguageKey.GetValueOrDefault(item.ResourceKey) ?? string.Empty;
});
}
}
}
}
[RelayCommand]
private void SwitchPage(object obj)
{
if (obj is MenuModel model)
{
if (ViewContent != null && ViewContent.GetType().Name == model.TargetView)
{
return;
}
Type? type = Assembly.Load("AIK.Views")
.GetType("AIK.Views.MenuPages." + model.TargetView);
if (type != null)
{
ViewContent = Activator.CreateInstance(type);
}
}
}
private void ShowPage(object obj)
{
SwitchPage(obj);
}
[RelayCommand]
private Task Logout()
{
return _userSessionCoordinator.LogoutAsync();
}
[RelayCommand]
private Task RefreshQrCode()
{
return _userSessionCoordinator.RefreshQrCodeAsync();
}
[RelayCommand]
private async Task ShowKeyRecord()
{
foreach (var item in Menus)
{
item.IsSelected = false;
}
await _userSessionCoordinator.RefreshIntegralAsync();
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
return;
}
Type? type = Assembly.Load("AIK.Views")
.GetType("AIK.Views.MenuPages.KeyRecord.UserKeyRecordPage");
if (type != null)
{
ViewContent = Activator.CreateInstance(type);
}
}
[RelayCommand]
private async Task ShowIntegralRecord()
{
foreach (var item in Menus)
{
item.IsSelected = false;
}
await _userSessionCoordinator.RefreshIntegralAsync();
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
return;
}
Type? type = Assembly.Load("AIK.Views")
.GetType("AIK.Views.MenuPages.Integral.IntegralRecordPage");
if (type != null)
{
ViewContent = Activator.CreateInstance(type);
}
}
[RelayCommand]
private async Task ShowIntegralRecharge()
{
await _userSessionCoordinator.RefreshIntegralAsync();
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
return;
}
Type? type = Assembly.Load("AIK.Views")
.GetType("AIK.Views.MenuPages.Integral.IntegralRechargeWindow");
if (type == null || Activator.CreateInstance(type) is not Window window)
{
return;
}
type.GetMethod("SetCurrentIntegral")
?.Invoke(window, new object[] { IntegralInfo?.Integral ?? 0 });
window.Owner = Application.Current?.MainWindow;
window.ShowDialog();
await _userSessionCoordinator.RefreshIntegralAsync();
}
[RelayCommand]
private async Task ShowMembershipOpen()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
return;
}
Type? type = Assembly.Load("AIK.Views")
.GetType("AIK.Views.MenuPages.Membership.MembershipOpenWindow");
if (type == null || Activator.CreateInstance(type) is not Window window)
{
return;
}
window.Owner = Application.Current?.MainWindow;
window.ShowDialog();
await _userSessionCoordinator.RefreshIntegralAsync();
}
}
}