'use client'; import { useState, useEffect, useCallback } from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { usePathname } from 'next/navigation'; import { ArrowLeft, Bell, Calculator, ChartLine, ChevronDown, ChevronsUpDown, CircleAlert, Coins, Gauge, Heart, Landmark, LogOut, FileText, Target, Trophy, User, Users, Wallet, } from 'lucide-react'; import { Sidebar as SidebarRoot, SidebarContent, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarGroup, SidebarGroupContent, useSidebar, } from '@/components/ui/sidebar'; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { fetchApi } from '@/lib/utils/client'; import type { StudioSettingsResponse } from '@/types/response/studio/settings'; export default function Sidebar() { const pathname = usePathname(); const { isMobile } = useSidebar(); const [channel, setChannel] = useState|null>(null); const isDonationPath = pathname.startsWith('/studio/donation'); const isWalletPath = pathname.startsWith('/studio/wallet'); const isSettlementPath = pathname.startsWith('/studio/settlement'); const readCookie = (key: string, fallback: boolean) => { if (typeof document === 'undefined') return fallback; const match = document.cookie.match(new RegExp(`(?:^|; )${key}=([^;]*)`)); if (!match) return fallback; return match[1] !== 'false'; }; const [donationOpen, setDonationOpen] = useState(() => readCookie('studio_menu_donation', true) || isDonationPath); const [walletOpen, setWalletOpen] = useState(() => readCookie('studio_menu_wallet', true) || isWalletPath); const [settlementOpen, setSettlementOpen] = useState(() => readCookie('studio_menu_settlement', true) || isSettlementPath); const saveCookie = useCallback((key: string, value: boolean) => { document.cookie = `${key}=${value}; path=/studio; max-age=${60 * 60 * 24 * 365}; SameSite=Lax`; }, []); const handleDonationToggle = useCallback((open: boolean) => { setDonationOpen(open); saveCookie('studio_menu_donation', open); }, [saveCookie]); const handleWalletToggle = useCallback((open: boolean) => { setWalletOpen(open); saveCookie('studio_menu_wallet', open); }, [saveCookie]); const handleSettlementToggle = useCallback((open: boolean) => { setSettlementOpen(open); saveCookie('studio_menu_settlement', open); }, [saveCookie]); const isActive = (href: string) => pathname === href || pathname.startsWith(href + '/'); useEffect(() => { fetchApi('/api/studio/settings') .then(res => { if (res.data) { setChannel(res.data); } }) .catch(() => {}); }, []); const isConnected = channel?.isYouTubeConnected === true; return ( {/* 상단 Studio 라벨 + 돌아가기 버튼 */}
Studio
{/* YouTube 채널 카드 */} {/* 아이콘 (collapse 시 이것만 표시) */}
{channel?.thumbnailUrl ? ( {channel.channelName ) : ( )} {/* 미연동 경고 뱃지 */} {channel !== null && !isConnected && ( )}
{/* 텍스트 (collapse 시 hidden) */}
{isConnected ? (channel?.channelName ?? '채널 이름') : '채널 미연동'} {isConnected ? (channel?.handle ?? '') : '채널을 연결해 주세요'}
{isConnected ? ( <> {channel?.channelName} 채널 정보 보기 ) : ( <> YouTube 채널이 연동되지 않았습니다 YouTube 연동하기 )}
{/* 대시보드 */} 대시보드 {/* 후원 설정 */} 후원 설정 알림 목표 순위 크루 {/* 지갑 */} 지갑 잔액 수익 출금 {/* 정산 */} 정산 계좌 관리 원천징수 내역
); }