- CartService: единая корзина для Прайс-листа и Отправить - Прайс-лист: выбор позиции + кол-во + «Добавить в заказ», индикатор корзины - Настройки (диалог ⚙ в шапке): адрес API, тема (свет/тьма, применяется сразу), грузополучатель по умолчанию; сохранение в %APPDATA% - SettingsStore (Core) + AppConfig читает сохранённый API-адрес - тема применяется на старте Проверено вживую: добавление из Прайс-листа в корзину, диалог настроек. Реальная отправка заказа (POST) — собрана и связана, живой заказ по явному «да» (автозащита блокирует боевую транзакцию без подтверждения). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
44 lines
1.5 KiB
C#
44 lines
1.5 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using Elfisa.Core;
|
|
|
|
namespace Elfisa.Avalonia.ViewModels;
|
|
|
|
public partial class SettingsViewModel : ViewModelBase
|
|
{
|
|
private readonly ApiClient _api = new();
|
|
|
|
[ObservableProperty] private string _apiBaseUrl = "";
|
|
public string[] Themes { get; } = { "Светлая", "Тёмная" };
|
|
[ObservableProperty] private int _themeIndex;
|
|
|
|
public ObservableCollection<BuyerLocationDto> Locations { get; } = new();
|
|
[ObservableProperty] private BuyerLocationDto? _selectedLocation;
|
|
|
|
public SettingsViewModel()
|
|
{
|
|
_api.SetToken(Session.Current.Token);
|
|
ApiBaseUrl = SettingsStore.Current.ApiBaseUrl ?? AppConfig.DefaultApiBaseUrl;
|
|
ThemeIndex = SettingsStore.Current.Theme == "Dark" ? 1 : 0;
|
|
if (Session.Current.IsAuthenticated) _ = LoadLocationsAsync();
|
|
}
|
|
|
|
private async Task LoadLocationsAsync()
|
|
{
|
|
try
|
|
{
|
|
var locs = await _api.GetBuyerLocationsAsync();
|
|
Locations.Clear();
|
|
foreach (var l in locs) Locations.Add(l);
|
|
var savedId = SettingsStore.Current.DefaultLocationId;
|
|
SelectedLocation = Locations.FirstOrDefault(l => l.BuyerLocationId == savedId)
|
|
?? Locations.FirstOrDefault(l => l.IsDefault)
|
|
?? Locations.FirstOrDefault();
|
|
}
|
|
catch { /* локации не критичны для настроек */ }
|
|
}
|
|
}
|