From 3e30b6c1f67e7d32c02ef99d3a915a45412295b9 Mon Sep 17 00:00:00 2001 From: MeysamMoghaddam <65253484+MeysamMoghaddam@users.noreply.github.com> Date: Thu, 9 Oct 2025 22:09:24 +0330 Subject: [PATCH] u --- .../Pages/PackageDetail.razor | 44 ++++++++++- .../Pages/PackageDetail.razor.cs | 74 ++++++++++++++++++- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/src/FrontOffice.Main/Pages/PackageDetail.razor b/src/FrontOffice.Main/Pages/PackageDetail.razor index 8aa36b7..1d624fc 100644 --- a/src/FrontOffice.Main/Pages/PackageDetail.razor +++ b/src/FrontOffice.Main/Pages/PackageDetail.razor @@ -69,6 +69,48 @@ else نظرات کاربران + + @if (_isAuthenticated) + { + + + نظر خود را ثبت کنید + + + + + + + + @(_isSubmittingComment ? "در حال ارسال..." : "ارسال نظر") + + + + + } + else + { + + + + + برای ثبت نظر ابتدا + وارد حساب کاربری + شوید. + + + + } + + @if (_reviews.Any()) { @@ -111,7 +153,7 @@ else _reviews = new(); private List _relatedPackages = new(); private bool _isLoading = true; private bool _isPurchasing; + private bool _isAuthenticated; private CancellationTokenSource? _loadCts; + + // Comment form + private NewComment _newComment = new(); + private bool _isSubmittingComment; private List _breadcrumbItems = new() @@ -28,6 +35,8 @@ public partial class PackageDetail : IDisposable }; protected override async Task OnInitializedAsync() { + await CheckAuthStatus(); + if (Id < 1) { _isLoading = false; @@ -55,7 +64,6 @@ public partial class PackageDetail : IDisposable try { // Load package details - var packageRequest = new GetPackageRequest { Id = Id }; var packageResponse = await PackageClient.GetPackageAsync(request: new() { Id = Id}, cancellationToken: _loadCts.Token); if (packageResponse != null) @@ -157,6 +165,64 @@ public partial class PackageDetail : IDisposable } } + private async Task CheckAuthStatus() + { + var token = await LocalStorage.GetItemAsync("auth:token"); + _isAuthenticated = !string.IsNullOrWhiteSpace(token); + } + + private async Task SubmitComment() + { + if (!_isAuthenticated) + { + Snackbar.Add("برای ثبت نظر ابتدا وارد حساب کاربری شوید.", Severity.Warning); + return; + } + + if (string.IsNullOrWhiteSpace(_newComment.Comment)) + { + Snackbar.Add("لطفاً نظر خود را وارد کنید.", Severity.Warning); + return; + } + + if (_newComment.Rating < 1 || _newComment.Rating > 5) + { + Snackbar.Add("لطفاً امتیاز را انتخاب کنید.", Severity.Warning); + return; + } + + _isSubmittingComment = true; + + try + { + // TODO: Submit comment to API + await Task.Delay(1000); // Simulate API call + + // Add the new comment to the list + var newReview = new Review + { + UserName = "کاربر فعلی", // TODO: Get from user profile + Rating = _newComment.Rating, + Comment = _newComment.Comment, + Date = DateTime.Now.ToString("yyyy/MM/dd") + }; + + _reviews.Insert(0, newReview); + _newComment = new NewComment(); + + Snackbar.Add("نظر شما با موفقیت ثبت شد.", Severity.Success); + } + catch (Exception ex) + { + Snackbar.Add($"خطا در ثبت نظر: {ex.Message}", Severity.Error); + } + finally + { + _isSubmittingComment = false; + await InvokeAsync(StateHasChanged); + } + } + private void NavigateToPackage(string packageId) { Navigation.NavigateTo($"{RouteConstants.Package.Detail}/{packageId}"); @@ -211,4 +277,10 @@ public partial class PackageDetail : IDisposable public string? Image { get; set; } public PricingInfo Pricing { get; set; } = new(); } + + public class NewComment + { + public int Rating { get; set; } = 5; + public string? Comment { get; set; } + } } \ No newline at end of file