This commit is contained in:
MeysamMoghaddam
2025-10-13 09:23:10 +03:30
parent b9a0cdff83
commit 980bdb45be
4 changed files with 303 additions and 54 deletions

View File

@@ -1,5 +1,8 @@
using FluentValidation;
using FrontOffice.BFF.User.Protobuf.Protos.User;
using FrontOffice.BFF.User.Protobuf.Validator;
using FrontOffice.BFF.UserAddress.Protobuf.Protos.UserAddress;
using FrontOffice.BFF.UserAddress.Protobuf.Validator;
using FrontOffice.Main.Utilities;
using Mapster;
using Microsoft.AspNetCore.Components;
@@ -13,9 +16,11 @@ namespace FrontOffice.Main.Pages.Profile;
public partial class Index
{
[Inject] private UserContract.UserContractClient UserContract { get; set; } = default!;
[Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!;
private GetUserResponse _userProfile = new();
private UpdateUserRequest _updateUserRequest = new();
private readonly UpdateUserRequestValidator _personalValidator = new();
private MudForm? _personalForm;
@@ -24,14 +29,22 @@ public partial class Index
private string _copyMessage = string.Empty;
private readonly UserProfileValidator _personalValidator = new();
private DateTime? _date;
// Address management
private List<GetAllUserAddressByFilterResponseModel> _addresses = new();
private bool _isLoadingAddresses;
private CreateNewUserAddressRequest _newAddressRequest = new();
private UpdateUserAddressRequest _editAddressRequest = new();
private MudForm? _addressForm;
private readonly CreateNewUserAddressRequestValidator _addressValidator = new();
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
await LoadUserProfile();
await LoadAddresses();
}
}
@@ -52,7 +65,6 @@ public partial class Index
StateHasChanged();
}
private async Task SavePersonalInfo()
{
if (_personalForm is null) return;
@@ -82,12 +94,6 @@ public partial class Index
}
}
private void CancelPersonalChanges()
{
// TODO: Reset form to original values
Snackbar.Add("تغییرات لغو شد.", Severity.Info);
}
private async Task SaveSettings()
{
@@ -95,10 +101,7 @@ public partial class Index
try
{
await SavePersonalInfo();
Snackbar.Add("تنظیمات با موفقیت ذخیره شد.", Severity.Success);
}
catch (Exception ex)
{
@@ -153,50 +156,104 @@ public partial class Index
}
}
public class UserProfile
// Address management methods
private async Task LoadAddresses()
{
[Required(ErrorMessage = "نام الزامی است")]
public string? FirstName { get; set; }
[Required(ErrorMessage = "نام خانوادگی الزامی است")]
public string? LastName { get; set; }
[Required(ErrorMessage = "ایمیل الزامی است")]
[EmailAddress(ErrorMessage = "فرمت ایمیل صحیح نیست")]
public string? Email { get; set; }
[Required(ErrorMessage = "شماره موبایل الزامی است")]
public string? PhoneNumber { get; set; }
public string? NationalCode { get; set; }
public string? BirthDate { get; set; }
public string? Address { get; set; }
// Read-only fields
public string? JoinDate { get; set; }
public string? LastLogin { get; set; }
public int TotalReferrals { get; set; }
public string? Level { get; set; }
}
public class AccountSettings
{
public bool EmailNotifications { get; set; }
public bool SmsNotifications { get; set; }
public bool PushNotifications { get; set; }
public bool ProfileVisibility { get; set; }
public bool ShowOnlineStatus { get; set; }
public string? Language { get; set; }
public string? Theme { get; set; }
}
public class UserProfileValidator : AbstractValidator<UserProfile>
{
public UserProfileValidator()
_isLoadingAddresses = true;
try
{
RuleFor(x => x.FirstName).NotEmpty().WithMessage("نام الزامی است");
RuleFor(x => x.LastName).NotEmpty().WithMessage("نام خانوادگی الزامی است");
RuleFor(x => x.Email).NotEmpty().EmailAddress().WithMessage("ایمیل معتبر نیست");
RuleFor(x => x.PhoneNumber).NotEmpty().WithMessage("شماره موبایل الزامی است");
var response = await UserAddressContract.GetAllUserAddressByFilterAsync(request: new());
if (response?.Models?.Any() == true)
{
_addresses = response.Models.ToList();
}
else
{
_addresses = new List<GetAllUserAddressByFilterResponseModel>();
}
}
catch (Exception ex)
{
Snackbar.Add($"خطا در بارگذاری آدرس‌ها: {ex.Message}", Severity.Error);
_addresses = new List<GetAllUserAddressByFilterResponseModel>();
}
finally
{
_isLoadingAddresses = false;
await InvokeAsync(StateHasChanged);
}
}
private async Task OpenAddAddressDialog()
{
_newAddressRequest = new CreateNewUserAddressRequest();
var dialog = await DialogService.ShowAsync<AddressDialog>("افزودن آدرس جدید", new DialogParameters<AddressDialog>
{
{ x => x.IsEdit, false }
});
var result = await dialog.Result;
if (!result.Canceled)
{
await LoadAddresses();
}
}
private async Task OpenEditAddressDialog(GetAllUserAddressByFilterResponseModel address)
{
var dialog = await DialogService.ShowAsync<AddressDialog>("ویرایش آدرس", new DialogParameters<AddressDialog>
{
{ x => x.Model, address },
{ x => x.IsEdit, true }
});
var result = await dialog.Result;
if (!result.Canceled)
{
await LoadAddresses();
}
}
private async Task SetAsDefaultAddress(long addressId)
{
try
{
await UserAddressContract.SetAddressAsDefaultAsync(request: new()
{
Id = addressId
});
Snackbar.Add("آدرس پیش‌فرض با موفقیت تغییر کرد.", Severity.Success);
await LoadAddresses();
}
catch (Exception ex)
{
Snackbar.Add($"خطا در تغییر آدرس پیش‌فرض: {ex.Message}", Severity.Error);
}
}
private async Task DeleteAddress(long addressId)
{
var result = await DialogService.ShowMessageBox(
"تأیید حذف",
"آیا از حذف این آدرس اطمینان دارید؟",
yesText: "حذف",
cancelText: "لغو");
if (result == true)
{
try
{
await UserAddressContract.DeleteUserAddressAsync(request: new()
{
Id = addressId
});
Snackbar.Add("آدرس با موفقیت حذف شد.", Severity.Success);
await LoadAddresses();
}
catch (Exception ex)
{
Snackbar.Add($"خطا در حذف آدرس: {ex.Message}", Severity.Error);
}
}
}
}