Phase 8c: FO Package pages — Customer RPCs + dynamic features
- NuGet: 0.0.182 → 0.0.185 + local feed source - PackageDetail: GetPackageAsync → GetCustomerPackageDetailsAsync Features & specs now driven by API (PackageFeature) not hardcoded - Packages.razor: Un-excluded from build, dynamic feature bullets from CustomerPackageModel (DiscountMultiplier, MagicWallet, etc.) - PackageService: Enriched PackageDto with 8 new package fields GetUserPackageStatusAsync connected to real RPC (was stub)
This commit is contained in:
@@ -64,20 +64,43 @@
|
||||
<MudText Typo="Typo.h6" Color="Color.Success">@package.FormattedPrice</MudText>
|
||||
</MudStack>
|
||||
|
||||
<!-- Features Preview -->
|
||||
<!-- Package Highlights -->
|
||||
<MudStack Spacing="1" Class="mt-2">
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">عضویت در باشگاه مشتریان</MudText>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">دریافت پاداش هفتگی</MudText>
|
||||
</MudStack>
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">تیمسازی نامحدود</MudText>
|
||||
</MudStack>
|
||||
@if (package.SupportsDirectPurchase)
|
||||
{
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">پرداخت مستقیم</MudText>
|
||||
</MudStack>
|
||||
}
|
||||
@if (package.SupportsDayaPurchase)
|
||||
{
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">پرداخت با اعتبار دایا</MudText>
|
||||
</MudStack>
|
||||
}
|
||||
@if (package.DiscountMultiplier > 0)
|
||||
{
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">ضریب تخفیف: @package.DiscountMultiplier.ToString("F1")x</MudText>
|
||||
</MudStack>
|
||||
}
|
||||
@if (package.MagicWalletMultiplier > 0)
|
||||
{
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Check" Size="Size.Small" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.caption">کیف پول جادویی: @package.MagicWalletMultiplier.ToString("F1")x</MudText>
|
||||
</MudStack>
|
||||
}
|
||||
@if (package.IsBasePackage)
|
||||
{
|
||||
<MudStack Row="true" Spacing="1" AlignItems="AlignItems.Center">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Star" Size="Size.Small" Color="Color.Warning" />
|
||||
<MudText Typo="Typo.caption">پکیج پایه</MudText>
|
||||
</MudStack>
|
||||
}
|
||||
</MudStack>
|
||||
</MudStack>
|
||||
</MudCardContent>
|
||||
|
||||
@@ -64,36 +64,38 @@ public partial class PackageDetail : IDisposable
|
||||
|
||||
try
|
||||
{
|
||||
// Load package details
|
||||
var packageResponse = await PackageClient.GetPackageAsync(request: new() { Id = Id}, cancellationToken: _loadCts.Token);
|
||||
// Load package details via Customer RPC
|
||||
var response = await PackageClient.GetCustomerPackageDetailsAsync(
|
||||
new GetCustomerPackageDetailsRequest { PackageId = Id },
|
||||
cancellationToken: _loadCts.Token);
|
||||
|
||||
if (packageResponse != null)
|
||||
if (response != null)
|
||||
{
|
||||
// Build features from API response
|
||||
var features = response.Features?.Select(f => f.Title).ToList() ?? new List<string>();
|
||||
|
||||
// Build specifications from API features (highlighted ones)
|
||||
var specs = response.Features?
|
||||
.Where(f => f.IsHighlighted)
|
||||
.Select(f => new Specification
|
||||
{
|
||||
Name = f.Title,
|
||||
Value = f.Description,
|
||||
Icon = string.IsNullOrEmpty(f.Icon) ? Icons.Material.Filled.Star : f.Icon
|
||||
}).ToList() ?? new List<Specification>();
|
||||
|
||||
_package = new PackageDetailDto
|
||||
{
|
||||
Id = packageResponse.Id,
|
||||
Title = packageResponse.Title,
|
||||
Body = packageResponse.Description,
|
||||
Image = packageResponse.ImagePath ?? string.Empty,
|
||||
Specifications = new List<Specification>
|
||||
{
|
||||
new() { Name = "ظرفیت", Value = "تا ۲۰۰ عضو", Icon = Icons.Material.Filled.Group },
|
||||
new() { Name = "شجرهنامه", Value = "پیشرفته", Icon = Icons.Material.Filled.AccountTree },
|
||||
new() { Name = "گزارشگیری", Value = "جامع", Icon = Icons.Material.Filled.Analytics },
|
||||
new() { Name = "پشتیبانی", Value = "۲۴ ساعته", Icon = Icons.Material.Filled.Support }
|
||||
},
|
||||
Features = new List<string>
|
||||
{
|
||||
"مدیریت تیم نامحدود",
|
||||
"شجرهنامه بصری",
|
||||
"محاسبه کارمزد خودکار",
|
||||
"گزارشهای مالی",
|
||||
"پشتیبانی اولویتدار"
|
||||
},
|
||||
Id = response.Id,
|
||||
Title = response.Title,
|
||||
Body = response.Description,
|
||||
Image = response.ImagePath ?? string.Empty,
|
||||
Specifications = specs,
|
||||
Features = features,
|
||||
Pricing = new PricingInfo
|
||||
{
|
||||
OriginalPrice = packageResponse.Price,
|
||||
FinalPrice = packageResponse.Price,
|
||||
OriginalPrice = response.Price,
|
||||
FinalPrice = response.Price,
|
||||
HasDiscount = false,
|
||||
DiscountPercent = 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user