435 lines
24 KiB
Plaintext
435 lines
24 KiB
Plaintext
@using QRRapidoApp.Services
|
|
@inject AdDisplayService AdService
|
|
@{
|
|
ViewData["Title"] = "Home";
|
|
var userId = User?.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
|
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
|
}
|
|
|
|
<div class="container">
|
|
<div class="row">
|
|
<!-- QR Generator Form -->
|
|
<div class="col-lg-8">
|
|
<div class="card shadow-sm">
|
|
<div class="card-header bg-primary text-white">
|
|
<h3 class="h5 mb-0">
|
|
<i class="fas fa-qrcode"></i> Criar QR Code Rapidamente
|
|
</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
var isPremium = await AdService.HasValidPremiumSubscription(userId);
|
|
@if (isPremium)
|
|
{
|
|
<div class="alert alert-success border-0">
|
|
<i class="fas fa-crown text-warning"></i>
|
|
<strong>Usuário Premium ativo!</strong>
|
|
<span class="badge bg-success">Sem anúncios + Histórico + QR ilimitados</span>
|
|
</div>
|
|
}
|
|
}
|
|
|
|
<form id="qr-speed-form" class="needs-validation" novalidate>
|
|
<!-- Generation timer -->
|
|
<div class="row mb-3">
|
|
<div class="col-md-8">
|
|
<div class="d-flex align-items-center gap-3">
|
|
<div class="generation-timer d-none">
|
|
<i class="fas fa-stopwatch text-primary"></i>
|
|
<span class="fw-bold text-primary">0.0s</span>
|
|
</div>
|
|
<div class="speed-badge d-none">
|
|
<span class="badge bg-success">
|
|
<i class="fas fa-bolt"></i> Geração ultra rápida!
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4 text-end">
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<small class="text-muted">
|
|
<span class="qr-counter">Ilimitado hoje</span>
|
|
</small>
|
|
}
|
|
else
|
|
{
|
|
<small class="text-muted">
|
|
<span class="qr-counter">10 QR codes restantes</span>
|
|
</small>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label fw-semibold">
|
|
<i class="fas fa-list"></i> Tipo de QR Code
|
|
</label>
|
|
<select id="qr-type" class="form-select" required>
|
|
<option value="">Selecione o tipo...</option>
|
|
<option value="url">🌐 URL/Link</option>
|
|
<option value="text">📝 Texto Simples</option>
|
|
<option value="wifi">📶 WiFi</option>
|
|
<option value="vcard">👤 Cartão de Visita</option>
|
|
<option value="sms">💬 SMS</option>
|
|
<option value="email">📧 Email</option>
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<option value="dynamic">⚡ QR Dinâmico (Premium)</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label fw-semibold">
|
|
<i class="fas fa-palette"></i> Estilo Rápido
|
|
</label>
|
|
<div class="btn-group w-100" role="group">
|
|
<input type="radio" class="btn-check" name="quick-style" id="style-classic" value="classic" checked>
|
|
<label class="btn btn-outline-secondary" for="style-classic">Clássico</label>
|
|
|
|
<input type="radio" class="btn-check" name="quick-style" id="style-modern" value="modern">
|
|
<label class="btn btn-outline-secondary" for="style-modern">Moderno</label>
|
|
|
|
<input type="radio" class="btn-check" name="quick-style" id="style-colorful" value="colorful">
|
|
<label class="btn btn-outline-secondary" for="style-colorful">Colorido</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label class="form-label fw-semibold">
|
|
<i class="fas fa-edit"></i> Conteúdo
|
|
</label>
|
|
<textarea id="qr-content"
|
|
class="form-control form-control-lg"
|
|
rows="3"
|
|
placeholder="Digite o conteúdo do seu QR code aqui..."
|
|
required></textarea>
|
|
<div class="form-text">
|
|
<span id="content-hints">Dicas aparecerão aqui baseadas no tipo selecionado</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Advanced customization (collapsible) -->
|
|
<div class="accordion mb-3" id="customization-accordion">
|
|
<div class="accordion-item">
|
|
<h2 class="accordion-header">
|
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#customization-panel">
|
|
<i class="fas fa-sliders-h me-2"></i> Personalização Avançada
|
|
</button>
|
|
</h2>
|
|
<div id="customization-panel" class="accordion-collapse collapse">
|
|
<div class="accordion-body">
|
|
<div class="row">
|
|
<div class="col-md-3 mb-3">
|
|
<label class="form-label">Cor Principal</label>
|
|
<input type="color" id="primary-color" class="form-control form-control-color" value="#007BFF">
|
|
</div>
|
|
<div class="col-md-3 mb-3">
|
|
<label class="form-label">Cor de Fundo</label>
|
|
<input type="color" id="bg-color" class="form-control form-control-color" value="#FFFFFF">
|
|
</div>
|
|
<div class="col-md-3 mb-3">
|
|
<label class="form-label">Tamanho</label>
|
|
<select id="qr-size" class="form-select">
|
|
<option value="200">Pequeno (200px)</option>
|
|
<option value="300" selected>Médio (300px)</option>
|
|
<option value="500">Grande (500px)</option>
|
|
<option value="800">XL (800px)</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-3 mb-3">
|
|
<label class="form-label">Margem</label>
|
|
<select id="qr-margin" class="form-select">
|
|
<option value="1">Mínima</option>
|
|
<option value="2" selected>Normal</option>
|
|
<option value="4">Grande</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">Logo/Ícone</label>
|
|
<input type="file" id="logo-upload" class="form-control" accept="image/*">
|
|
<div class="form-text">PNG, JPG até 2MB</div>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">Estilo das Bordas</label>
|
|
<select id="corner-style" class="form-select">
|
|
<option value="square">Quadrado</option>
|
|
<option value="rounded">Arredondado</option>
|
|
<option value="circle">Circular</option>
|
|
<option value="leaf">Folha</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="d-grid">
|
|
<button type="submit" class="btn btn-primary btn-lg" id="generate-btn">
|
|
<i class="fas fa-bolt"></i> Gerar QR Code Rapidamente
|
|
<div class="spinner-border spinner-border-sm ms-2 d-none" role="status">
|
|
<span class="visually-hidden">Gerando...</span>
|
|
</div>
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Speed statistics -->
|
|
<div class="row mt-4">
|
|
<div class="col-md-4">
|
|
<div class="card text-center border-success">
|
|
<div class="card-body">
|
|
<h5 class="text-success">
|
|
<i class="fas fa-stopwatch"></i> 1.2s
|
|
</h5>
|
|
<small class="text-muted">Tempo médio</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="card text-center border-primary">
|
|
<div class="card-body">
|
|
<h5 class="text-primary">
|
|
<i class="fas fa-chart-line"></i> 99.9%
|
|
</h5>
|
|
<small class="text-muted">Disponibilidade</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="card text-center border-warning">
|
|
<div class="card-body">
|
|
<h5 class="text-warning">
|
|
<i class="fas fa-users"></i> <span id="total-qrs">10.5K</span>
|
|
</h5>
|
|
<small class="text-muted">QRs gerados hoje</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Ad Space Between Content (conditional) -->
|
|
@await Html.PartialAsync("_AdSpace", new { position = "content" })
|
|
</div>
|
|
|
|
<!-- Sidebar with preview and ads -->
|
|
<div class="col-lg-4">
|
|
<!-- Preview with timer -->
|
|
<div class="card shadow-sm mb-4">
|
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
<h5 class="mb-0">
|
|
<i class="fas fa-eye"></i> Preview
|
|
</h5>
|
|
<div class="generation-stats d-none">
|
|
<small class="text-success">
|
|
<i class="fas fa-check-circle"></i> Gerado em <span class="generation-time">0s</span>
|
|
</small>
|
|
</div>
|
|
</div>
|
|
<div class="card-body text-center">
|
|
<div id="qr-preview" class="mb-3">
|
|
<div class="placeholder-qr p-5">
|
|
<i class="fas fa-qrcode fa-4x text-muted mb-3"></i>
|
|
<p class="text-muted">Seu QR code aparecerá aqui em segundos</p>
|
|
<small class="text-muted">
|
|
<i class="fas fa-bolt"></i> Geração ultra-rápida garantida
|
|
</small>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="download-section" style="display: none;">
|
|
<div class="btn-group-vertical w-100 mb-3">
|
|
<button id="download-png" class="btn btn-success">
|
|
<i class="fas fa-download"></i> Download PNG
|
|
</button>
|
|
<button id="download-svg" class="btn btn-outline-success">
|
|
<i class="fas fa-vector-square"></i> Download SVG (Vetorial)
|
|
</button>
|
|
<button id="download-pdf" class="btn btn-outline-success">
|
|
<i class="fas fa-file-pdf"></i> Download PDF
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Share Button with Dropdown -->
|
|
<div class="dropdown w-100 mb-3">
|
|
<button class="btn btn-primary dropdown-toggle w-100" type="button" id="share-qr-btn" data-bs-toggle="dropdown" aria-expanded="false">
|
|
<i class="fas fa-share-alt"></i> Compartilhar QR Code
|
|
</button>
|
|
<ul class="dropdown-menu w-100" aria-labelledby="share-qr-btn" id="share-dropdown">
|
|
<!-- Native share option (mobile only) -->
|
|
<li class="d-none" id="native-share-option">
|
|
<a class="dropdown-item" href="#" id="native-share">
|
|
<i class="fas fa-mobile-alt text-primary"></i> Compartilhar (Sistema)
|
|
</a>
|
|
</li>
|
|
<!-- WhatsApp -->
|
|
<li>
|
|
<a class="dropdown-item" href="#" id="share-whatsapp">
|
|
<i class="fab fa-whatsapp text-success"></i> WhatsApp
|
|
</a>
|
|
</li>
|
|
<!-- Telegram -->
|
|
<li>
|
|
<a class="dropdown-item" href="#" id="share-telegram">
|
|
<i class="fab fa-telegram text-info"></i> Telegram
|
|
</a>
|
|
</li>
|
|
<!-- Email -->
|
|
<li>
|
|
<a class="dropdown-item" href="#" id="share-email">
|
|
<i class="fas fa-envelope text-warning"></i> Email
|
|
</a>
|
|
</li>
|
|
<!-- Copy to clipboard -->
|
|
<li>
|
|
<a class="dropdown-item" href="#" id="copy-qr-link">
|
|
<i class="fas fa-copy text-secondary"></i> Copiar Link
|
|
</a>
|
|
</li>
|
|
<!-- Save to gallery (mobile only) -->
|
|
<li class="d-none" id="save-gallery-option">
|
|
<a class="dropdown-item" href="#" id="save-to-gallery">
|
|
<i class="fas fa-images text-purple"></i> Salvar na Galeria
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<button id="save-to-history" class="btn btn-outline-primary w-100">
|
|
<i class="fas fa-save"></i> Salvar no Histórico
|
|
</button>
|
|
}
|
|
else
|
|
{
|
|
<div class="text-center">
|
|
<small class="text-muted">
|
|
<a href="/Account/Login" class="text-primary">Faça login</a>
|
|
para salvar no histórico
|
|
</small>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Premium Card for non-premium users -->
|
|
@if (User.Identity.IsAuthenticated && await AdService.ShouldShowAds(userId))
|
|
{
|
|
<div class="card border-warning mb-4">
|
|
<div class="card-header bg-warning text-dark">
|
|
<h6 class="mb-0">
|
|
<i class="fas fa-rocket"></i> QR Rapido Premium
|
|
</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="text-center mb-3">
|
|
<div class="badge bg-success mb-2">⚡ 3x Mais Rápido</div>
|
|
</div>
|
|
<ul class="list-unstyled">
|
|
<li><i class="fas fa-check text-success"></i> Sem anúncios para sempre</li>
|
|
<li><i class="fas fa-check text-success"></i> QR codes ilimitados</li>
|
|
<li><i class="fas fa-check text-success"></i> Geração prioritária (0.4s)</li>
|
|
<li><i class="fas fa-check text-success"></i> QR codes dinâmicos</li>
|
|
<li><i class="fas fa-check text-success"></i> Analytics em tempo real</li>
|
|
<li><i class="fas fa-check text-success"></i> API para desenvolvedores</li>
|
|
</ul>
|
|
<div class="text-center">
|
|
<a href="/Premium/Upgrade" class="btn btn-warning w-100">
|
|
<i class="fas fa-bolt"></i> Acelerar por R$ 19,90/mês
|
|
</a>
|
|
<small class="text-muted d-block mt-1">Cancele quando quiser</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
<!-- Speed Tips Card -->
|
|
<div class="card bg-light mb-4">
|
|
<div class="card-header">
|
|
<h6 class="mb-0">
|
|
<i class="fas fa-lightbulb text-warning"></i> Dicas para QR Mais Rápidos
|
|
</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<ul class="list-unstyled small">
|
|
<li><i class="fas fa-arrow-right text-primary"></i> URLs curtas geram mais rápido</li>
|
|
<li><i class="fas fa-arrow-right text-primary"></i> Menos texto = maior velocidade</li>
|
|
<li><i class="fas fa-arrow-right text-primary"></i> Cores sólidas otimizam o processo</li>
|
|
<li><i class="fas fa-arrow-right text-primary"></i> Tamanhos menores aceleram o download</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Ad Space Sidebar (conditional) -->
|
|
@await Html.PartialAsync("_AdSpace", new { position = "sidebar" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Speed Comparison Section -->
|
|
<section class="mt-5 mb-4">
|
|
<div class="container">
|
|
<div class="text-center mb-4">
|
|
<h3><i class="fas fa-tachometer-alt text-primary"></i> Por que QR Rapido é mais rápido?</h3>
|
|
<p class="text-muted">Comparação com outros geradores populares</p>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-3">
|
|
<div class="card h-100 border-success">
|
|
<div class="card-body text-center">
|
|
<h5 class="text-success">QR Rapido</h5>
|
|
<div class="display-4 text-success fw-bold">1.2s</div>
|
|
<p class="text-muted">Otimizado para velocidade</p>
|
|
<i class="fas fa-crown text-warning"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<h5 class="text-muted">Concorrente A</h5>
|
|
<div class="display-4 text-muted">3.5s</div>
|
|
<p class="text-muted">Gerador tradicional</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<h5 class="text-muted">Concorrente B</h5>
|
|
<div class="display-4 text-muted">4.8s</div>
|
|
<p class="text-muted">Interface pesada</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<h5 class="text-muted">Concorrente C</h5>
|
|
<div class="display-4 text-muted">6.2s</div>
|
|
<p class="text-muted">Muitos anúncios</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Ad Space Footer (conditional) -->
|
|
@await Html.PartialAsync("_AdSpace", new { position = "footer" }) |