Сайт: донат-карточку заменил на апселл подписки; убрал внешний QR и ссылку «Поддержать»
Донат на платном сервисе размывал модель. На больших файлах теперь показывается апселл подписки (не подписчикам), кнопка ведёт в оплату подписки (showPaywall upsell). QR грузился с api.qrserver.com (недоступен из РФ → пустой) — удалён. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1168,36 +1168,16 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Donate -->
|
||||
<!-- Апселл подписки (показывается на больших файлах) -->
|
||||
<div id="donate-card">
|
||||
<div class="donate-inner">
|
||||
<div class="donate-text">
|
||||
<div class="donate-icon">🍩</div>
|
||||
<div class="donate-title" data-i18n="donate_title">Поддержите проект</div>
|
||||
<div class="donate-desc" data-i18n="donate_desc">Если сервис полезен — поддержите его работу донатом. Это помогает оплачивать сервер и развивать проект.</div>
|
||||
<div class="donate-buttons">
|
||||
<a class="donate-btn donate-btn-sbp" href="https://finance.ozon.ru/apps/sbp/ozonbankpay/019cbe28-6b54-7eb8-8a52-189633e608ea" target="_blank" rel="noopener" data-i18n="donate_sbp">СБП / Ozon Pay</a>
|
||||
<div class="donate-icon">💎</div>
|
||||
<div class="donate-title" data-i18n="upsell_title">Часто обрабатываете большие файлы?</div>
|
||||
<div class="donate-desc" data-i18n="upsell_desc">Подписка снимает лимит 50 МБ и 100 страниц, открывает пакетную обработку нескольких файлов и приоритет в очереди.</div>
|
||||
<div class="donate-buttons" style="margin-top:12px">
|
||||
<button type="button" class="donate-btn" onclick="openSubUpsell()" data-i18n="upsell_btn">Оформить подписку</button>
|
||||
</div>
|
||||
<!-- Оплата картой через ЮKassa -->
|
||||
<div class="donate-pay" style="margin-top:14px">
|
||||
<div style="display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:8px">
|
||||
<button type="button" class="pay-amt" onclick="setPayAmt(100,this)">100 ₽</button>
|
||||
<button type="button" class="pay-amt active" onclick="setPayAmt(300,this)">300 ₽</button>
|
||||
<button type="button" class="pay-amt" onclick="setPayAmt(500,this)">500 ₽</button>
|
||||
<input type="number" id="pay-amt-custom" min="10" max="100000" placeholder="₽" oninput="onCustomAmt()"
|
||||
style="width:76px;padding:7px 8px;border:1px solid var(--border,#d0d7e2);border-radius:8px;font-family:inherit;font-size:14px">
|
||||
</div>
|
||||
<input type="email" id="pay-email" data-i18n-ph="pay_email_ph" placeholder="email для чека"
|
||||
style="width:100%;max-width:260px;padding:8px 10px;border:1px solid var(--border,#d0d7e2);border-radius:8px;font-family:inherit;font-size:14px;margin-bottom:8px">
|
||||
<div>
|
||||
<button type="button" id="pay-card-btn" onclick="payDonate()" class="donate-btn" data-i18n="pay_card_btn">💳 Оплатить картой</button>
|
||||
</div>
|
||||
<div id="pay-msg" style="font-size:12px;color:var(--text-secondary);margin-top:6px"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="donate-qr">
|
||||
<img src="https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=https%3A%2F%2Ffinance.ozon.ru%2Fapps%2Fsbp%2Fozonbankpay%2F019cbe28-6b54-7eb8-8a52-189633e608ea" alt="QR donate" loading="lazy">
|
||||
<div class="donate-qr-hint" data-i18n="donate_qr_hint">Сканируйте для оплаты</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1237,7 +1217,7 @@
|
||||
<!--SEO_FAQ-->
|
||||
|
||||
<footer>
|
||||
pdf2scan — <span data-i18n="footer_text">превращаем PDF в скан</span> | <a href="https://t.me/pdf2scan_pybot" onclick="return openBot(event)" style="color:var(--blue); text-decoration:none;" data-i18n="footer_tg">Telegram-бот</a> | <a href="/developers" style="color:var(--blue); text-decoration:none;" data-i18n="footer_api">API для бизнеса</a> | <a href="#" onclick="showDonateCard(false);document.getElementById('donate-card').scrollIntoView({behavior:'smooth'});return false;" style="color:var(--blue); text-decoration:none;" data-i18n="footer_donate">🍩 Поддержать</a> | <a href="/offer" style="color:var(--blue); text-decoration:none;" data-i18n="footer_offer">Оферта</a>
|
||||
pdf2scan — <span data-i18n="footer_text">превращаем PDF в скан</span> | <a href="https://t.me/pdf2scan_pybot" onclick="return openBot(event)" style="color:var(--blue); text-decoration:none;" data-i18n="footer_tg">Telegram-бот</a> | <a href="/developers" style="color:var(--blue); text-decoration:none;" data-i18n="footer_api">API для бизнеса</a> | <a href="/offer" style="color:var(--blue); text-decoration:none;" data-i18n="footer_offer">Оферта</a>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
@@ -1358,6 +1338,11 @@
|
||||
donate_desc_heavy: '⚠️ Большие файлы сильно нагружают сервер. Если сервис полезен — поддержите проект донатом.',
|
||||
donate_sbp: 'СБП / Ozon Pay',
|
||||
donate_qr_hint: 'Сканируйте для оплаты',
|
||||
upsell_title: 'Часто обрабатываете большие файлы?',
|
||||
upsell_desc: 'Подписка снимает лимит 50 МБ и 100 страниц, открывает пакетную обработку нескольких файлов и приоритет в очереди.',
|
||||
upsell_btn: 'Оформить подписку',
|
||||
paywall_upsell_title: 'Оформить подписку pdf2scan',
|
||||
paywall_upsell_desc: 'Большие файлы без доплаты, пакетная обработка и приоритет в очереди. Отменить можно в любой момент.',
|
||||
pay_card_btn: '💳 Оплатить картой',
|
||||
pay_email_ph: 'email для чека',
|
||||
pay_need_email: 'Укажите корректный email для чека',
|
||||
@@ -1507,6 +1492,11 @@
|
||||
donate_sbp: 'SBP / Ozon Pay',
|
||||
donate_yoo: 'YooMoney',
|
||||
donate_qr_hint: 'Scan to pay',
|
||||
upsell_title: 'Processing large files often?',
|
||||
upsell_desc: 'A subscription removes the 50 MB / 100-page limit, unlocks batch processing and priority in the queue.',
|
||||
upsell_btn: 'Get a subscription',
|
||||
paywall_upsell_title: 'Subscribe to pdf2scan',
|
||||
paywall_upsell_desc: 'Large files with no per-file fee, batch processing and priority queue. Cancel anytime.',
|
||||
pay_card_btn: '💳 Pay by card',
|
||||
pay_email_ph: 'email for receipt',
|
||||
pay_need_email: 'Enter a valid email for the receipt',
|
||||
@@ -2339,12 +2329,6 @@
|
||||
const flagEl = document.getElementById('lang-flag-img');
|
||||
flagEl.src = LANGS[currentLang].img;
|
||||
flagEl.alt = LANGS[currentLang].alt;
|
||||
// Re-render donate desc if visible
|
||||
const donateCard = document.getElementById('donate-card');
|
||||
if (donateCard && donateCard.style.display !== 'none') {
|
||||
const isHeavy = filePages > DONATE_PAGE_THRESHOLD || fileSizeMb > 10;
|
||||
donateCard.querySelector('.donate-desc').textContent = t(isHeavy ? 'donate_desc_heavy' : 'donate_desc');
|
||||
}
|
||||
// Highlight active language in dropdown
|
||||
document.querySelectorAll('.lang-option').forEach(btn => {
|
||||
const lang = btn.getAttribute('onclick').match(/setLang\('(\w+)'\)/)[1];
|
||||
@@ -2378,17 +2362,20 @@
|
||||
// ── Donate ────────────────────────────────────────────────────────────────
|
||||
const DONATE_PAGE_THRESHOLD = 20;
|
||||
|
||||
function showDonateCard(heavy) {
|
||||
const card = document.getElementById('donate-card');
|
||||
const desc = card.querySelector('.donate-desc');
|
||||
desc.textContent = t(heavy ? 'donate_desc_heavy' : 'donate_desc');
|
||||
card.style.display = 'block';
|
||||
function showDonateCard() {
|
||||
// апселл подписки; действующим подписчикам не показываем
|
||||
if (subUntilTs && subUntilTs > (Date.now() / 1000)) return;
|
||||
document.getElementById('donate-card').style.display = 'block';
|
||||
}
|
||||
|
||||
function hideDonateCard() {
|
||||
document.getElementById('donate-card').style.display = 'none';
|
||||
}
|
||||
|
||||
function openSubUpsell() {
|
||||
showPaywall(null, paywallFilePrice, paywallSubPrice, 'upsell');
|
||||
}
|
||||
|
||||
// ── Оплата картой (ЮKassa) ────────────────────────────────────────────────
|
||||
let payAmount = 300;
|
||||
function setPayAmt(v, el) {
|
||||
@@ -2438,20 +2425,20 @@
|
||||
}
|
||||
|
||||
function showPaywall(jobId, filePrice, subPrice, mode) {
|
||||
// «Продлить» подписку — не пейвол, в воронке не считаем
|
||||
if ((mode || 'file') !== 'renew') track('paywall_shown');
|
||||
// «Продлить» и апселл подписки — не пейвол, в воронке не считаем
|
||||
if ((mode || 'file') !== 'renew' && mode !== 'upsell') track('paywall_shown');
|
||||
paywallMode = mode || 'file';
|
||||
paywallJob = jobId;
|
||||
paywallFilePrice = filePrice || 99;
|
||||
paywallSubPrice = subPrice || 299;
|
||||
const subOnly = (paywallMode === 'batch' || paywallMode === 'renew');
|
||||
const subOnly = (paywallMode === 'batch' || paywallMode === 'renew' || paywallMode === 'upsell');
|
||||
document.getElementById('paywall-file-price').textContent = paywallFilePrice;
|
||||
document.getElementById('paywall-sub-price').textContent = paywallSubPrice;
|
||||
document.getElementById('paywall-file-btn').style.display = subOnly ? 'none' : '';
|
||||
const titleEl = document.querySelector('#paywall-card [data-i18n="paywall_title"]');
|
||||
const descEl = document.querySelector('#paywall-card [data-i18n="paywall_desc"]');
|
||||
const tKey = paywallMode === 'renew' ? 'paywall_renew_title' : (paywallMode === 'batch' ? 'paywall_batch_title' : 'paywall_title');
|
||||
const dKey = paywallMode === 'renew' ? 'paywall_renew_desc' : (paywallMode === 'batch' ? 'paywall_batch_desc' : 'paywall_desc');
|
||||
const tKey = paywallMode === 'renew' ? 'paywall_renew_title' : paywallMode === 'upsell' ? 'paywall_upsell_title' : (paywallMode === 'batch' ? 'paywall_batch_title' : 'paywall_title');
|
||||
const dKey = paywallMode === 'renew' ? 'paywall_renew_desc' : paywallMode === 'upsell' ? 'paywall_upsell_desc' : (paywallMode === 'batch' ? 'paywall_batch_desc' : 'paywall_desc');
|
||||
if (titleEl) titleEl.textContent = t(tKey);
|
||||
if (descEl) descEl.textContent = t(dKey);
|
||||
const emailEl = document.getElementById('paywall-email');
|
||||
|
||||
Reference in New Issue
Block a user