using FrontOffice.BFF.UserAddress.Protobuf.Protos.UserAddress; using FrontOffice.BFF.UserAddress.Protobuf.Validator; using Mapster; using Microsoft.AspNetCore.Components; using MudBlazor; using Severity = MudBlazor.Severity; using CityProto = FrontOffice.BFF.City.Protobuf; namespace FrontOffice.Main.Pages.Profile.Components; public partial class EditAddressDialog : ComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = default!; [Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!; [Inject] private CityProto.CityContract.CityContractClient CityContract { get; set; } = default!; [Parameter] public GetAllUserAddressByFilterResponseModel? Model { get; set; } private MudForm? _form; private readonly UpdateUserAddressRequestValidator _validator = new(); private bool _isSaving; private UpdateUserAddressRequest _request = new(); private CityProto.GetAllCitiesByFilterResponseModel? _selectedCity; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); if (Model != null) { _request = Model.Adapt(); // Load selected city if CityId exists if (Model.CityId > 0) { await LoadCurrentCity(Model.CityId); } } } private async Task LoadCurrentCity(long cityId) { try { var response = await CityContract.GetAllCitiesByFilterAsync(new CityProto.GetAllCitiesByFilterRequest { PaginationState = new CityProto.PaginationState { PageNumber = 1, PageSize = 1 }, Filter = new CityProto.GetAllCitiesByFilterFilter { Id = cityId } }); _selectedCity = response?.Models?.FirstOrDefault(); } catch { // Ignore error loading city } } private async Task> SearchCities(string value, CancellationToken ct) { if (string.IsNullOrWhiteSpace(value) || value.Length < 2) return Enumerable.Empty(); try { var response = await CityContract.GetAllCitiesByFilterAsync(new CityProto.GetAllCitiesByFilterRequest { PaginationState = new CityProto.PaginationState { PageNumber = 1, PageSize = 20 }, Filter = new CityProto.GetAllCitiesByFilterFilter { Native = value } }, cancellationToken: ct); return response?.Models?.ToList() ?? new List(); } catch { return Enumerable.Empty(); } } private async Task SaveAddress() { if (_form == null) return; await _form.Validate(); if (!_form.IsValid || _selectedCity == null) { if (_selectedCity == null) Snackbar.Add("لطفاً شهر را انتخاب کنید.", Severity.Warning); return; } _request.CityId = _selectedCity.Id; _isSaving = true; try { await UserAddressContract.UpdateUserAddressAsync(_request); Snackbar.Add("آدرس با موفقیت ویرایش شد.", Severity.Success); MudDialog.Close(DialogResult.Ok(true)); } catch (Exception ex) { Snackbar.Add($"خطا: {ex.Message}", Severity.Error); } finally { _isSaving = false; await InvokeAsync(StateHasChanged); } } private void Cancel() => MudDialog.Close(DialogResult.Cancel()); }