From 2f3b1571e5b8e7ee92030e2a4c9ec9730d694bb2b094dc194382275002c613a7 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Mon, 20 Jul 2026 22:13:19 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80?= =?UTF-8?q?=20=D0=B1=D0=B8=D0=BB=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B9=20=D0=B8=20=D1=82=D1=80=D0=B5=D1=82?= =?UTF-8?q?=D1=8C=D0=B5=D0=B9=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION.properties | 4 +- .../js/pages/public-support-queue-view.js | 59 +++++++++++++------ shine-UI/js/pages/wallet-view.js | 57 ++++++++++++------ 3 files changed, 81 insertions(+), 39 deletions(-) diff --git a/VERSION.properties b/VERSION.properties index 4df5a464..7402b000 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.338 -server.version=1.2.310 +client.version=1.2.339 +server.version=1.2.311 diff --git a/shine-UI/js/pages/public-support-queue-view.js b/shine-UI/js/pages/public-support-queue-view.js index b61d2048..bfb9a782 100644 --- a/shine-UI/js/pages/public-support-queue-view.js +++ b/shine-UI/js/pages/public-support-queue-view.js @@ -67,6 +67,18 @@ function formatQueuePrefix(queueId) { return 'Q1'; } +function formatQueueTitle(queueId) { + if (queueId === 2) return 'Вторая очередь'; + if (queueId === 3) return 'Третья очередь'; + return 'Первая очередь'; +} + +function formatSupportTicketLabel(queueId, index) { + const cleanIndex = BigInt(index || 0n).toString(); + if (queueId === 2 || queueId === 3) return `${queueId}/${cleanIndex}`; + return cleanIndex; +} + function formatUsdCentsText(cents) { const value = Number(cents || 0n) / 100; return value.toLocaleString('ru-RU', { minimumFractionDigits: 0, maximumFractionDigits: 2 }); @@ -150,9 +162,9 @@ function parseSupportTicketInput(rawValue) { if (/^\d+$/.test(clean)) { return { queueId: 1, index: BigInt(clean) }; } - const match = clean.match(/^([123])(?:\s*[-_:\/#]+\s*|\s+)(\d+)$/); + const match = clean.match(/^([23])\s*\/\s*(\d+)$/); if (!match) { - throw new Error('Формат: для Q1 просто номер, для Q2/Q3 - например 2-15 или 3 8.'); + throw new Error('Формат: для первой очереди просто номер, для второй и третьей - например 2/7 или 3/8.'); } return { queueId: Number(match[1]), @@ -266,8 +278,7 @@ export function render({ navigate }) { card.innerHTML = `

Публичная очередь билета

- Для Q1 вводите просто номер билета. Для Q2 и Q3 укажите номер в формате 2-15 или 3 8. - Страница покажет состояние билета и сколько позиций осталось до выплаты. + Введите номер билета.

`; @@ -279,7 +290,7 @@ export function render({ navigate }) { const queryInput = document.createElement('input'); queryInput.id = 'public-queue-ticket-query'; queryInput.type = 'text'; - queryInput.placeholder = 'Например: 12, 2-5 или 3 8'; + queryInput.placeholder = 'Например: 12, 2/5 или 3/8'; queryInput.autocomplete = 'off'; queryInput.spellcheck = false; styleInputField(queryInput); @@ -334,9 +345,9 @@ export function render({ navigate }) { const ticketInfo = await core.connection.getAccountInfo(ticketPda, 'confirmed'); if (!ticketInfo) { result.innerHTML = ` -

Билет ${formatQueuePrefix(parsed.queueId)}-${parsed.index.toString()} пока не создан.

+

Билет ${formatSupportTicketLabel(parsed.queueId, parsed.index)} пока не создан.

`; - status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${parsed.index.toString()} не найден.`; + status.textContent = `Билет ${formatSupportTicketLabel(parsed.queueId, parsed.index)} не найден.`; return; } const ticket = parsePaymentsTicket(ticketInfo.data); @@ -344,18 +355,28 @@ export function render({ navigate }) { const ticketsBefore = parsed.index > 0n ? parsed.index - 1n : 0n; const paidBefore = queueState.ticketsPaid < ticketsBefore ? queueState.ticketsPaid : ticketsBefore; const remainingBefore = ticketsBefore > paidBefore ? ticketsBefore - paidBefore : 0n; - result.innerHTML = ` -
Билет: ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()}
-
Статус: ${ticket.isPaid ? 'выплачен' : 'ожидает выплаты'}
-
Получатель: ${ticket.recipientWallet}
-
До него в очереди: ${ticketsBefore.toString()} билетов
-
Из них уже выплачено: ${paidBefore.toString()} билетов
-
Ещё осталось до него: ${remainingBefore.toString()} билетов
-
Уже выплачено по сумме в очереди: ${formatUsdCentsText(queueState.sumPaidUsdCents)} USD
-
Сумма этого билета: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
-
Накоплено до этого билета: ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него
- `; - status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`; + if (ticket.queueId === 2 || ticket.queueId === 3) { + result.innerHTML = ` +
${formatQueueTitle(ticket.queueId)}
+
Номер билета: ${ticket.index.toString()}
+
Статус: ${ticket.isPaid ? 'выплачен' : 'ожидает выплаты'}
+
Получатель: ${ticket.recipientWallet}
+
Сумма: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
+ `; + } else { + result.innerHTML = ` +
Билет: ${formatSupportTicketLabel(parsed.queueId, ticket.index)}
+
Статус: ${ticket.isPaid ? 'выплачен' : 'ожидает выплаты'}
+
Получатель: ${ticket.recipientWallet}
+
До него в очереди: ${ticketsBefore.toString()} билетов
+
Из них уже выплачено: ${paidBefore.toString()} билетов
+
Ещё осталось до него: ${remainingBefore.toString()} билетов
+
Уже выплачено по сумме в очереди: ${formatUsdCentsText(queueState.sumPaidUsdCents)} USD
+
Сумма этого билета: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
+
Накоплено до этого билета: ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него
+ `; + } + status.textContent = `Билет ${formatSupportTicketLabel(ticket.queueId, ticket.index)} найден. Источник Solana: ${endpoint}`; } catch (error) { result.innerHTML = `

${String(error?.message || 'Не удалось загрузить билет')}

`; status.textContent = `Не удалось посмотреть билет: ${error?.message || 'unknown'}`; diff --git a/shine-UI/js/pages/wallet-view.js b/shine-UI/js/pages/wallet-view.js index 211c2549..04941eb2 100644 --- a/shine-UI/js/pages/wallet-view.js +++ b/shine-UI/js/pages/wallet-view.js @@ -200,6 +200,18 @@ function formatQueuePrefix(queueId) { return 'Q1'; } +function formatQueueTitle(queueId) { + if (queueId === 2) return 'Вторая очередь'; + if (queueId === 3) return 'Третья очередь'; + return 'Первая очередь'; +} + +function formatSupportTicketLabel(queueId, index) { + const cleanIndex = BigInt(index || 0n).toString(); + if (queueId === 2 || queueId === 3) return `${queueId}/${cleanIndex}`; + return cleanIndex; +} + function parsePaymentsCoef(data) { let offset = 0; const version = data[offset]; @@ -276,9 +288,9 @@ function parseSupportTicketInput(rawValue) { if (/^\d+$/.test(clean)) { return { queueId: 1, index: BigInt(clean) }; } - const match = clean.match(/^([123])(?:\s*[-_:\/#]+\s*|\s+)(\d+)$/); + const match = clean.match(/^([23])\s*\/\s*(\d+)$/); if (!match) { - throw new Error('Формат: для Q1 просто номер, для Q2/Q3 - например 2-15 или 3 8.'); + throw new Error('Формат: для первой очереди просто номер, для второй и третьей - например 2/7 или 3/8.'); } return { queueId: Number(match[1]), @@ -689,8 +701,7 @@ export function render({ navigate }) { card.innerHTML = `

Посмотреть очередь билета

- Для Q1 вводите просто номер билета. Для Q2 и Q3 укажите номер в формате 2-15 или 3 8. - Экран покажет, сколько билетов перед ним уже стоит, сколько уже выплачено и кому принадлежит билет. + Введите номер билета.

`; @@ -702,7 +713,7 @@ export function render({ navigate }) { const queryInput = document.createElement('input'); queryInput.id = 'support-ticket-query'; queryInput.type = 'text'; - queryInput.placeholder = 'Например: 12, 2-5 или 3 8'; + queryInput.placeholder = 'Например: 12, 2/5 или 3/8'; queryInput.autocomplete = 'off'; queryInput.spellcheck = false; styleSupportInputField(queryInput); @@ -757,7 +768,7 @@ export function render({ navigate }) { const ticketInfo = await core.connection.getAccountInfo(ticketPda, 'confirmed'); if (!ticketInfo) { result.innerHTML = ` -

Билет ${formatQueuePrefix(parsed.queueId)}-${parsed.index.toString()} пока не создан.

+

Билет ${formatSupportTicketLabel(parsed.queueId, parsed.index)} пока не создан.

`; return; } @@ -766,18 +777,28 @@ export function render({ navigate }) { const ticketsBefore = parsed.index > 0n ? parsed.index - 1n : 0n; const paidBefore = queueState.ticketsPaid < ticketsBefore ? queueState.ticketsPaid : ticketsBefore; const remainingBefore = ticketsBefore > paidBefore ? ticketsBefore - paidBefore : 0n; - result.innerHTML = ` -
Билет: ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()}
-
Статус: ${ticket.isPaid ? 'выплачен' : 'ожидает выплаты'}
-
Получатель: ${ticket.recipientWallet}
-
До него в очереди: ${ticketsBefore.toString()} билетов
-
Из них уже выплачено: ${paidBefore.toString()} билетов
-
Ещё осталось до него: ${remainingBefore.toString()} билетов
-
Уже выплачено по сумме в очереди: ${formatUsdCentsText(queueState.sumPaidUsdCents)} USD
-
Сумма этого билета: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
-
Накоплено до этого билета: ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него
- `; - setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`); + if (ticket.queueId === 2 || ticket.queueId === 3) { + result.innerHTML = ` +
${formatQueueTitle(ticket.queueId)}
+
Номер билета: ${ticket.index.toString()}
+
Статус: ${ticket.isPaid ? 'выплачен' : 'ожидает выплаты'}
+
Получатель: ${ticket.recipientWallet}
+
Сумма: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
+ `; + } else { + result.innerHTML = ` +
Билет: ${formatSupportTicketLabel(parsed.queueId, ticket.index)}
+
Статус: ${ticket.isPaid ? 'выплачен' : 'ожидает выплаты'}
+
Получатель: ${ticket.recipientWallet}
+
До него в очереди: ${ticketsBefore.toString()} билетов
+
Из них уже выплачено: ${paidBefore.toString()} билетов
+
Ещё осталось до него: ${remainingBefore.toString()} билетов
+
Уже выплачено по сумме в очереди: ${formatUsdCentsText(queueState.sumPaidUsdCents)} USD
+
Сумма этого билета: ${formatUsdCentsText(ticket.payoutUsdCents)} USD
+
Накоплено до этого билета: ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него
+ `; + } + setStatus(`Билет ${formatSupportTicketLabel(ticket.queueId, ticket.index)} найден. Источник Solana: ${endpoint}`); } catch (error) { result.innerHTML = `

${String(error?.message || 'Не удалось загрузить билет')}

`; setStatus(`Не удалось посмотреть билет: ${error?.message || 'unknown'}`);