Vibe Google Analytics
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
@namespace Shared.Components
|
||||
@using Chrono.Model
|
||||
|
||||
@if (Card != null)
|
||||
{
|
||||
@@ -11,7 +10,7 @@
|
||||
{
|
||||
<div class="detail-image">
|
||||
<img src="@Card.ImagePath" alt="@Card.Name"
|
||||
onerror="this.style.display='none';this.parentElement.style.display='none'" />
|
||||
onerror="this.style.display='none';this.parentElement.style.display='none'"/>
|
||||
</div>
|
||||
}
|
||||
<div class="detail-info">
|
||||
@@ -61,7 +60,7 @@
|
||||
<span class="field-value">@Card.Set</span>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@if (Card.Artist != null)
|
||||
{
|
||||
<div class="detail-field">
|
||||
@@ -69,7 +68,7 @@
|
||||
<span class="field-value">@Card.Artist</span>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@if (Card.Rarity != null)
|
||||
{
|
||||
<div class="detail-field">
|
||||
@@ -105,7 +104,8 @@
|
||||
var target = LookupCard(targetName);
|
||||
if (target != null)
|
||||
{
|
||||
<button class="inline-card-btn" @onclick="() => SelectCard(target)">@targetName</button>
|
||||
<button class="inline-card-btn"
|
||||
@onclick="() => SelectCard(target)">@targetName</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -125,7 +125,8 @@
|
||||
var fromCard = LookupCard(Card.ImmortalizeFrom);
|
||||
if (fromCard != null)
|
||||
{
|
||||
<button class="inline-card-btn" @onclick="() => SelectCard(fromCard)">@Card.ImmortalizeFrom</button>
|
||||
<button class="inline-card-btn"
|
||||
@onclick="() => SelectCard(fromCard)">@Card.ImmortalizeFrom</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -148,9 +149,15 @@
|
||||
|
||||
private bool HasImage => Card?.ImageFile is { Length: > 0 } && Card.ImageFile != "placeholder.png";
|
||||
|
||||
private async Task Close() => await OnClose.InvokeAsync();
|
||||
private async Task Close()
|
||||
{
|
||||
await OnClose.InvokeAsync();
|
||||
}
|
||||
|
||||
private async Task SelectCard(CardData card) => await OnSelectCard.InvokeAsync(card);
|
||||
private async Task SelectCard(CardData card)
|
||||
{
|
||||
await OnSelectCard.InvokeAsync(card);
|
||||
}
|
||||
|
||||
private RenderFragment RenderCardDescription(string description)
|
||||
{
|
||||
@@ -163,4 +170,5 @@
|
||||
return CardDatabase.Cards.FirstOrDefault(c =>
|
||||
string.Equals(c.Name, cardName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,8 +10,12 @@
|
||||
}
|
||||
|
||||
@keyframes fade-in {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.card-detail {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
@namespace Shared.Components
|
||||
@using Chrono.Model
|
||||
|
||||
<div class="deck-card-row">
|
||||
@foreach (var group in Cards.GroupBy(x => x))
|
||||
@@ -29,10 +28,13 @@
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter, EditorRequired] public List<string> Cards { get; set; } = [];
|
||||
[Parameter][EditorRequired] public List<string> Cards { get; set; } = [];
|
||||
[Parameter] public EventCallback<CardData?> OnSelectCard { get; set; }
|
||||
|
||||
private async Task SelectCard(CardData? card) => await OnSelectCard.InvokeAsync(card);
|
||||
private async Task SelectCard(CardData? card)
|
||||
{
|
||||
await OnSelectCard.InvokeAsync(card);
|
||||
}
|
||||
|
||||
private static readonly Dictionary<string, CardData> CardLookup = CardDatabase.Cards
|
||||
.Where(c => !string.IsNullOrWhiteSpace(c.Name))
|
||||
@@ -43,4 +45,5 @@
|
||||
{
|
||||
return CardLookup.GetValueOrDefault(cardName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="mana-curve">
|
||||
@foreach (var entry in Distribution)
|
||||
{
|
||||
var height = MaxCount > 0 ? (entry.Count * 100 / MaxCount) : 0;
|
||||
var height = MaxCount > 0 ? entry.Count * 100 / MaxCount : 0;
|
||||
<div class="mana-bar-container">
|
||||
<div class="mana-bar-label">@entry.Count</div>
|
||||
<div class="mana-bar" style="height: @($"{Math.Max(height, 5)}%")"></div>
|
||||
@@ -13,7 +13,7 @@
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter, EditorRequired] public List<(int Cost, int Count)> Distribution { get; set; } = [];
|
||||
[Parameter][EditorRequired] public List<(int Cost, int Count)> Distribution { get; set; } = [];
|
||||
[Parameter] public int MaxCostLabel { get; set; } = 10;
|
||||
|
||||
private int MaxCount => Distribution.Count > 0 ? Distribution.Max(x => x.Count) : 0;
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
@implements IDisposable
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject AnalyticsService AnalyticsService
|
||||
|
||||
@code {
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
NavigationManager.LocationChanged += OnLocationChanged;
|
||||
}
|
||||
|
||||
private async void OnLocationChanged(object? sender, LocationChangedEventArgs e)
|
||||
{
|
||||
await TrackPageView(e.Location);
|
||||
}
|
||||
|
||||
private async Task TrackPageView(string url)
|
||||
{
|
||||
try
|
||||
{
|
||||
var relativePath = NavigationManager.ToBaseRelativePath(url);
|
||||
if (!relativePath.StartsWith("/"))
|
||||
{
|
||||
relativePath = "/" + relativePath;
|
||||
}
|
||||
|
||||
await AnalyticsService.TrackPageView(relativePath);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Ignore errors during tracking
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
NavigationManager.LocationChanged -= OnLocationChanged;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user