(function () { 'use strict'; const { Store, esc, chips } = App; const nameInput = document.getElementById('name'); const nameError = document.getElementById('name-error'); const listEl = document.getElementById('list'); const countEl = document.getElementById('count'); nameInput.value = Store.name; nameInput.addEventListener('input', () => { Store.name = nameInput.value.trim(); nameInput.classList.remove('invalid'); nameError.textContent = ''; }); function requireName() { if (Store.name) return true; nameInput.classList.add('invalid'); nameError.textContent = '先に名前を入力してください。'; nameInput.focus(); return false; } // 管理者だけにハンドレンジ学習・CPU戦のレビューへのリンクを出す(ページ自体もサーバ側で管理者以外は 404) App.api('GET', '/api/me') .then((me) => { document.getElementById('range-link').hidden = !me.admin; document.getElementById('review-link').hidden = !me.admin; }) .catch(() => {}); document.getElementById('create').addEventListener('click', () => { if (requireName()) location.href = '/create'; }); listEl.addEventListener('click', (e) => { const btn = e.target.closest('[data-join]'); if (btn && requireName()) location.href = '/table/' + encodeURIComponent(btn.dataset.join); }); const MODE_LABEL = { chips: '💰 キャッシュオンリー', friends: '🃏 友人戦', cpu: '🤖 CPU戦', review: '📝 レビュー付きCPU戦' }; function phaseBadge(t) { if (t.paused) return 'PAUSED'; if (t.phase === 'WAITING') return 'WAITING'; return 'PLAYING'; } function render(tables) { countEl.textContent = tables.length ? `${tables.length} テーブル` : ''; if (!tables.length) { listEl.innerHTML = '
開催中のテーブルはありません。
テーブルを作成して友達を招待しよう。
'; return; } listEl.innerHTML = tables .map((t) => { const full = t.playerCount >= t.maxSeats; const timer = t.timerEnabled ? `⏱ ${t.intervalMin}分` : '⏱ なし'; return `
${esc(t.name)}${phaseBadge(t)}
👤 ${t.playerCount}/${t.maxSeats} 開始 ${chips(t.startingStack)} Lv.${t.level} ${chips(t.smallBlind)}/${chips(t.bigBlind)} ${timer} ${MODE_LABEL[t.mode] || ''}
`; }) .join(''); } const socket = App.connectSocket(); socket.on('connect', () => socket.emit('lobby:subscribe')); socket.on('lobby:tables', render); })();