"use client";
import { Suspense, useEffect, useState } from "react";
import { useRouter, useSearchParams } from "next/navigation";
import Link from "next/link";
import { getSocket } from "../lib/socket-client";
import { writeSession } from "../lib/store";
const AVATARS = ["🦄","🦊","🐼","🐸","🐱","🐶","🦁","🐯","🐰","🐻","🐨","🦝"];
export default function JoinRoomPage() {
return (
Loading...}>
);
}
function JoinRoomInner() {
const router = useRouter();
const search = useSearchParams();
const [code, setCode] = useState("");
const [nickname, setNickname] = useState("");
const [avatar, setAvatar] = useState("🐱");
const [busy, setBusy] = useState(false);
const [err, setErr] = useState("");
useEffect(() => {
const c = search?.get("code");
if (c) setCode(c.toUpperCase());
}, [search]);
const submit = (e: React.FormEvent) => {
e.preventDefault();
setErr("");
const cleanCode = code.trim().toUpperCase();
if (!cleanCode) { setErr("Enter a room code"); return; }
if (!nickname.trim()) { setErr("Pick a nickname"); return; }
setBusy(true);
const socket = getSocket();
const finish = () => {
socket.emit("room:join", { code: cleanCode, nickname: nickname.trim(), avatar }, (resp: any) => {
if (!resp || !resp.ok) { setErr(resp?.error || "couldn't join"); setBusy(false); return; }
writeSession(resp.code, { token: resp.sessionToken, nickname: nickname.trim(), avatar, playerId: resp.playerId });
router.push(`/room/${resp.code}`);
});
};
if (socket.connected) finish();
else socket.once("connect", finish);
};
return (
Join a room
Got a 6-character code? Drop it in.
);
}