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'}`);