Newer
Older
PixelPaintWar / apps / client / src / scenes / lobby / LobbyScene.tsx
import type { roomTypes } from "@repo/shared";

type Props = {
  room: roomTypes.Room | null;
  myId: string | null;
  onStart: () => void;
};

export const LobbyScene = ({ room, myId, onStart }: Props) => {
  // ルーム情報到着前ローディング表示
  if (!room)
    return <div style={{ color: "white", padding: 40 }}>読み込み中...</div>;

  // 自身オーナー権限判定
  const isMeOwner = room.ownerId === myId;

  // ロビー画面本体
  return (
    <div
      style={{
        padding: 40,
        color: "white",
        background: "#222",
        height: "100vh",
        display: "flex",
        flexDirection: "column",
        alignItems: "center",
      }}
    >
      <h2 style={{ fontSize: "2rem", marginBottom: "20px" }}>
        ルーム: {room.roomId} (待機中)
      </h2>

      <div
        style={{
          margin: "20px 0",
          background: "#333",
          padding: "20px",
          borderRadius: "8px",
          width: "400px",
        }}
      >
        <h3
          style={{
            borderBottom: "1px solid #555",
            paddingBottom: "10px",
            margin: "0 0 10px 0",
          }}
        >
          参加プレイヤー ({room.players.length}/{room.maxPlayers})
        </h3>

        {/* 🌟 変更部分: ulタグにスクロール設定を追加 */}
        <ul
          style={{
            listStyle: "none",
            padding: 0,
            margin: 0,
            fontSize: "1.2rem",
            maxHeight:
              "300px" /* 🌟 リストの最大の高さを指定(これを超えるとスクロールになる) */,
            overflowY: "auto" /* 🌟 縦方向のスクロールを有効化 */,
            paddingRight:
              "10px" /* 🌟 スクロールバーと文字が被らないように右側に少し余白を確保 */,
          }}
        >
          {/* 参加プレイヤー一覧描画 */}
          {room.players.map((p: roomTypes.RoomMember) => (
            <li
              key={p.id}
              style={{
                margin: "15px 0",
                display: "flex",
                alignItems: "center",
                gap: "10px",
              }}
            >
              <span>{p.id === myId ? "🟢" : "⚪"}</span>
              <span style={{ fontWeight: p.id === myId ? "bold" : "normal" }}>
                {p.name}
              </span>
              {p.isOwner && <span style={{ fontSize: "0.9em" }}>👑</span>}
              {p.isReady && (
                <span style={{ marginLeft: "auto", fontSize: "0.9em" }}>
                  ✅
                </span>
              )}
            </li>
          ))}
        </ul>
      </div>

      <div style={{ marginTop: "20px" }}>
        {/* オーナー開始操作と待機表示の分岐 */}
        {isMeOwner ? (
          <button
            onClick={onStart}
            style={{
              padding: "15px 40px",
              fontSize: "1.5rem",
              cursor: "pointer",
              backgroundColor: "#4ade80",
              color: "#111",
              border: "none",
              borderRadius: "8px",
              fontWeight: "bold",
            }}
          >
            ゲームスタート
          </button>
        ) : (
          <div
            style={{
              padding: "15px 40px",
              fontSize: "1.5rem",
              backgroundColor: "#555",
              color: "#ccc",
              borderRadius: "8px",
            }}
          >
            ホストの開始を待っています...
          </div>
        )}
      </div>
    </div>
  );
};