Переписал уведомления: toast/confirm вместо alert; объединил профиль+инвентарь; починил ленту активности

This commit is contained in:
root
2026-07-05 15:05:04 +00:00
parent fe6bf5cf29
commit 50535ec777
15 changed files with 1523 additions and 1111 deletions
+128 -121
View File
@@ -223,7 +223,7 @@
<a href="/contracts" class="nav-link">Контракты</a>
<a href="/upgrade" class="nav-link">🆙 Апгрейд</a>
<a href="/crash" class="nav-link">💥 Crash</a>
<a href="/inventory" class="nav-link">Инвентарь</a>
<a href="/profile" class="nav-link">Профиль</a>
<a href="/activity" class="nav-link">📰 Лента</a>
<a href="/achievements" class="nav-link">🏆 Достижения</a>
<a href="/profile" class="nav-link">Профиль</a>
@@ -603,7 +603,10 @@
const hasFreeSpin = freeSpinActive;
freeSpinActive = false;
if (!hasFreeSpin && userBalance < totalPrice) {
alert(`Недостаточно средств!\nНужно: ${totalPrice.toLocaleString()}\nУ вас: ${Math.floor(userBalance).toLocaleString()}`);
Notify.error(`Недостаточно средств! Нужно: ${totalPrice.toLocaleString()}, у вас: ${Math.floor(userBalance).toLocaleString()}`);
isOpening = false;
openButton.disabled = false;
openButton.textContent = isSlotCase ? '🎰 Крутить' : '🎲 Открыть';
return;
}
isOpening = true;
@@ -658,7 +661,7 @@
if (data.new_balance !== undefined) userBalance = data.new_balance;
await refreshUserBalance();
} else {
alert(data.error || 'Ошибка при открытии');
Notify.error(data.error || 'Ошибка при открытии');
}
} else if (isFarmCase) {
// ===== ФАРМ-КЕЙС: КАРТОЧКИ С АВТОПРОДАЖЕЙ ШЛАКА =====
@@ -697,7 +700,7 @@
}
await refreshUserBalance();
} else {
alert(data.error || 'Ошибка при открытии');
Notify.error(data.error || 'Ошибка при открытии');
}
} else if (fast) {
// ===== БЫСТРОЕ ОТКРЫТИЕ БЕЗ АНИМАЦИИ =====
@@ -720,7 +723,7 @@
if (data.new_balance !== undefined) userBalance = data.new_balance;
await refreshUserBalance();
} else {
alert(data.error || 'Ошибка при открытии');
Notify.error(data.error || 'Ошибка при открытии');
}
} else {
// ===== ОБЫЧНЫЙ КЕЙС: СКРОЛЛЫ (РУЛЕТКА) =====
@@ -763,7 +766,7 @@
})();
if (!batchData.success) {
alert(batchData.error || 'Ошибка при открытии');
Notify.error(batchData.error || 'Ошибка при открытии');
} else {
handleAchievements(batchData);
SoundManager.caseOpen();
@@ -797,7 +800,7 @@
}
} catch (error) {
console.error('Error opening cases:', error);
alert('Ошибка при открытии кейсов');
Notify.error('Ошибка при открытии кейсов');
} finally {
isOpening = false;
openButton.disabled = false;
@@ -1338,43 +1341,44 @@
async function sellAllTopDrops() {
if (topDropItems.length === 0) {
alert('Нет предметов для продажи');
Notify.error('Нет предметов для продажи');
return;
}
const total = topDropItems.reduce((sum, i) => sum + (i.price || 100), 0);
if (!confirm(`Продать все топ-дропы за ${total.toLocaleString()} ₽?`)) return;
try {
const response = await fetch('/web/api/inventory/items');
const items = await response.json();
const inventoryIds = [];
for (const item of topDropItems) {
const invItem = items.find(i => i.item_id === item.id &&
Math.abs(i.float - item.float) < 0.001);
if (invItem) {
inventoryIds.push(invItem.id);
}
}
if (inventoryIds.length > 0) {
const formData = new FormData();
formData.append('inventory_ids', JSON.stringify(inventoryIds));
Notify.confirm('Продать все топ-дропы за ' + total.toLocaleString() + ' ₽?', 'Продажа', async function(confirmed) {
if (!confirmed) return;
try {
const response = await fetch('/web/api/inventory/items');
const items = await response.json();
await fetch('/web/api/inventory/sell/bulk', {
method: 'POST',
body: formData
});
const inventoryIds = [];
for (const item of topDropItems) {
const invItem = items.find(i => i.item_id === item.id &&
Math.abs(i.float - item.float) < 0.001);
if (invItem) {
inventoryIds.push(invItem.id);
}
}
if (inventoryIds.length > 0) {
const formData = new FormData();
formData.append('inventory_ids', JSON.stringify(inventoryIds));
await fetch('/web/api/inventory/sell/bulk', {
method: 'POST',
body: formData
});
}
await refreshUserBalance();
await refreshInventoryAjax();
topDropItems = [];
resetCaseUI();
} catch (error) {
Notify.error('Ошибка соединения');
}
await refreshUserBalance();
await refreshInventoryAjax();
topDropItems = [];
resetCaseUI();
} catch (error) {
alert('Ошибка соединения');
}
});
}
// ===== ЭФФЕКТЫ =====
@@ -1749,102 +1753,104 @@
}
async function sellResultItem(itemId) {
if (!confirm('Продать этот предмет?')) return;
try {
const response = await fetch('/web/api/inventory/items');
const items = await response.json();
const inventoryItem = items.find(i => i.item_id === itemId);
if (!inventoryItem) {
alert('Предмет не найден в инвентаре');
return;
}
const formData = new FormData();
formData.append('inventory_id', inventoryItem.id);
const sellResponse = await fetch('/web/api/inventory/sell', {
method: 'POST',
body: formData
});
const data = await sellResponse.json();
if (data.success) {
await refreshUserBalance();
await refreshInventoryAjax();
// Remove the sold item card from display
const cards = document.querySelectorAll('.result-card-enhanced');
for (const card of cards) {
const btn = card.querySelector('.btn-sell-result');
if (btn && btn.getAttribute('onclick')?.includes(itemId)) {
card.style.transition = 'all 0.3s ease';
card.style.opacity = '0';
card.style.transform = 'scale(0.8)';
setTimeout(() => card.remove(), 300);
break;
}
Notify.confirm('Продать этот предмет?', 'Продажа', async function(confirmed) {
if (!confirmed) return;
try {
const response = await fetch('/web/api/inventory/items');
const items = await response.json();
const inventoryItem = items.find(i => i.item_id === itemId);
if (!inventoryItem) {
Notify.error('Предмет не найден в инвентаре');
return;
}
} else {
alert(data.error || 'Ошибка при продаже');
const formData = new FormData();
formData.append('inventory_id', inventoryItem.id);
const sellResponse = await fetch('/web/api/inventory/sell', {
method: 'POST',
body: formData
});
const data = await sellResponse.json();
if (data.success) {
Notify.success('Предмет продан за ' + data.sold_price.toFixed(0) + ' ₽');
await refreshUserBalance();
await refreshInventoryAjax();
const cards = document.querySelectorAll('.result-card-enhanced');
for (const card of cards) {
const btn = card.querySelector('.btn-sell-result');
if (btn && btn.getAttribute('onclick')?.includes(itemId)) {
card.style.transition = 'all 0.3s ease';
card.style.opacity = '0';
card.style.transform = 'scale(0.8)';
setTimeout(() => card.remove(), 300);
break;
}
}
} else {
Notify.error(data.error || 'Ошибка при продаже');
}
} catch (error) {
Notify.error('Ошибка соединения');
}
} catch (error) {
alert('Ошибка соединения');
}
});
}
async function sellAllResults() {
if (!window.lastOpenedItems || window.lastOpenedItems.length === 0) {
alert('Нет предметов для продажи');
Notify.error('Нет предметов для продажи');
return;
}
const total = window.lastOpenedItems.reduce((sum, i) => sum + (i.price || 100), 0);
if (!confirm(`Продать все выпавшие предметы за ${total.toLocaleString()} ₽?`)) return;
try {
const response = await fetch('/web/api/inventory/items');
const items = await response.json();
const inventoryIds = [];
for (const resultItem of window.lastOpenedItems) {
const invItem = items.find(i => i.item_id === resultItem.id &&
Math.abs(i.float - resultItem.float) < 0.001);
if (invItem) {
inventoryIds.push(invItem.id);
Notify.confirm('Продать все выпавшие предметы за ' + total.toLocaleString() + ' ₽?', 'Продажа', async function(confirmed) {
if (!confirmed) return;
try {
const response = await fetch('/web/api/inventory/items');
const items = await response.json();
const inventoryIds = [];
for (const resultItem of window.lastOpenedItems) {
const invItem = items.find(i => i.item_id === resultItem.id &&
Math.abs(i.float - resultItem.float) < 0.001);
if (invItem) {
inventoryIds.push(invItem.id);
}
}
}
if (inventoryIds.length === 0) {
alert('Предметы не найдены в инвентаре');
return;
}
const formData = new FormData();
formData.append('inventory_ids', JSON.stringify(inventoryIds));
const sellResponse = await fetch('/web/api/inventory/sell/bulk', {
method: 'POST',
body: formData
});
const data = await sellResponse.json();
if (inventoryIds.length === 0) {
Notify.error('Предметы не найдены в инвентаре');
return;
}
const formData = new FormData();
formData.append('inventory_ids', JSON.stringify(inventoryIds));
const sellResponse = await fetch('/web/api/inventory/sell/bulk', {
method: 'POST',
body: formData
});
const data = await sellResponse.json();
if (data.success) {
await refreshUserBalance();
await refreshInventoryAjax();
// Clear results and reset UI
const resultsDiv = document.getElementById('openingResults');
resultsDiv.style.display = 'none';
resultsDiv.innerHTML = '';
window.lastOpenedItems = [];
} else {
alert(data.error || 'Ошибка при продаже');
if (data.success) {
Notify.success('Продано ' + data.sold_count + ' предметов за ' + data.total_received.toFixed(0) + ' ₽');
await refreshUserBalance();
await refreshInventoryAjax();
const resultsDiv = document.getElementById('openingResults');
resultsDiv.style.display = 'none';
resultsDiv.innerHTML = '';
window.lastOpenedItems = [];
} else {
Notify.error(data.error || 'Ошибка при продаже');
}
} catch (error) {
Notify.error('Ошибка соединения');
}
} catch (error) {
alert('Ошибка соединения');
}
});
}
function filterItems(rarity) {
@@ -1879,6 +1885,7 @@
</script>
<script src="/static/js/sounds.js"></script>
<script src="/static/js/websocket.js"></script>
<script src="/static/js/notifications.js"></script>
<script src="/static/js/safemode.js"></script>
<script>
function handleAchievements(data) {