From 1ed9dbcacfdfffd9d5dec3131e76cc5d1e357c34 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 5 Jun 2026 14:40:04 +0300 Subject: [PATCH] =?UTF-8?q?feat(pet):=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BF=D0=BA=D0=B8=20=D1=84=D0=BE=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=B3=D0=B0=D1=80=D0=B4=D0=B5=D1=80=D0=BE=D0=B1=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перед платной покупкой фона — диалог LS.confirm («Купить «X» за N монет?») + предпроверка баланса (тост, если монет не хватает). Применение уже купленных/стандартного — без подтверждения. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/pet.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/pet.html b/frontend/pet.html index 36fda75..16024e7 100644 --- a/frontend/pet.html +++ b/frontend/pet.html @@ -1107,6 +1107,14 @@ async function renderBgPicker() { c.addEventListener('click', () => selectBgInline(c.dataset.id, +c.dataset.price, c.dataset.owned === '1'))); } async function selectBgInline(id, price, owned) { + // покупка платного фона — подтверждение + предпроверка баланса + if (!owned && id !== 'default') { + const coins = _petData ? (_petData.coins ?? 0) : 0; + if (coins < price) { LS.toast?.('Недостаточно монет: нужно ' + price, 'warn'); return; } + const ok = await LS.confirm('Купить фон «' + (BG_NAMES[id] || id) + '» за ' + price + ' монет?', + { title: 'Покупка фона', confirmText: 'Купить за ' + price, danger: false }); + if (!ok) return; + } const endpoint = owned ? '/api/pet/bg' : '/api/pet/shop/buy'; const res = await LS.api(endpoint, { method: owned ? 'PATCH' : 'POST', body: JSON.stringify({ id }) }).catch(e => { if (e?.data?.error === 'insufficient_coins') LS.toast?.('Недостаточно монет', 'error');