(function () { var DESIGN_WIDTH = 1080; var VIEWPORT_WIDTH = 375; var DESIGN_HEIGHT = 4620; var STORAGE_KEY = 'hy_agency_opening_end_at'; var viewport = document.getElementById('appViewport'); var stageWrap = document.getElementById('stageWrap'); var countdownTimer = 0; var countdownEndAt = 0; var timeOffsetMS = 0; var statusLoadedFromAPI = false; var state = null; var countNodes = { days: document.querySelector('[data-count="days"]'), hours: document.querySelector('[data-count="hours"]'), minutes: document.querySelector('[data-count="minutes"]'), seconds: document.querySelector('[data-count="seconds"]'), }; var applyButton = document.getElementById('applyButton'); var rewardRows = document.getElementById('rewardRows'); var rulesList = document.getElementById('rulesList'); var fallbackRewards = [ { opening_revenue: '500K', reward_coins: '50K' }, { opening_revenue: '1M', reward_coins: '100K' }, { opening_revenue: '3M', reward_coins: '300K' }, { opening_revenue: '5M', reward_coins: '500K' }, { opening_revenue: '10M', reward_coins: '500K' }, ]; function params() { return new URLSearchParams(window.location.search || ''); } function t(key, fallback) { return window.HyAppI18n && window.HyAppI18n.t ? window.HyAppI18n.t(key, fallback) : fallback || key; } function twoDigits(value) { return String(Math.max(0, value)).padStart(2, '0'); } function serverNow() { return Date.now() - timeOffsetMS; } function updateViewportHeight() { var scale = Math.min(window.innerWidth / VIEWPORT_WIDTH, 1); var visibleHeight = Math.ceil( DESIGN_HEIGHT * (VIEWPORT_WIDTH / DESIGN_WIDTH) ); document.documentElement.style.setProperty( '--app-scale', String(scale) ); stageWrap.style.height = visibleHeight + 'px'; viewport.style.minHeight = visibleHeight + 'px'; document.body.style.minHeight = Math.ceil(visibleHeight * scale) + 'px'; } function fallbackEndAt() { var queryEnd = Date.parse( params().get('end_at') || params().get('endAt') || '' ); if (Number.isFinite(queryEnd) && queryEnd > Date.now()) return queryEnd; var cached = Number(window.localStorage.getItem(STORAGE_KEY)); if (Number.isFinite(cached) && cached > Date.now()) return cached; var fallback = Date.now() + 4 * 86400 * 1000 + 4 * 3600 * 1000 + 4 * 60 * 1000 + 4000; window.localStorage.setItem(STORAGE_KEY, String(fallback)); return fallback; } function updateCountdown() { var diff = Math.max(0, countdownEndAt - serverNow()); var totalSeconds = Math.floor(diff / 1000); countNodes.days.textContent = twoDigits( Math.floor(totalSeconds / 86400) ); countNodes.hours.textContent = twoDigits( Math.floor((totalSeconds % 86400) / 3600) ); countNodes.minutes.textContent = twoDigits( Math.floor((totalSeconds % 3600) / 60) ); countNodes.seconds.textContent = twoDigits(totalSeconds % 60); } function firstValue(source, keys, fallback) { if (!source) return fallback; for (var index = 0; index < keys.length; index += 1) { var value = source[keys[index]]; if (value !== undefined && value !== null && value !== '') return value; } return fallback; } function normalizeStatus(raw) { var data = raw || {}; var qualification = data.qualification || data.qualifications || data.agency || {}; var record = data.record || data.opening_record || data.openingRecord || {}; var application = data.application || data.opening_application || data.openingApplication || {}; var joined = Boolean( firstValue(data, ['joined', 'has_joined', 'hasJoined'], false) ); var eligible = firstValue( data, ['eligible', 'can_apply', 'canApply'], true ); var ineligibleReason = String( firstValue( data, ['ineligible_reason', 'ineligibleReason'], '' ) || '' ); var hostCount = Number( firstValue(qualification, ['host_count', 'hostCount'], 12) ) || 0; var hostRequirement = Number( firstValue( qualification, ['host_requirement', 'hostRequirement'], 10 ) ) || 10; return { serverTimeMS: Number( firstValue( data, ['server_time_ms', 'serverTimeMs'], Date.now() ) ) || Date.now(), endAt: Number( firstValue( data.period || data.activity_period || {}, ['end_ms', 'endMs'], firstValue(data, ['period_end_ms', 'periodEndMs'], 0) ) ) || fallbackEndAt(), qualification: { identity: firstValue( qualification, ['identity', 'agency_identity', 'agencyIdentity'], 'Agency' ), hostCount: hostCount, hostRequirement: hostRequirement, openingStatus: firstValue( qualification, [ 'opening_status', 'openingStatus', 'status_text', 'statusText', ], joined ? t('agencyOpening.joined', 'Joined') : t('agencyOpening.notJoined', 'Not Joined') ), ineligibleReason: ineligibleReason, eligible: Boolean(eligible) && !joined, }, rewards: Array.isArray( data.rewards || data.reward_tiers || data.rewardTiers ) ? data.rewards || data.reward_tiers || data.rewardTiers : fallbackRewards, rules: Array.isArray(data.rules) ? data.rules : null, record: { guildName: firstValue( record, ['guild_name', 'guildName', 'agency_name', 'agencyName'], 'Royal Family' ), created: firstValue( record, ['created_at', 'createdAt', 'created'], '2026-06-01' ), revenue: firstValue( record, ['opening_revenue', 'openingRevenue', 'revenue'], '100K' ), reward: firstValue( record, ['reward', 'reward_coins', 'rewardCoins'], '500K' ), scoreEndMS: Number( firstValue( record, ['score_end_ms', 'scoreEndMs'], firstValue( application, ['score_end_ms', 'scoreEndMs'], 0 ) ) ) || 0, }, application: application, joined: joined, }; } function mockStatus() { var query = params(); return normalizeStatus({ period: { end_ms: fallbackEndAt() }, qualification: { agency_identity: query.get('identity') || 'Agency', host_count: query.get('hosts') || 12, host_requirement: query.get('host_requirement') || 10, opening_status: query.get('status') || 'Not Joined', }, record: { guild_name: query.get('guild') || 'Royal Family', created_at: query.get('created') || '2026-06-01', opening_revenue: query.get('revenue') || '100K', reward: query.get('reward') || '500K', }, joined: query.get('joined') === '1', eligible: query.get('eligible') !== '0', rewards: fallbackRewards, server_time_ms: Date.now(), }); } function fetchStatus() { if (params().get('mock') === '1' || !window.HyAppAPI) { statusLoadedFromAPI = false; return Promise.resolve(mockStatus()); } return window.HyAppAPI.get('/api/v1/activities/agency-opening-event') .then(function (data) { statusLoadedFromAPI = true; return normalizeStatus(data); }) .catch(function (error) { // 新活动页先独立上线,接口未部署或活动未配置时继续渲染 Figma 默认态,避免线上 WebView 出现空白页。 console.warn('agency opening event status fallback', error); statusLoadedFromAPI = false; return mockStatus(); }); } function renderRewards(rewards) { rewardRows.innerHTML = ( rewards && rewards.length ? rewards : fallbackRewards ) .map(function (item) { var revenue = firstValue( item, [ 'opening_revenue', 'openingRevenue', 'threshold_coin_spent', 'thresholdCoinSpent', 'revenue', ], '500K' ); var reward = firstValue( item, ['reward_coins', 'rewardCoins', 'reward'], '50K' ); return [ '