diff --git a/resources/js/chat-room/shop-controls.js b/resources/js/chat-room/shop-controls.js index d6fa2f4..e7d9e4a 100644 --- a/resources/js/chat-room/shop-controls.js +++ b/resources/js/chat-room/shop-controls.js @@ -548,9 +548,17 @@ async function confirmAndBuyItem(item) { } } - const validityText = buildValidityText(item); const isDecoration = DECORATION_TYPE_TO_SLOT[item.type] && item.type !== "sign_repair"; - const stackingHint = isDecoration ? "\\n\\n💡 已激活的同款续购自动叠加天数,可多次购买" : ""; + if (isDecoration) { + const unitPrice = Number(item.price || 0); + quantity = await promptDecorationQuantity(item); + if (quantity === null || quantity === undefined) { + return; + } + } + + const validityText = buildValidityText(item); + const stackingHint = isDecoration ? "\\n💡 已激活同款续购自动叠加天数,可多次购买" : ""; const confirmMessage = `确认花费 💰 ${Number(Number(item.price || 0) * quantity).toLocaleString()} 金币购买\\n【${item.name}】${quantity > 1 ? ` × ${quantity}` : ""}${validityText ? `\\n${validityText}` : ""}${stackingHint}\\n\\n确定购买吗?`; const confirmed = await confirmShopPurchase(confirmMessage); @@ -559,6 +567,47 @@ async function confirmAndBuyItem(item) { } } +/** + * 装饰品数量输入弹窗(参照补签卡样式)。 + * + * @param {Record} item 装饰品数据 + * @returns {Promise} 返回数量,取消返回 null + */ +async function promptDecorationQuantity(item) { + const unitPrice = Number(item.price || 0); + const validityText = buildValidityText(item); + const validHint = validityText ? `\\n有效期:${validityText}` : ""; + const promptPromise = window.chatDialog?.prompt( + `请输入要购买的份数(1-99份):\\n单价 ${unitPrice.toLocaleString()} 金币${validHint}\\n💡 已激活同款续购自动叠加天数,可多次购买`, + '1', + `购买 ${item.name}`, + '#7c3aed', + ); + + const inputEl = document.getElementById('global-dialog-input'); + const previousInputStyle = inputEl?.getAttribute('style') || ''; + + if (inputEl) { + inputEl.style.minHeight = '40px'; + inputEl.style.height = '40px'; + inputEl.style.resize = 'none'; + inputEl.style.overflow = 'hidden'; + } + + const rawQuantity = await promptPromise; + + if (inputEl) inputEl.setAttribute('style', previousInputStyle); + if (rawQuantity === null || rawQuantity === undefined) return null; + + const quantity = Number.parseInt(String(rawQuantity).trim(), 10); + if (!Number.isInteger(quantity) || quantity < 1 || quantity > 99) { + window.chatDialog?.alert('购买数量必须是 1 到 99 之间的整数。', '数量不正确', '#cc4444'); + return null; + } + + return quantity; +} + /** * 通用数量输入弹窗。 *