diff --git a/page/src/app/page.tsx b/page/src/app/page.tsx index 201b0e4..5efd49f 100644 --- a/page/src/app/page.tsx +++ b/page/src/app/page.tsx @@ -1,6 +1,8 @@ "use client"; import { useState } from "react"; +import { useSession } from "next-auth/react"; +import { ListMusic, X } from "lucide-react"; import TopNav from "@/components/layout/TopNav"; import LeftSidebar from "@/components/layout/LeftSidebar"; import MainContent from "@/components/player/MainContent"; @@ -12,11 +14,17 @@ import type { DiscordServer } from "@/types/music"; export type ViewMode = "SERVER_LIST" | "SERVER_DETAIL" | "SEARCH_RESULT"; export default function MusicPlayerLayout() { + const { status } = useSession(); const [viewMode, setViewMode] = useState("SERVER_LIST"); const [selectedServer, setSelectedServer] = useState(null); const [searchQuery, setSearchQuery] = useState(""); + // 모바일에서 대기열은 상시 컬럼이 아니라 오른쪽에서 밀려나오는 패널로 띄운다. + const [isQueueOpen, setIsQueueOpen] = useState(false); + + const isAuthed = status === "authenticated"; + // 서버를 고르기 전에는 재생/대기열이 의미가 없어, 화면을 차지하지 않게 숨긴다. + const showPlayback = isAuthed && !!selectedServer; - // 홈 버튼 클릭 시: 서버 목록(또는 상세)으로 복귀 const handleHome = () => { if (selectedServer) { setViewMode("SERVER_DETAIL"); @@ -27,29 +35,38 @@ export default function MusicPlayerLayout() { } }; - // 검색 실행 시 const handleSearch = (query: string) => { setSearchQuery(query); setViewMode("SEARCH_RESULT"); }; - // 서버 선택 시 const handleSelectServer = (server: DiscordServer) => { setSelectedServer(server); setViewMode("SERVER_DETAIL"); }; + const handleBackToServers = () => { + setViewMode("SERVER_LIST"); + setSelectedServer(null); + setSearchQuery(""); + setIsQueueOpen(false); + }; + return ( -
- + -
- - + {/* 좌측 사이드바: 보조 정보라 넓은 화면에서만 노출한다(모바일 공간 절약). */} + {showPlayback && ( + + )} + + - + + {showPlayback && ( + <> + {/* 모바일에서 대기열이 열렸을 때 뒤쪽을 덮는 배경(탭하면 닫힘) */} + {isQueueOpen && ( +
- + {showPlayback && ( + setIsQueueOpen((v) => !v)} + isQueueOpen={isQueueOpen} + /> + )} + + {/* 모바일 전용 대기열 열기 버튼: 플레이어바에도 있지만, 재생 전에도 접근할 수 있게 둔다. */} + {showPlayback && !isQueueOpen && ( + + )} + + {/* 모바일 패널 닫기 버튼(패널 위에 떠 있음) */} + {showPlayback && isQueueOpen && ( + + )}
); -} \ No newline at end of file +} diff --git a/page/src/components/layout/LeftSidebar.tsx b/page/src/components/layout/LeftSidebar.tsx index 6d2703b..326d0f9 100644 --- a/page/src/components/layout/LeftSidebar.tsx +++ b/page/src/components/layout/LeftSidebar.tsx @@ -1,20 +1,61 @@ "use client"; -import { ListMusic } from "lucide-react"; +import { ChevronLeft, Info, Server } from "lucide-react"; +import type { DiscordServer } from "@/types/music"; -export default function LeftSidebar() { +interface LeftSidebarProps { + selectedServer: DiscordServer | null; + onBackToServers: () => void; +} + +/** + * 좌측 보조 패널. 예전에는 안내 문구만 있는 죽은 공간이었어서, + * "지금 어느 서버를 조작 중인지"와 서버 전환 동선을 넣어 실제로 쓰이게 했다. + * 좁은 화면에서는 숨긴다(같은 정보가 본문/플레이어에 이미 있다). + */ +export default function LeftSidebar({ selectedServer, onBackToServers }: LeftSidebarProps) { return ( -