11"use client" ;
22
3+ import { useState } from "react" ;
34import { useRouter } from "next/navigation" ;
45import { Button } from "@/components/ui/button" ;
5- import { useRoomContext } from "@/contexts/RoomContext" ;
66
77/**
88 * 홈 페이지 컴포넌트
9- * 방 생성 버튼을 제공하고 생성된 방으로 리다이렉트
9+ * 방 이름 입력을 통해 방 입장 (방이 없으면 자동 생성)
1010 */
1111export default function Home ( ) {
1212 const router = useRouter ( ) ;
13- const { createRoom } = useRoomContext ( ) ;
13+ const [ roomName , setRoomName ] = useState ( "" ) ;
14+ const [ error , setError ] = useState ( "" ) ;
1415
1516 /**
16- * 방 생성 및 리다이렉트 핸들러
17+ * 방 이름을 URL-safe 형식으로 변환
18+ * - 공백 → 하이픈
19+ * - 대문자 → 소문자
20+ * - 특수문자 제거 (영문 소문자, 숫자, 하이픈만 허용)
21+ * - 연속 하이픈 → 단일 하이픈
22+ * - 앞뒤 하이픈 제거
1723 */
18- const handleCreateRoom = ( ) => {
19- // 고유한 방 ID 생성
20- const roomId = createRoom ( ) ;
21- console . log ( "방 생성 완료, 리다이렉트:" , roomId ) ;
24+ const sanitizeRoomName = ( name ) => {
25+ return name
26+ . trim ( )
27+ . toLowerCase ( )
28+ . replace ( / \s + / g, "-" ) // 공백 → 하이픈
29+ . replace ( / [ ^ a - z 0 - 9 - ] / g, "" ) // 영문 소문자, 숫자, 하이픈만
30+ . replace ( / ^ - + | - + $ / g, "" ) // 앞뒤 하이픈 제거
31+ . replace ( / - + / g, "-" ) // 연속 하이픈을 하나로
32+ . substring ( 0 , 50 ) ; // 최대 50자
33+ } ;
34+
35+ /**
36+ * 방 입장 핸들러
37+ */
38+ const handleJoinRoom = ( ) => {
39+ setError ( "" ) ;
40+ const sanitized = sanitizeRoomName ( roomName ) ;
41+
42+ if ( sanitized . length < 3 ) {
43+ setError ( "방 이름은 최소 3자 이상이어야 합니다 (영문 소문자, 숫자, 하이픈만 가능)" ) ;
44+ return ;
45+ }
46+
47+ console . log ( `방 입장: ${ sanitized } ` ) ;
48+ router . push ( `/room/${ sanitized } ` ) ;
49+ } ;
2250
23- // 생성된 방 페이지로 이동
24- router . push ( `/room/${ roomId } ` ) ;
51+ /**
52+ * Enter 키 입력 핸들러
53+ */
54+ const handleKeyDown = ( e ) => {
55+ if ( e . key === "Enter" ) {
56+ handleJoinRoom ( ) ;
57+ }
2558 } ;
2659
2760 return (
@@ -35,10 +68,31 @@ export default function Home() {
3568 </ p >
3669 </ div >
3770
38- { /* 방 생성 버튼 */ }
39- < Button onClick = { handleCreateRoom } size = "lg" className = "text-lg px-8 py-6" >
40- 새 방 만들기
41- </ Button >
71+ { /* 방 입장 폼 */ }
72+ < div className = "w-full max-w-md space-y-4" >
73+ < div className = "space-y-2" >
74+ < label htmlFor = "roomName" className = "text-sm font-medium text-muted-foreground" >
75+ 방 이름 입력
76+ </ label >
77+ < input
78+ id = "roomName"
79+ type = "text"
80+ value = { roomName }
81+ onChange = { ( e ) => setRoomName ( e . target . value ) }
82+ onKeyDown = { handleKeyDown }
83+ placeholder = "my-meeting"
84+ className = "w-full px-4 py-3 rounded-lg border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
85+ />
86+ { error && < p className = "text-sm text-destructive" > { error } </ p > }
87+ < p className = "text-xs text-muted-foreground" >
88+ 💡 영문 소문자, 숫자, 하이픈만 사용 가능합니다
89+ </ p >
90+ </ div >
91+
92+ < Button onClick = { handleJoinRoom } size = "lg" className = "w-full text-lg py-6" >
93+ 방 입장하기
94+ </ Button >
95+ </ div >
4296
4397 { /* 기능 설명 */ }
4498 < div className = "grid grid-cols-1 md:grid-cols-3 gap-6 mt-12 max-w-4xl" >
0 commit comments