1- import React from "react" ;
1+ // StartCodecast.jsx
2+ import React , { useState } from "react" ;
23import { FaArrowRight } from "react-icons/fa" ;
34import "./Codecast.css" ;
5+ import { useNavigate } from "react-router-dom" ;
6+ import { createRoom } from "./api/collab" ;
47
58const StartCodecast = ( ) => {
9+ const navigate = useNavigate ( ) ;
10+ const [ roomName , setRoomName ] = useState ( "" ) ;
11+ const [ roomCode , setRoomCode ] = useState ( "" ) ;
12+ const [ loading , setLoading ] = useState ( false ) ;
13+ const [ errMsg , setErrMsg ] = useState ( "" ) ;
14+
15+ const handleCreate = async ( ) => {
16+ setErrMsg ( "" ) ;
17+
18+ const token = localStorage . getItem ( "token" ) ;
19+ const username = localStorage . getItem ( "username" ) ;
20+ if ( ! token || ! username ) {
21+ setErrMsg ( "로그인이 필요합니다. 먼저 로그인해주세요." ) ;
22+ return ;
23+ }
24+ if ( ! roomName . trim ( ) ) {
25+ setErrMsg ( "방 이름을 입력해주세요." ) ;
26+ return ;
27+ }
28+
29+ try {
30+ setLoading ( true ) ;
31+ const data = await createRoom ( {
32+ token,
33+ name : roomName . trim ( ) ,
34+ // code: roomCode.trim() || undefined,
35+ } ) ;
36+
37+ const roomId = data . roomId ;
38+ // ✅ 쿼리스트링 rid로 입장 + state로 보조 정보 전달
39+ navigate ( `/broadcast/live?rid=${ encodeURIComponent ( roomId ) } ` , {
40+ state : {
41+ roomId,
42+ title : data . roomName || roomName . trim ( ) ,
43+ defaultSessionId : data . defaultSessionId || null ,
44+ ownerId : data . ownerId ,
45+ accessCode : roomCode . trim ( ) || null ,
46+ } ,
47+ } ) ;
48+ } catch ( err ) {
49+ console . error ( err ) ;
50+ setErrMsg (
51+ err . status === 401
52+ ? "로그인이 만료되었습니다. 다시 로그인해주세요."
53+ : err . message || "방 생성 중 오류가 발생했습니다."
54+ ) ;
55+ } finally {
56+ setLoading ( false ) ;
57+ }
58+ } ;
59+
660 return (
761 < div >
862 < section className = "broadcast-container" >
@@ -20,23 +74,27 @@ const StartCodecast = () => {
2074 type = "text"
2175 id = "roomName"
2276 placeholder = "방 이름을 입력하세요"
77+ value = { roomName }
78+ onChange = { ( e ) => setRoomName ( e . target . value ) }
2379 />
2480 </ div >
2581
2682 < div className = "start-input-group" >
27- < label > 방송 코드</ label >
83+ < label > 방송 코드 (선택) </ label >
2884 < input
2985 type = "text"
3086 id = "roomCode"
3187 placeholder = "방송 코드를 입력하세요 (선택사항)"
88+ value = { roomCode }
89+ onChange = { ( e ) => setRoomCode ( e . target . value ) }
3290 />
33- < p className = "help-text" >
34- 방송 코드는 다른 사용자가 방송에 참여할 때 사용됩니다.
35- </ p >
91+ < p className = "help-text" > 방송 코드는 다른 사용자가 방송에 참여할 때 사용됩니다.</ p >
3692 </ div >
3793
38- < button className = "start-btn" >
39- 방송 시작하기 < FaArrowRight />
94+ { errMsg && < p className = "error-text" > { errMsg } </ p > }
95+
96+ < button className = "start-btn" onClick = { handleCreate } disabled = { loading } >
97+ { loading ? "생성 중..." : < > 방송 시작하기 < FaArrowRight /> </ > }
4098 </ button >
4199 </ div >
42100 </ section >
0 commit comments