SHA256
Показывать очередь билетов mainnet на тестовом UI
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { renderHeader } from '../components/header.js';
|
||||
import { defaultSolanaCluster } from '../deploy-config.js';
|
||||
import { state } from '../state.js';
|
||||
import { loadSolanaWeb3 } from '../vendor/solana-web3-loader.js';
|
||||
|
||||
@@ -6,6 +7,7 @@ export const pageMeta = { id: 'queue', title: 'Очередь билета' };
|
||||
|
||||
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',
|
||||
@@ -15,6 +17,14 @@ const SHINE_PAYMENTS_SEEDS = {
|
||||
q3: 'shine_payments_q3_ticket',
|
||||
};
|
||||
|
||||
function isTestDeployUi() {
|
||||
return String(defaultSolanaCluster || '').trim().toLowerCase() !== 'mainnet-beta';
|
||||
}
|
||||
|
||||
function resolveQueueEndpoint(useMainnetQueue) {
|
||||
return useMainnetQueue ? SHINE_MAINNET_SOLANA_ENDPOINT : state.entrySettings.solanaServer;
|
||||
}
|
||||
|
||||
function utf8Bytes(text) {
|
||||
return new TextEncoder().encode(String(text || ''));
|
||||
}
|
||||
@@ -286,7 +296,18 @@ export function render({ navigate }) {
|
||||
result.className = 'card stack';
|
||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
||||
|
||||
const testDeploy = isTestDeployUi();
|
||||
const mainnetRow = document.createElement('label');
|
||||
mainnetRow.className = 'checkbox-row';
|
||||
mainnetRow.innerHTML = `
|
||||
<input type="checkbox" id="public-queue-mainnet-source" ${testDeploy ? 'checked' : ''} />
|
||||
<span>Показывать данные mainnet (${SHINE_MAINNET_SOLANA_ENDPOINT})</span>
|
||||
`;
|
||||
mainnetRow.style.display = testDeploy ? '' : 'none';
|
||||
const mainnetCheckbox = mainnetRow.querySelector('#public-queue-mainnet-source');
|
||||
|
||||
let lastCoreState = null;
|
||||
let lastEndpoint = '';
|
||||
|
||||
async function renderTicketInfo() {
|
||||
const raw = String(queryInput.value || '').trim();
|
||||
@@ -297,8 +318,12 @@ export function render({ navigate }) {
|
||||
}
|
||||
try {
|
||||
const parsed = parseSupportTicketInput(raw);
|
||||
const core = lastCoreState || await loadSupportPaymentsCore(state.entrySettings.solanaServer);
|
||||
const endpoint = resolveQueueEndpoint(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);
|
||||
@@ -330,7 +355,7 @@ export function render({ navigate }) {
|
||||
<div><b>Сумма этого билета:</b> ${formatUsdCentsText(ticket.payoutUsdCents)} USD</div>
|
||||
<div><b>Накоплено до этого билета:</b> ${formatUsdCentsText(ticket.debtBeforeUsdCents)} USD в очереди до него</div>
|
||||
`;
|
||||
status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден.`;
|
||||
status.textContent = `Билет ${formatQueuePrefix(parsed.queueId)}-${ticket.index.toString()} найден. Источник Solana: ${endpoint}`;
|
||||
} catch (error) {
|
||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">${String(error?.message || 'Не удалось загрузить билет')}</p>`;
|
||||
status.textContent = `Не удалось посмотреть билет: ${error?.message || 'unknown'}`;
|
||||
@@ -340,6 +365,11 @@ export function render({ navigate }) {
|
||||
actions.querySelector('#public-queue-load')?.addEventListener('click', () => {
|
||||
void renderTicketInfo();
|
||||
});
|
||||
mainnetCheckbox?.addEventListener('change', () => {
|
||||
lastCoreState = null;
|
||||
lastEndpoint = '';
|
||||
status.textContent = `Источник Solana: ${resolveQueueEndpoint(Boolean(testDeploy && mainnetCheckbox.checked))}`;
|
||||
});
|
||||
actions.querySelector('#public-queue-reset')?.addEventListener('click', () => {
|
||||
queryInput.value = '';
|
||||
result.innerHTML = `<p class="meta-muted" style="margin:0;">Введите номер билета и нажмите кнопку.</p>`;
|
||||
@@ -352,7 +382,7 @@ export function render({ navigate }) {
|
||||
}
|
||||
});
|
||||
|
||||
content.append(card, inputLabel, queryInput, actions, result, status);
|
||||
content.append(card, mainnetRow, inputLabel, queryInput, actions, result, status);
|
||||
screen.append(
|
||||
renderHeader({
|
||||
title: 'Очередь билета',
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user