"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 (
DrawTogether Create Room

Join a room

Got a 6-character code? Drop it in.

setCode(e.target.value.toUpperCase())} className="input-text font-bold tracking-[8px] text-center text-2xl uppercase" placeholder="ABC123"/>
setNickname(e.target.value)} className="input-text" placeholder="Your name"/>
{AVATARS.map(a => ( ))}
{err &&
{err}
}
); }