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 Menus { get; } = new ObservableCollection(); 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 _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 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(); } } }