439 lines
24 KiB
Plaintext
439 lines
24 KiB
Plaintext
@using QRRapidoApp.Services
|
|
@using Microsoft.Extensions.Localization
|
|
@inject AdDisplayService AdService
|
|
@inject IStringLocalizer<QRRapidoApp.Resources.SharedResource> Localizer
|
|
|
|
@{
|
|
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> @Localizer["CreateQRCodeQuickly"]
|
|
</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>@Localizer["PremiumUserActive"]</strong>
|
|
<span class="badge bg-success">@Localizer["NoAdsHistoryUnlimitedQR"]</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> @Localizer["UltraFastGeneration"]
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4 text-end">
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<small class="text-muted">
|
|
<span class="qr-counter">@Localizer["UnlimitedToday"]</span>
|
|
</small>
|
|
}
|
|
else
|
|
{
|
|
<small class="text-muted">
|
|
<span class="qr-counter">@Localizer["QRCodesRemaining"]</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> @Localizer["QRCodeType"]
|
|
</label>
|
|
<select id="qr-type" class="form-select" required>
|
|
<option value="">@Localizer["SelectType"]</option>
|
|
<option value="url">🌐 @Localizer["URLLink"]</option>
|
|
<option value="text">📝 @Localizer["SimpleText"]</option>
|
|
<option value="wifi">📶 @Localizer["WiFi"]</option>
|
|
<option value="vcard">👤 @Localizer["VCard"]</option>
|
|
<option value="sms">💬 @Localizer["SMS"]</option>
|
|
<option value="email">📧 @Localizer["Email"]</option>
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<option value="dynamic">⚡ @Localizer["DynamicQRPremium"]</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label fw-semibold">
|
|
<i class="fas fa-palette"></i> @Localizer["QuickStyle"]
|
|
</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">@Localizer["Classic"]</label>
|
|
|
|
<input type="radio" class="btn-check" name="quick-style" id="style-modern" value="modern">
|
|
<label class="btn btn-outline-secondary" for="style-modern">@Localizer["Modern"]</label>
|
|
|
|
<input type="radio" class="btn-check" name="quick-style" id="style-colorful" value="colorful">
|
|
<label class="btn btn-outline-secondary" for="style-colorful">@Localizer["Colorful"]</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label class="form-label fw-semibold">
|
|
<i class="fas fa-edit"></i> @Localizer["Content"]
|
|
</label>
|
|
<textarea id="qr-content"
|
|
class="form-control form-control-lg"
|
|
rows="3"
|
|
placeholder="@Localizer["EnterQRCodeContent"]"
|
|
required></textarea>
|
|
<div class="form-text">
|
|
<span id="content-hints">@Localizer["ContentHints"]</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> @Localizer["AdvancedCustomization"]
|
|
</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">@Localizer["PrimaryColor"]</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">@Localizer["BackgroundColor"]</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">@Localizer["Size"]</label>
|
|
<select id="qr-size" class="form-select">
|
|
<option value="200">@Localizer["SmallSize200px"]</option>
|
|
<option value="300" selected>@Localizer["MediumSize300px"]</option>
|
|
<option value="500">@Localizer["LargeSize500px"]</option>
|
|
<option value="800">@Localizer["XLSize800px"]</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-3 mb-3">
|
|
<label class="form-label">@Localizer["Margin"]</label>
|
|
<select id="qr-margin" class="form-select">
|
|
<option value="1">@Localizer["Minimal"]</option>
|
|
<option value="2" selected>@Localizer["Normal"]</option>
|
|
<option value="4">@Localizer["Large"]</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
@if (User.Identity.IsAuthenticated)
|
|
{
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">@Localizer["LogoIcon"]</label>
|
|
<input type="file" id="logo-upload" class="form-control" accept="image/*">
|
|
<div class="form-text">@Localizer["PNGJPGUp2MB"]</div>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">@Localizer["BorderStyle"]</label>
|
|
<select id="corner-style" class="form-select">
|
|
<option value="square">@Localizer["Square"]</option>
|
|
<option value="rounded">@Localizer["Rounded"]</option>
|
|
<option value="circle">@Localizer["Circular"]</option>
|
|
<option value="leaf">@Localizer["Leaf"]</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> @Localizer["GenerateQRCodeQuickly"]
|
|
<div class="spinner-border spinner-border-sm ms-2 d-none" role="status">
|
|
<span class="visually-hidden">@Localizer["Generating"]</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">@Localizer["AverageTime"]</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">@Localizer["Availability"]</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">@Localizer["QRsGeneratedToday"]</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">@Localizer["YourQRCodeWillAppear"]</p>
|
|
<small class="text-muted">
|
|
<i class="fas fa-bolt"></i> @Localizer["UltraFastGenerationGuaranteed"]
|
|
</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> @Localizer["DownloadPNG"]
|
|
</button>
|
|
<button id="download-svg" class="btn btn-outline-success">
|
|
<i class="fas fa-vector-square"></i> @Localizer["DownloadSVGVector"]
|
|
</button>
|
|
<button id="download-pdf" class="btn btn-outline-success">
|
|
<i class="fas fa-file-pdf"></i> @Localizer["DownloadPDF"]
|
|
</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> @Localizer["ShareQRCode"]
|
|
</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> @Localizer["ShareSystem"]
|
|
</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> @Localizer["SaveToHistory"]
|
|
</button>
|
|
}
|
|
else
|
|
{
|
|
<div class="text-center">
|
|
<small class="text-muted">
|
|
<a href="/Account/Login" class="text-primary">@Localizer["Login"]</a>
|
|
@Localizer["ToSaveToHistory"]
|
|
</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">@Localizer["ThreeTimesFaster"]</div>
|
|
</div>
|
|
<ul class="list-unstyled">
|
|
<li><i class="fas fa-check text-success"></i> @Localizer["NoAdsForever"]</li>
|
|
<li><i class="fas fa-check text-success"></i> @Localizer["UnlimitedQRCodes"]</li>
|
|
<li><i class="fas fa-check text-success"></i> @Localizer["PriorityGeneration"]</li>
|
|
<li><i class="fas fa-check text-success"></i> @Localizer["DynamicQRCodes"]</li>
|
|
<li><i class="fas fa-check text-success"></i> @Localizer["RealTimeAnalytics"]</li>
|
|
<li><i class="fas fa-check text-success"></i> @Localizer["DeveloperAPI"]</li>
|
|
</ul>
|
|
<div class="text-center">
|
|
<a href="/Premium/Upgrade" class="btn btn-warning w-100">
|
|
<i class="fas fa-bolt"></i> @Localizer["AcceleratePrice"]
|
|
</a>
|
|
<small class="text-muted d-block mt-1">@Localizer["CancelAnytime"]</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> @Localizer["TipsFasterQR"]
|
|
</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<ul class="list-unstyled small">
|
|
<li><i class="fas fa-arrow-right text-primary"></i> @Localizer["ShortURLsFaster"]</li>
|
|
<li><i class="fas fa-arrow-right text-primary"></i> @Localizer["LessTextMoreSpeed"]</li>
|
|
<li><i class="fas fa-arrow-right text-primary"></i> @Localizer["SolidColorsOptimize"]</li>
|
|
<li><i class="fas fa-arrow-right text-primary"></i> @Localizer["SmallerSizesAccelerate"]</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> @Localizer["WhyQRRapidoFaster"]</h3>
|
|
<p class="text-muted">@Localizer["ComparisonOtherGenerators"]</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">@Localizer["OptimizedForSpeed"]</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">@Localizer["CompetitorA"]</h5>
|
|
<div class="display-4 text-muted">3.5s</div>
|
|
<p class="text-muted">@Localizer["TraditionalGenerator"]</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<h5 class="text-muted">@Localizer["CompetitorB"]</h5>
|
|
<div class="display-4 text-muted">4.8s</div>
|
|
<p class="text-muted">@Localizer["HeavyInterface"]</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card h-100">
|
|
<div class="card-body text-center">
|
|
<h5 class="text-muted">@Localizer["CompetitorC"]</h5>
|
|
<div class="display-4 text-muted">6.2s</div>
|
|
<p class="text-muted">@Localizer["ManyAds"]</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Ad Space Footer (conditional) -->
|
|
@await Html.PartialAsync("_AdSpace", new { position = "footer" }) |