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
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();
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|