'use client'; import './style.scss'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { fetchApi } from '@/lib/utils/client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Checkbox } from '@/components/ui/checkbox'; export default function CrewJoinPage() { const router = useRouter(); const [inviteCode, setInviteCode] = useState(''); const [nickname, setNickname] = useState(''); const [consent, setConsent] = useState(false); const [processing, setProcessing] = useState(false); const [done, setDone] = useState(null); const handleJoin = async () => { if (processing) { return; } if (!inviteCode.trim()) { alert('초대 코드를 입력해 주세요.'); return; } if (!nickname.trim()) { alert('크루 안에서 사용할 별명을 입력해 주세요.'); return; } if (!consent) { alert('크루 방송 합류 동의가 필요합니다.'); return; } setProcessing(true); try { const res = await fetchApi<{ crewMemberID: number; crewName: string }>('/api/crew/join', { method: 'POST', body: { inviteCode: inviteCode.trim(), nickname: nickname.trim() } }); setDone(res.data?.crewName ?? '크루'); } catch (err) { alert(err instanceof Error ? err.message : '가입에 실패했습니다.'); } finally { setProcessing(false); } }; if (done) { return (

✅ 크루 가입이 완료되었습니다

{done} 크루의 크루원으로 등록되었습니다.
이제 해당 크리에이터의 크루 방송에 참여하실 수 있습니다.

); } return (

크루 합류

크리에이터로부터 받은 초대 코드를 입력해 크루에 합류합니다.
코드 입력 시 해당 크리에이터의 크루 방송 합류에 동의하는 것으로 처리됩니다.

setInviteCode(e.target.value)} placeholder="발급받은 초대 코드를 붙여 넣어 주세요" autoComplete="off" />
setNickname(e.target.value)} placeholder="크루 안에서 사용할 별명" maxLength={80} />
); }