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());
}
// ===================================