feat: Tor hidden service, PDF paid details, subaddress placeholder
- Tor onion: mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion - Onion link in footer and README - PDF "BEZAHLT" block shows TX hash + date in second line - Address placeholder 8... (encourages subaddress usage)
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> Private. Self-hosted. No accounts. No backend. No bullshit.
|
> Private. Self-hosted. No accounts. No backend. No bullshit.
|
||||||
|
|
||||||
**[Live Demo: xmrpay.link](https://xmrpay.link)**
|
**[Live: xmrpay.link](https://xmrpay.link)** · **[Tor: mc6wfe...zyd.onion](http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion)**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
25
app.js
25
app.js
@@ -620,21 +620,28 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --- Payment Status ---
|
// --- Payment Status ---
|
||||||
if (paymentStatus.classList.contains('paid')) {
|
if (lastPaidData) {
|
||||||
y += 4;
|
y += 4;
|
||||||
|
var paidDateStr = '';
|
||||||
|
if (lastPaidData.verified_at) {
|
||||||
|
var pd = new Date(lastPaidData.verified_at * 1000);
|
||||||
|
paidDateStr = pd.toLocaleDateString(I18n.getLang() === 'de' ? 'de-CH' : 'en-US', {
|
||||||
|
year: 'numeric', month: 'long', day: 'numeric'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var paidLine = lastPaidData.amount.toFixed(6) + ' XMR — TX ' +
|
||||||
|
lastPaidData.tx_hash.substring(0, 8) + '...' +
|
||||||
|
(paidDateStr ? ' — ' + paidDateStr : '');
|
||||||
|
|
||||||
doc.setFillColor(76, 175, 80);
|
doc.setFillColor(76, 175, 80);
|
||||||
doc.roundedRect(margin, y - 4, contentW, 16, 2, 2, 'F');
|
doc.roundedRect(margin, y - 4, contentW, 16, 2, 2, 'F');
|
||||||
doc.setFont('helvetica', 'bold');
|
doc.setFont('helvetica', 'bold');
|
||||||
doc.setFontSize(12);
|
doc.setFontSize(12);
|
||||||
doc.setTextColor(255, 255, 255);
|
doc.setTextColor(255, 255, 255);
|
||||||
doc.text(I18n.t('status_paid').toUpperCase(), margin + contentW / 2, y + 2, { align: 'center' });
|
doc.text(I18n.t('status_paid').toUpperCase(), margin + contentW / 2, y + 1, { align: 'center' });
|
||||||
// Extract details from the paid-detail div
|
doc.setFont('helvetica', 'normal');
|
||||||
var paidDetail = paymentStatus.querySelector('.paid-detail');
|
doc.setFontSize(7.5);
|
||||||
if (paidDetail) {
|
doc.text(paidLine, margin + contentW / 2, y + 7, { align: 'center' });
|
||||||
doc.setFont('helvetica', 'normal');
|
|
||||||
doc.setFontSize(8);
|
|
||||||
doc.text(paidDetail.textContent, margin + contentW / 2, y + 8, { align: 'center' });
|
|
||||||
}
|
|
||||||
y += 22;
|
y += 22;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
app.min.js
vendored
2
app.min.js
vendored
File diff suppressed because one or more lines are too long
8
i18n.js
8
i18n.js
@@ -10,7 +10,7 @@ var I18n = (function () {
|
|||||||
de: {
|
de: {
|
||||||
subtitle: 'Monero-Zahlungsanforderung in Sekunden',
|
subtitle: 'Monero-Zahlungsanforderung in Sekunden',
|
||||||
label_addr: 'XMR-Adresse',
|
label_addr: 'XMR-Adresse',
|
||||||
placeholder_addr: '4...',
|
placeholder_addr: '8...',
|
||||||
label_amount: 'Betrag',
|
label_amount: 'Betrag',
|
||||||
label_desc: 'Beschreibung (optional)',
|
label_desc: 'Beschreibung (optional)',
|
||||||
placeholder_desc: 'z.B. Rechnung #42, Freelance-Arbeit...',
|
placeholder_desc: 'z.B. Rechnung #42, Freelance-Arbeit...',
|
||||||
@@ -31,7 +31,7 @@ var I18n = (function () {
|
|||||||
pdf_scan_qr: 'QR-Code scannen zum Bezahlen',
|
pdf_scan_qr: 'QR-Code scannen zum Bezahlen',
|
||||||
pdf_footer: 'Erstellt mit xmrpay.link — Keine Registrierung, kein KYC',
|
pdf_footer: 'Erstellt mit xmrpay.link — Keine Registrierung, kein KYC',
|
||||||
qr_hint: 'Klick auf QR zum Speichern',
|
qr_hint: 'Klick auf QR zum Speichern',
|
||||||
footer: 'Open Source · Kein Backend · Kein KYC · <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a>',
|
footer: 'Open Source · Kein Backend · Kein KYC · <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a> · <a href="http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion" title="Tor Hidden Service">Onion</a>',
|
||||||
aria_currency: 'Währung',
|
aria_currency: 'Währung',
|
||||||
label_uri_details: 'Monero-URI anzeigen',
|
label_uri_details: 'Monero-URI anzeigen',
|
||||||
label_share_link: 'Teilbarer Link',
|
label_share_link: 'Teilbarer Link',
|
||||||
@@ -57,7 +57,7 @@ var I18n = (function () {
|
|||||||
en: {
|
en: {
|
||||||
subtitle: 'Monero payment request in seconds',
|
subtitle: 'Monero payment request in seconds',
|
||||||
label_addr: 'XMR Address',
|
label_addr: 'XMR Address',
|
||||||
placeholder_addr: '4...',
|
placeholder_addr: '8...',
|
||||||
label_amount: 'Amount',
|
label_amount: 'Amount',
|
||||||
label_desc: 'Description (optional)',
|
label_desc: 'Description (optional)',
|
||||||
placeholder_desc: 'e.g. Invoice #42, freelance work...',
|
placeholder_desc: 'e.g. Invoice #42, freelance work...',
|
||||||
@@ -78,7 +78,7 @@ var I18n = (function () {
|
|||||||
pdf_scan_qr: 'Scan QR code to pay',
|
pdf_scan_qr: 'Scan QR code to pay',
|
||||||
pdf_footer: 'Created with xmrpay.link — No registration, no KYC',
|
pdf_footer: 'Created with xmrpay.link — No registration, no KYC',
|
||||||
qr_hint: 'Click QR to save',
|
qr_hint: 'Click QR to save',
|
||||||
footer: 'Open Source · No Backend · No KYC · <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a>',
|
footer: 'Open Source · No Backend · No KYC · <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a> · <a href="http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion" title="Tor Hidden Service">Onion</a>',
|
||||||
aria_currency: 'Currency',
|
aria_currency: 'Currency',
|
||||||
label_uri_details: 'Show Monero URI',
|
label_uri_details: 'Show Monero URI',
|
||||||
label_share_link: 'Shareable link',
|
label_share_link: 'Shareable link',
|
||||||
|
|||||||
2
i18n.min.js
vendored
2
i18n.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -20,7 +20,7 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label for="addr" data-i18n="label_addr">XMR Address</label>
|
<label for="addr" data-i18n="label_addr">XMR Address</label>
|
||||||
<input type="text" id="addr" data-i18n-placeholder="placeholder_addr" placeholder="4..." spellcheck="false" autocomplete="off">
|
<input type="text" id="addr" data-i18n-placeholder="placeholder_addr" placeholder="8..." spellcheck="false" autocomplete="off">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field">
|
<div class="field">
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<p data-i18n-html="footer">Open Source · No Backend · No KYC · <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a></p>
|
<p data-i18n-html="footer">Open Source · No Backend · No KYC · <a href="https://gitea.schmidt.eco/schmidt1024/xmrpay.link" target="_blank">Source</a> · <a href="http://mc6wfeaqc7oijgdcudrr5zsotmwok3jzk3tu2uezzyjisn7nzzjjizyd.onion" title="Tor Hidden Service">Onion</a></p>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<div class="lang-picker" id="langPicker">
|
<div class="lang-picker" id="langPicker">
|
||||||
|
|||||||
Reference in New Issue
Block a user