mirror of
https://github.com/myronblair/tomtomgames
synced 2026-06-30 17:51:08 -05:00
Shade disabled payout methods when admin turns them off
- payout_methods list now includes admin_enabled flag via JOIN on admin_payout_settings - Disabled methods appear at 45% opacity with UNAVAILABLE/DISABLED BY ADMIN badge in both the cashout radio list and profile payout tab; radio is disabled so they can't be selected, but the delete button remains - Set Default button hidden on disabled methods - cashout.php server-side guard rejects submissions using a disabled method type Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -121,6 +121,16 @@ if ($payoutMethodId) {
|
||||
}
|
||||
}
|
||||
|
||||
// Reject if the payout method type is not currently admin-enabled
|
||||
if ($payoutMethodType) {
|
||||
$enaStmt = db()->prepare("SELECT is_enabled FROM admin_payout_settings WHERE method_key=?");
|
||||
$enaStmt->execute([$payoutMethodType]);
|
||||
$enaRow = $enaStmt->fetch();
|
||||
if (!$enaRow || !$enaRow['is_enabled']) {
|
||||
echo json_encode(['success'=>false,'error'=>'This payout method is no longer available. Please select a different method or add a new one.']); exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Check balance
|
||||
$balStmt = db()->prepare("SELECT tokens FROM users WHERE id=?");
|
||||
$balStmt->execute([$userId]);
|
||||
|
||||
@@ -14,7 +14,14 @@ switch ($action) {
|
||||
|
||||
case 'list':
|
||||
$uid = $isAdmin ? (int)($_GET['user_id'] ?? $userId) : $userId;
|
||||
$rows = db()->prepare("SELECT * FROM payout_methods WHERE user_id=? ORDER BY is_default DESC, id ASC");
|
||||
$rows = db()->prepare("
|
||||
SELECT pm.*,
|
||||
COALESCE(aps.is_enabled, 0) AS admin_enabled
|
||||
FROM payout_methods pm
|
||||
LEFT JOIN admin_payout_settings aps ON aps.method_key = pm.method_type
|
||||
WHERE pm.user_id = ?
|
||||
ORDER BY pm.is_default DESC, pm.id ASC
|
||||
");
|
||||
$rows->execute([$uid]);
|
||||
echo json_encode(['success'=>true, 'methods'=>$rows->fetchAll()]);
|
||||
break;
|
||||
|
||||
@@ -1948,16 +1948,24 @@ async function loadCashoutPayoutMethods() {
|
||||
}
|
||||
if (noEl) noEl.style.display = 'none';
|
||||
if (el) {
|
||||
el.innerHTML = payoutMethods.map(m => `
|
||||
<label style="display:flex;align-items:center;gap:10px;background:${parseInt(m.is_default)?'rgba(0,229,255,.07)':'var(--bg3)'};border:1px solid ${parseInt(m.is_default)?'rgba(0,229,255,.25)':'var(--border)'};border-radius:8px;padding:10px 12px;margin-bottom:6px;cursor:pointer">
|
||||
<input type="radio" name="cashout-payout" value="${m.id}" ${parseInt(m.is_default)?'checked':''} style="accent-color:var(--cyan)">
|
||||
el.innerHTML = payoutMethods.map(m => {
|
||||
const on = parseInt(m.admin_enabled);
|
||||
const bg = on && parseInt(m.is_default) ? 'rgba(0,229,255,.07)' : 'var(--bg3)';
|
||||
const border = on && parseInt(m.is_default) ? 'rgba(0,229,255,.25)' : 'var(--border)';
|
||||
const badge = !on
|
||||
? '<span style="font-size:13px;font-weight:700;color:var(--text2);border:1px solid var(--border);border-radius:4px;padding:2px 7px;white-space:nowrap">UNAVAILABLE</span>'
|
||||
: parseInt(m.is_default) ? '<span style="font-size:14px;font-weight:700;color:var(--cyan);border:1px solid rgba(0,229,255,.2);border-radius:4px;padding:2px 7px">DEFAULT</span>' : '';
|
||||
return `
|
||||
<label style="display:flex;align-items:center;gap:10px;background:${bg};border:1px solid ${border};border-radius:8px;padding:10px 12px;margin-bottom:6px;cursor:${on?'pointer':'not-allowed'};opacity:${on?'1':'0.45'}">
|
||||
<input type="radio" name="cashout-payout" value="${m.id}" ${on && parseInt(m.is_default)?'checked':''} ${!on?'disabled':''} style="accent-color:var(--cyan)">
|
||||
<span style="font-size:18px">${PAYOUT_ICONS[m.method_type]||'💰'}</span>
|
||||
<div style="flex:1;min-width:0">
|
||||
<div style="font-weight:700;font-size:15px">${escHtml(m.label)}</div>
|
||||
<div style="font-size:14px;color:var(--text2)">${escHtml(m.account_handle)}</div>
|
||||
</div>
|
||||
${parseInt(m.is_default)?'<span style="font-size:14px;font-weight:700;color:var(--cyan);border:1px solid rgba(0,229,255,.2);border-radius:4px;padding:2px 7px">DEFAULT</span>':''}
|
||||
</label>`).join('');
|
||||
${badge}
|
||||
</label>`;
|
||||
}).join('');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1967,20 +1975,27 @@ function renderPayoutMethodsList(el) {
|
||||
el.innerHTML = '<div style="color:var(--text2);font-size:15px;text-align:center;padding:16px">No payout methods saved yet.</div>';
|
||||
return;
|
||||
}
|
||||
el.innerHTML = payoutMethods.map(m => `
|
||||
<div style="display:flex;align-items:center;gap:10px;background:${parseInt(m.is_default)?'rgba(0,229,255,.07)':'var(--bg3)'};border:1px solid ${parseInt(m.is_default)?'rgba(0,229,255,.25)':'var(--border)'};border-radius:10px;padding:12px 14px;margin-bottom:8px">
|
||||
el.innerHTML = payoutMethods.map(m => {
|
||||
const on = parseInt(m.admin_enabled);
|
||||
const bg = on && parseInt(m.is_default) ? 'rgba(0,229,255,.07)' : 'var(--bg3)';
|
||||
const border = on && parseInt(m.is_default) ? 'rgba(0,229,255,.25)' : 'var(--border)';
|
||||
return `
|
||||
<div style="display:flex;align-items:center;gap:10px;background:${bg};border:1px solid ${border};border-radius:10px;padding:12px 14px;margin-bottom:8px;opacity:${on?'1':'0.45'}">
|
||||
<span style="font-size:22px">${PAYOUT_ICONS[m.method_type]||'💰'}</span>
|
||||
<div style="flex:1;min-width:0">
|
||||
<div style="font-weight:700;font-size:14px">${escHtml(m.label)}
|
||||
${parseInt(m.is_default)?'<span style="font-size:14px;font-weight:700;color:var(--cyan);border:1px solid rgba(0,229,255,.2);border-radius:4px;padding:2px 7px;margin-left:6px">DEFAULT</span>':''}
|
||||
${!on
|
||||
? '<span style="font-size:13px;font-weight:700;color:var(--text2);border:1px solid var(--border);border-radius:4px;padding:2px 6px;margin-left:6px">DISABLED BY ADMIN</span>'
|
||||
: parseInt(m.is_default) ? '<span style="font-size:14px;font-weight:700;color:var(--cyan);border:1px solid rgba(0,229,255,.2);border-radius:4px;padding:2px 7px;margin-left:6px">DEFAULT</span>' : ''}
|
||||
</div>
|
||||
<div style="font-size:14px;color:var(--text2)">${PAYOUT_LABELS[m.method_type]||m.method_type} · ${escHtml(m.account_handle)}</div>
|
||||
</div>
|
||||
<div style="display:flex;gap:6px;flex-shrink:0">
|
||||
${!parseInt(m.is_default)?`<button onclick="setDefaultPayout(${m.id})" style="background:rgba(0,229,255,.08);border:1px solid rgba(0,229,255,.2);color:var(--cyan);border-radius:6px;padding:5px 10px;font-size:15px;font-weight:700;cursor:pointer;border:none">Set Default</button>`:''}
|
||||
${on && !parseInt(m.is_default)?`<button onclick="setDefaultPayout(${m.id})" style="background:rgba(0,229,255,.08);border:1px solid rgba(0,229,255,.2);color:var(--cyan);border-radius:6px;padding:5px 10px;font-size:15px;font-weight:700;cursor:pointer;border:none">Set Default</button>`:''}
|
||||
<button onclick="deletePayoutMethod(${m.id})" style="background:rgba(255,68,68,.08);border:1px solid rgba(255,68,68,.2);color:var(--red);border-radius:6px;padding:5px 10px;font-size:15px;font-weight:700;cursor:pointer">✕</button>
|
||||
</div>
|
||||
</div>`).join('');
|
||||
</div>`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
async function addPayoutMethod() {
|
||||
|
||||
Reference in New Issue
Block a user