diff --git a/map4.js b/map4.js index 6fa1f23..6ab91e2 100644 --- a/map4.js +++ b/map4.js @@ -18,6 +18,7 @@ // =================================== // 変数 // =================================== +let allMembers = []; // ← 一度参加したメンバーは全員ここに保存 let currentGroup = ""; let currentUser = ""; let map; @@ -211,61 +212,58 @@ selfMarker.addTo(map); } // =================================== -// メンバー一覧(チカチカ完全防止版) +// メンバー一覧(永続保持版・チカチカゼロ) // =================================== function showMemberList(latestByDevice) { const list = document.getElementById("memberList"); - // 既存の
  • を deviceId => li に変換 - const exist = {}; - Array.from(list.children).forEach(li => { - exist[li.dataset.deviceId] = li; + // ① 新しい人を allMembers に追加(順番は固定) + Object.values(latestByDevice).forEach(row => { + if (!allMembers.some(m => m.device_id === row.device_id)) { + allMembers.push({ + device_id: row.device_id, + user_name: row.user_name + }); + } }); - // 今オンラインの人を処理 - Object.values(latestByDevice).forEach(row => { - const id = row.device_id; - const diff = (Date.now() - new Date(row.updated_at)) / 1000; - const online = diff < 6; + // ② allMembers の順番で表示する(位置が変わらない!) + allMembers.forEach(member => { + let li = list.querySelector(`li[data-id="${member.device_id}"]`); - let li = exist[id]; - + // 初登場なら li を作成 if (!li) { - // 初登場 → 新規作成(順番はそのまま追加:並び替えしない) li = document.createElement("li"); - li.dataset.deviceId = id; - li.className = "member-item"; + li.dataset.id = member.device_id; li.innerHTML = `
    `; - list.appendChild(li); } - // 色だけ変更(レイアウトに影響しない) - li.querySelector(".member-icon").style.background = - id === deviceId ? "#58c16b" : "#FFD700"; + // オンライン判定(いない場合はオフライン扱い) + const row = latestByDevice[member.device_id]; + const online = + row && + (Date.now() - new Date(row.updated_at)) / 1000 < 6; - // 名前更新 - li.querySelector(".member-name").textContent = row.user_name; + // テキスト更新 + li.querySelector(".member-name").textContent = member.user_name; - // オンライン/オフラインの文字だけ更新 + // 色(自分は緑、他人は黄) + const iconColor = + member.device_id === deviceId ? "#58c16b" : "#FFD700"; + li.querySelector(".member-icon").style.background = iconColor; + li.querySelector(".member-status").textContent = online ? "🟢" : "🔴"; - // クラスの変更(CSSで色のみ変化させる) li.classList.toggle("online", online); li.classList.toggle("offline", !online); - - // 処理済みの existing エントリを削除 - delete exist[id]; }); - - // もう存在しない人を削除 - Object.values(exist).forEach(li => li.remove()); } // ===================================