'use client'; import './style.scss'; import { useState, useEffect } from 'react'; import { useSearchParams } from 'next/navigation'; import Image from 'next/image'; import { fetchApi } from '@/lib/utils/client'; import { Checkbox } from '@/components/ui/checkbox'; import { Label } from '@/components/ui/label'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faLink, faAlignLeft, faCalendarDays, faUsers, faVideo, faEye, faGlobe, } from '@fortawesome/free-solid-svg-icons'; import type { StudioSettingsResponse } from '@/types/response/studio/settings'; import YouTubeSignBoard from '@/public/resources/YouTube-signboard.svg'; export default function StudioSettingsPage() { const searchParams = useSearchParams(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [connecting, setConnecting] = useState(false); const [agreedTerms, setAgreedTerms] = useState(false); const [agreedYouTube, setAgreedYouTube] = useState(false); const [showDisconnect, setShowDisconnect] = useState(false); const [agreedDisconnect, setAgreedDisconnect] = useState(false); const [disconnecting, setDisconnecting] = useState(false); const connected = searchParams.get('connected') === 'true'; const errorParam = searchParams.get('error'); useEffect(() => { fetchApi('/api/studio/settings') .then(res => { if (res.data) setData(res.data); }) .catch(() => { setData({ isYouTubeConnected: false, channelName: null, handle: null, description: null, channelUrl: null, thumbnailUrl: null, bannerUrl: null, subscriberCount: 0, videoCount: 0, viewCount: 0, youTubePublishedAt: null }); }) .finally(() => setLoading(false)); }, []); const handleConnect = async () => { if (!agreedTerms || !agreedYouTube) { return; } setConnecting(true); try { const redirectUri = `${window.location.origin}/api/auth/youtube/callback`; const res = await fetchApi(`/api/studio/youtube-connect-url?redirectUri=${encodeURIComponent(redirectUri)}`); window.location.href = res.data!; } catch (err) { alert(err instanceof Error ? err.message : 'OAuth URL을 가져오지 못했습니다.'); setConnecting(false); } }; const handleDisconnectClick = () => { if (!window.confirm('YouTube 연동을 해지하시겠습니까?\n해지 시 후원 수신, 라이브 채팅 등의 서비스를 이용할 수 없습니다.')) { return; } setShowDisconnect(true); }; const handleDisconnect = async () => { if (!agreedDisconnect) return; setDisconnecting(true); try { await fetchApi('/api/studio/youtube-disconnect', { method: 'POST' }); alert('YouTube 연동이 해지되었습니다.'); window.location.replace('/studio/settings'); } catch (err) { alert(err instanceof Error ? err.message : '연동 해지에 실패했습니다.'); setDisconnecting(false); } }; const handleDisconnectCancel = () => { setShowDisconnect(false); setAgreedDisconnect(false); }; const handleAgreedDisconnectChange = (v: boolean|'indeterminate') => { setAgreedDisconnect(v === true); }; const isConnected = data?.isYouTubeConnected; const canConnect = agreedTerms && agreedYouTube; return (
{/* 페이지 헤더 */}

{!loading && isConnected ? '채널 정보' : '채널 설정'}

{loading &&

불러오는 중...

} {!loading && !isConnected && ( <> {errorParam && (
{errorParam === 'cancelled' ? '연결이 취소되었습니다.' : decodeURIComponent(errorParam)}
)}

YouTube 채널 연결이 필요합니다.

YouTube 채널을 연결하면 채널 이름, 설명, 시청자 링크 등 채널 정보를 자동으로 가져와 스트리밍과 후원 기능을 원활하게 사용할 수 있습니다.

  • 채널 정보 (이름, 설명, 썸네일)
  • 라이브 채팅 읽기/쓰기
  • 채널 멤버십 확인
setAgreedTerms(v === true)} />
setAgreedYouTube(v === true)} />
)} {!loading && isConnected && (
{connected && (
YouTube 채널이 성공적으로 연결되었습니다.
)} {/* 배너 */} {data?.bannerUrl && (
채널 배너
)} {/* 프로필 영역 */}
{data?.thumbnailUrl ? ( {data?.channelName ) : (
)}

{data?.channelName}

{data?.handle && {data.handle}} 구독자 {data?.subscriberCount.toLocaleString()}명 동영상 {data?.videoCount.toLocaleString()}개
{/* 상세 정보 */}
{data?.description && (
설명

{data.description}

)} {data?.channelUrl && (
채널 주소 {data.channelUrl}
)}
조회수 조회수 {data?.viewCount.toLocaleString()}회
{data?.youTubePublishedAt && (
가입일 {new Date(data.youTubePublishedAt).toLocaleDateString('ko-KR', { year: 'numeric', month: 'long', day: 'numeric' })}
)}
{data?.subscriberCount.toLocaleString()} 구독자
{data?.videoCount.toLocaleString()} 동영상
{data?.viewCount.toLocaleString()} 조회수
{/* 연동 해지 */} {!showDisconnect ? (

YouTube 연동을 해지하면 후원 수신, 라이브 채팅 등의 서비스를 이용할 수 없습니다.

) : (

YouTube 연동 해지

연동을 해지하면 아래 서비스를 더 이상 이용할 수 없습니다.

  • 후원 수신 (시청자로부터 후원을 받을 수 없습니다)
  • 라이브 채팅 읽기/쓰기
  • 채널 멤버십 확인
  • 채널 정보 자동 동기화
)}
)}
); } function YouTubeIcon() { return ( ); }