QrRapido/Views/Account/Profile.cshtml
Ricardo Carneiro 16a9720a12
All checks were successful
Deploy QR Rapido / test (push) Successful in 59s
Deploy QR Rapido / build-and-push (push) Successful in 9m57s
Deploy QR Rapido / deploy-staging (push) Has been skipped
Deploy QR Rapido / deploy-production (push) Successful in 2m11s
feat: qrcode por creditos.
2026-01-26 20:13:45 -03:00

162 lines
8.2 KiB
Plaintext

@model QRRapidoApp.Models.User
@inject Microsoft.Extensions.Localization.IStringLocalizer<QRRapidoApp.Resources.SharedResource> Localizer
@{
ViewData["Title"] = Localizer["UserProfileTitle"];
var monthlyQRCount = ViewBag.MonthlyQRCount as int? ?? 0;
var qrHistory = ViewBag.QRHistory as List<QRRapidoApp.Models.QRCodeHistory> ?? new List<QRRapidoApp.Models.QRCodeHistory>();
Layout = "~/Views/Shared/_Layout.cshtml";
// Cálculos de Cota Gratuita
var freeUsed = Model.FreeQRsUsed;
var freeLimit = 5;
var freePercent = (double)freeUsed / freeLimit * 100;
var freeRemaining = Math.Max(0, freeLimit - freeUsed);
}
<div class="container mt-4">
<div class="row">
<div class="col-lg-4">
<!-- Header do Perfil -->
<div class="card mb-4 border-0 shadow-sm text-center">
<div class="card-body py-5">
<div class="mb-3">
<i class="fas fa-user-circle fa-5x text-secondary"></i>
</div>
<h4 class="mb-1">@Model.Name</h4>
<p class="text-muted mb-3">@Model.Email</p>
<p class="small text-muted">Membro desde @Model.CreatedAt.ToString("MMM yyyy")</p>
<form method="post" action="/Account/Logout" class="d-inline">
<button type="submit" class="btn btn-outline-danger btn-sm">
<i class="fas fa-sign-out-alt me-1"></i>Sair
</button>
</form>
</div>
</div>
<!-- Estatísticas Rápidas -->
<div class="card mb-4 border-0 shadow-sm">
<div class="card-header bg-white fw-bold">
<i class="fas fa-chart-pie me-2 text-primary"></i> Resumo
</div>
<div class="list-group list-group-flush">
<div class="list-group-item d-flex justify-content-between align-items-center">
<span>Total Gerado</span>
<span class="badge bg-primary rounded-pill">@Model.TotalQRGenerated</span>
</div>
<div class="list-group-item d-flex justify-content-between align-items-center">
<span>Este Mês</span>
<span class="badge bg-info rounded-pill">@monthlyQRCount</span>
</div>
</div>
</div>
</div>
<div class="col-lg-8">
<!-- CARTEIRA E SALDO -->
<div class="card mb-4 border-0 shadow-sm">
<div class="card-header bg-success text-white d-flex align-items-center justify-content-between">
<h5 class="mb-0"><i class="fas fa-wallet me-2"></i>Minha Carteira</h5>
</div>
<div class="card-body p-4">
<div class="row align-items-center">
<div class="col-md-6 text-center text-md-start mb-3 mb-md-0">
<small class="text-muted text-uppercase fw-bold">Saldo Disponível</small>
<div class="display-4 fw-bold text-success">
@Model.Credits <span class="fs-4 text-muted">Créditos</span>
</div>
<p class="mb-0 text-muted small">
<i class="fas fa-check-circle text-success"></i> Válidos por 5 anos
</p>
</div>
<div class="col-md-6 text-center text-md-end">
<a href="/Pagamento/SelecaoPlano" class="btn btn-warning btn-lg shadow-sm fw-bold">
<i class="fas fa-plus-circle me-2"></i> Recarregar Agora
</a>
</div>
</div>
<hr class="my-4">
<!-- Cota Gratuita -->
<div class="row align-items-center">
<div class="col-12">
<div class="d-flex justify-content-between align-items-end mb-1">
<span class="fw-bold text-secondary">
<i class="fas fa-gift me-1 text-warning"></i> Cota Gratuita Vitalícia
</span>
<span class="small text-muted">
@freeUsed de @freeLimit usados (@freeRemaining restantes)
</span>
</div>
<div class="progress" style="height: 10px;">
<div class="progress-bar @(freeRemaining == 0 ? "bg-secondary" : "bg-warning")"
role="progressbar"
style="width: @freePercent%">
</div>
</div>
@if (freeRemaining == 0)
{
<small class="text-danger mt-1 d-block">
<i class="fas fa-exclamation-circle"></i> Cota esgotada. Use seus créditos para gerar mais.
</small>
}
</div>
</div>
</div>
</div>
<!-- Histórico Recente -->
<div class="card border-0 shadow-sm">
<div class="card-header bg-white d-flex justify-content-between align-items-center py-3">
<h5 class="mb-0 text-primary">
<i class="fas fa-history me-2"></i>Últimos QR Codes
</h5>
<a href="/Account/History" class="btn btn-outline-primary btn-sm">
Ver Todos
</a>
</div>
<div class="card-body p-0">
@if (qrHistory.Any())
{
<div class="list-group list-group-flush">
@foreach (var qr in qrHistory.Take(5))
{
<div class="list-group-item px-4 py-3">
<div class="d-flex align-items-center">
<div class="flex-shrink-0 bg-light rounded p-2 me-3">
<i class="fas fa-qrcode fa-2x text-secondary"></i>
</div>
<div class="flex-grow-1">
<h6 class="mb-1 fw-bold text-uppercase text-primary">@qr.Type</h6>
<p class="mb-0 text-muted small text-truncate" style="max-width: 300px;">
@qr.Content
</p>
<small class="text-muted">
<i class="far fa-clock me-1"></i> @qr.CreatedAt.ToLocalTime().ToString("dd/MM/yyyy HH:mm")
</small>
</div>
<div>
<a href="/api/QR/Download/@qr.Id" class="btn btn-sm btn-outline-secondary" title="Baixar PNG">
<i class="fas fa-download"></i>
</a>
</div>
</div>
</div>
}
</div>
}
else
{
<div class="text-center py-5">
<i class="fas fa-ghost fa-3x text-muted mb-3 opacity-25"></i>
<p class="text-muted">Nenhum QR Code gerado ainda.</p>
<a href="/" class="btn btn-primary btn-sm">Criar o Primeiro</a>
</div>
}
</div>
</div>
</div>
</div>
</div>