Показывать очередь билетов mainnet на тестовом UI

This commit is contained in:
AidarKC
2026-07-20 21:04:11 +04:00
parent d230b61c0b
commit 968d85d738
3 changed files with 69 additions and 9 deletions
+34 -4
View File
@@ -1,4 +1,5 @@
import { renderHeader } from '../components/header.js';
import { defaultSolanaCluster } from '../deploy-config.js';
import { authService, state } from '../state.js';
import {
formatSol,
@@ -65,6 +66,7 @@ function sessionArgsOrThrow() {
const SHINE_PAYMENTS_PROGRAM_ID = 'SHiPmXbM9Fs9khzRUW3TGKsS2W84aqaXTxs3ZkajW9v';
const SHINE_PAYMENTS_ORACLE_ACCOUNT = '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE';
const SHINE_MAINNET_SOLANA_ENDPOINT = 'https://solana-rpc.publicnode.com';
const SHINE_PAYMENTS_SEEDS = {
config: 'shine_payments_config',
coef: 'shine_payments_coef_limit',
@@ -84,6 +86,14 @@ const SUPPORT_TICKET_HELP_TEXT = [
'Номер билета нужно сохранить отдельно: именно по нему удобно отслеживать, когда он дойдет до выплаты.',
].join('\n');
function isTestDeployUi() {
return String(defaultSolanaCluster || '').trim().toLowerCase() !== 'mainnet-beta';
}
function resolveSupportQueueEndpoint(useMainnetQueue) {
return useMainnetQueue ? SHINE_MAINNET_SOLANA_ENDPOINT : state.entrySettings.solanaServer;
}
function utf8Bytes(text) {
return new TextEncoder().encode(String(text || ''));
}
@@ -697,6 +707,16 @@ export function render({ navigate }) {
queryInput.spellcheck = false;
styleSupportInputField(queryInput);
const testDeploy = isTestDeployUi();
const mainnetRow = document.createElement('label');
mainnetRow.className = 'checkbox-row';
mainnetRow.innerHTML = `
<input type="checkbox" id="support-ticket-mainnet-source" ${testDeploy ? 'checked' : ''} />
<span>Показывать данные mainnet (${SHINE_MAINNET_SOLANA_ENDPOINT})</span>
`;
mainnetRow.style.display = testDeploy ? '' : 'none';
const mainnetCheckbox = mainnetRow.querySelector('#support-ticket-mainnet-source');
const actions = document.createElement('div');
actions.className = 'row';
actions.innerHTML = `
@@ -711,6 +731,7 @@ export function render({ navigate }) {
`;
let lastCoreState = null;
let lastEndpoint = '';
const renderTicketInfo = async () => {
const raw = String(queryInput.value || '').trim();
@@ -720,8 +741,12 @@ export function render({ navigate }) {
}
try {
const parsed = parseSupportTicketInput(raw);
const core = lastCoreState || await loadSupportPaymentsCore(state.entrySettings.solanaServer);
const endpoint = resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox?.checked));
const core = lastCoreState && lastEndpoint === endpoint
? lastCoreState
: await loadSupportPaymentsCore(endpoint);
lastCoreState = core;
lastEndpoint = endpoint;
const solana = await loadSolanaWeb3();
const ticketPdaSeed = queueSeedFor(parsed.queueId);
const ticketIndexBytes = u64ToBytes(parsed.index);
@@ -752,7 +777,7 @@ export function render({ navigate }) {
<div><b>Сумма этого билета:</b> ${formatUsdCentsText(ticket.payoutUsdCents)} USD</div>
<div><b>Накоплено до этого билета:</b> ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него</div>
`;
setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден.`);
setStatus(`Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`);
} catch (error) {
result.innerHTML = `<p class="meta-muted" style="margin:0;">${String(error?.message || 'Не удалось загрузить билет')}</p>`;
setStatus(`Не удалось посмотреть билет: ${error?.message || 'unknown'}`);
@@ -767,9 +792,14 @@ export function render({ navigate }) {
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
setStatus('Поле билета очищено.');
});
mainnetCheckbox?.addEventListener('change', () => {
lastCoreState = null;
lastEndpoint = '';
setStatus(`Источник Solana: ${resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox.checked))}`);
});
content.append(backBtn, card, inputLabel, queryInput, actions, result);
setStatus('Просмотр билета готов. Введите номер в нужном формате.');
content.append(backBtn, card, mainnetRow, inputLabel, queryInput, actions, result);
setStatus(`Просмотр билета готов. Источник Solana: ${resolveSupportQueueEndpoint(Boolean(testDeploy && mainnetCheckbox?.checked))}`);
}
async function renderSupportBuyIntro() {