Переписал уведомления: toast/confirm вместо alert; объединил профиль+инвентарь; починил ленту активности
This commit is contained in:
+128
-121
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user