/* ============================================================
BAN YARO — Partner-Dashboard
Operative Daten für Partner: Code + Einladungslink, Statistik,
QR-Kontingente mit Einzel-Code-Status, Profil-Status.
(Die öffentliche Präsenz wird in partner-profil.js gepflegt.)
============================================================ */
window.Page_partner_dashboard = (() => {
let _container = null;
let _stats = null;
let _qrBatches = [];
async function init(container) {
_container = container;
_render();
await _load();
}
function refresh() { _load(); }
function onDogChange() {}
function _render() {
_container.innerHTML = `
${UI.icon('handshake')} Partner-Bereich
Dein Code, deine Zahlen, deine QR-Kontingente.
`;
}
async function _load() {
const el = _container.querySelector('#pd-content');
try {
_stats = await API.get('/partner/my-stats');
_qrBatches = (await API.get('/partner/my-qr').catch(() => [])) || [];
el.innerHTML = _renderDashboard();
_bindEvents(el);
} catch (e) {
el.innerHTML = `${UI.escape(e.message || 'Fehler beim Laden.')}
`;
}
}
function _renderDashboard() {
const codes = _stats?.codes || [];
return `
${codes.length === 0 ? `
Dir ist noch kein Partner-Code zugeordnet.
Melde dich bei partner@banyaro.app — wir richten ihn ein.
` : codes.map(c => _renderCodeCard(c)).join('')}
${_renderQrSection()}
${_renderProfileCard()}
`;
}
function _renderCodeCard(c) {
const link = `https://banyaro.app/?ref=${encodeURIComponent(c.code)}`;
return `
Dein Einladungscode
${UI.escape(c.code)}
${c.registrations}
Registrierungen
${c.registrations_month}
diesen Monat
Zählt alle Wege: geteilter Link, eingetippter Code und deine gedruckten QR-Codes.
`;
}
function _renderQrSection() {
if (!_qrBatches.length) return '';
return `
Meine QR-Codes
Deine gedruckten QR-Codes (Sticker, Flyer) — und wie viele davon schon
neue Hundefreunde gebracht haben.
${_qrBatches.map(b => `
${UI.escape(b.label)}
${b.quantity} Codes · ${(b.created_at || '').slice(0, 10)}
${b.codes_used} von ${b.quantity}
genutzt
${UI.icon('file-pdf')} PDF
`).join('')}
`;
}
function _renderProfileCard() {
const p = _stats?.profile || {};
let badge;
if (p.approved === 1) badge = `✓ Öffentlich sichtbar`;
else if (p.approved === -1) badge = `✗ Abgelehnt`;
else if (p.submitted_at) badge = `⏳ In Prüfung`;
else if (p.exists) badge = `Entwurf`;
else badge = `Noch nicht angelegt`;
return `
Öffentliches Profil
${badge}
`;
}
function _bindEvents(el) {
// Einladungslink kopieren
el.querySelectorAll('.pd-copy').forEach(btn => {
btn.addEventListener('click', async () => {
try {
await navigator.clipboard.writeText(btn.dataset.link);
UI.toast.success('Einladungslink kopiert.');
} catch {
UI.toast.info(btn.dataset.link);
}
});
});
// Einzel-Code-Status (lazy, .hidden via classList)
el.querySelectorAll('.pd-qr-codes-btn').forEach(btn => {
btn.addEventListener('click', async () => {
const box = el.querySelector(`#pd-qr-codes-${btn.dataset.id}`);
if (!box) return;
box.classList.toggle('hidden');
if (box.classList.contains('hidden') || box.dataset.loaded === '1') return;
try {
const codes = await API.get(`/partner/my-qr/${btn.dataset.id}/codes`);
box.dataset.loaded = '1';
box.innerHTML = codes.map(c => {
const used = c.registrations > 0;
return `
#${c.seq}
banyaro.app/q/${UI.escape(c.token)}
${used
? `● genutzt${c.registrations > 1 ? ` (${c.registrations}×)` : ''}`
: `○ frei`}
`;
}).join('');
} catch (err) { UI.toast.error(err.message); }
});
});
el.querySelector('#pd-edit-profile')?.addEventListener('click', () => App.navigate('partner-profil'));
}
return { init, refresh, onDogChange };
})();